| T O P I C R E V I E W |
| fabrivero |
Posted - 14 January 2003 : 15:15:34 Volevo fare un programmino tanto per vedere se avevo capito l'uso delle funzioni, ecc..... Evidentemente c'? qualcosa che mi sfugge. Non riesco a trovare la causa dell'errore ("moveav vuole un numero come secondo argomento") nel seguente listato:
Function Main() return fmedia(10) Endfunction
function fmedia(n as Numeric) as Numeric return Moveav(Close, n) endfunction
|
| 7 L A T E S T R E P L I E S (Newest First) |
| fabrivero |
Posted - 15 January 2003 : 13:27:36 Io invece pensavo che anche i moduli fossero rieseguiti ....
Molto bene. Grazie ancora.
|
| SupportoTecnico |
Posted - 15 January 2003 : 13:03:05 Si esiste ed ? molto semplice.
Basta dichiarare una variabile di modulo. Infatti solo le variabili dichiarate all'interno della funzione vengono reinizializzate. Quelle all'esterno della funzione (magari messe in cima al modulo) mantengono il valore assegnatogli nei precedenti passaggi.
Esempio:
Dim plMedia As Numeric = 0
Function Main() Dim dMediaNow As Numeric Dim dMedia As Numeric
dMediaNow = MoveAv(Close, 10, "S") dMedia = dMediaNow - plMedia plMedia = dMediaNow
Return dMedia
EndFunction
|
| fabrivero |
Posted - 15 January 2003 : 12:45:12 in realt? lo potrei fare anche senza richiamare la stessa funzione. Il problema rimane perch? mi serve di sapere comunque il valore della funzione al passo di tempo precedente... Ossia devo capire come faccio a salvarlo su una variabile "esterna" al main che, se non sbaglio, viene eseguito per tutti i giorni. Mi spigo meglio con un esempio. Se non ho capito male se ho una funzione di questo tipo:
Function Main() return moveav(close,10) Endfunction
questa viene eseguita per OGNI giorno ossia se ho 100 giorni mi viene eseguita 100 volte. In questo caso qualsiasi valore salvo su una variabile, questo mi viene ri_inizializzato ad ogni chiamata.
Vorrei capire se c'? un modo per mantenere un dato valore (nell'esempio magari mi serve di salvare il valore della media per poi riutilizzarlo alla prossima chiamata) tra una chiamata ed un'altra esterno al main.
Mi basta sapere che esiste una funzione (tipo open nomefile for output as numfile) che mi fa scrivere su di un file di appoggio.
Grazie mille!
|
| SupportoTecnico |
Posted - 15 January 2003 : 10:57:57 Si ? vero l'esempio non ? corretto. Il motivo sta nel fatto che la limitazione ? stata introdotta successivamente senza ancora correggere il manuale. Comunque c'? un ripensamento per quanto riguarda questa cosa e stanno valutando se togliere o meno la limitazione
Non ? possibile per una funzione chiamare se stessa. Il motivo di questa limitazione ? che ovviamente si poteva incorrere nel classico loop infinito non tanto durante il debug ma durante l'esecuzione "in esterno" (per un indicatore ad esempio mentre viene disegnato nel grafico). Il problema comunque esiste tuttora con i cicli do until.
Quindi, dalla prossima versione si ? deciso di togliere la limitazione per le funzioni ricorsive, limitandoci eventualmente ad una segnalazione in fase di debug.
Comunque, per il momento, nel tuo caso penso che ti sia sufficiente l'uso di cicli "For" o "Do Until" o mi sbaglio?
|
| fabrivero |
Posted - 15 January 2003 : 10:14:36 Grazie!
A me aveva tratto in inganno il seguente esempio sull'Help:
Function Main ()
In pratica si riduce alla parola chiave Function e alla parola chiave Main che in questo caso fa le veci del nome della funzione. Non esistono argomenti (non avrebbe senso), come non esiste il tipo di dato che la funzione Main restituir?. Il motivo ? molto semplice: il tipo di dato della funzione "Main" dipende dal contesto del codice. Comunque generalmente sar? sempre un numero o un valore booleano.
Aggiorniamo quindi il nostro esempio:
Function Main () Dim MyNum As Numeric
'chiamiamo la funzione MC per calcolare la media delle chiusure 'che dividono che vanno da periodo 1 al 10
MyNum = MC (1, 10)
Return MyNum
EndFunction
Function MC (PP As Numeric, UP As Numeric) As Numeric
' questa funzione calcola la media delle chiusure che vanno da PP a UP
Dim I As Numeric = 0 ' qui il valore di default ? 0 Dim A As Numeric Dim S As String = "M"
I = UP - PP + 1
Return MoveAv(Close, I)
EndFunction
Volevo fare un'altra domanda se possibile: E' possibile utilizzare funzioni ricorsive? Ci? mi serviva per fare la media adattativa: M(t) = A(t)*M(t-1) + B(t)
Grazie ancora
|
| SupportoTecnico |
Posted - 14 January 2003 : 19:38:30 L'errore sta nel fatto che gli argomenti delle funzioni degli indicatori come appunto "MoveAv" come argomenti accettano solamente costanti, "array" di dati come Close, Open, high , low ecc ..., altre funzioni indicatore, Options (nei trading systems), e propriet? negli indicatori.
Nel tuo caso "n" ? vista come variabile. Devi pertanto mettere direttamente 10, oppure creare una propriet? e metterci il nome della propriet? come in questo esempio:
Property Period() As Numeric Range (1, 50) Default (10) EndProperty
Function Main() Return fMedia() EndFunction
Function fMedia() As Numeric Return MoveAv(Close, Period, "S") EndFunction
|
| fabrivero |
Posted - 14 January 2003 : 15:18:17 volevo solo aggiungere che si tratta di una prova per un nuovo indicatore.
|