Author |
Topic  |
|
mrcstefy
Nuovo Utente
9 Posts |
Posted - 28 October 2004 : 07:46:44
|
Buon giorno, non ? quello che avevo in mente. Cio?, ho capito la sintassi del vostro codice ma: centrando la media mobile di mezzo periodo (ovvero spostandola indietro di mezzo periodo) alla fine rimane mezzo periodo scoperto.
In altri termini se l'ultimo valore calcolabile della media mobile ? retrocesso, nel nostro caso di 30 giorni allora gli ultimi 30 giorni saranno scoperti e non ci sar? alcuna media mobile da tracciare sopra il titolo. E allora suppongo che gli ultimi 30 giorni di indice siano uguali all'ultimo dato disponibile. Sostanzialmente nello storico dei dati devo considerare di aggiungere 30 giorni in + uguali all'ultima chiusura. E con Excel ? facile perch? copio per 30 volte in basso l'ultimo valore. Ma come si fa con Insider? Non riesco a capire. Grazie
|
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 28 October 2004 : 14:07:45
|
Le prossima volta aggiungi la replica al messaggio precedente senza creare un nuovo Topic altrimenti si perde il filo del discorso (parlo a favore degli altri utenti che magari possono trovare interessante l'argomento).
Un esempio di codice che dovrebbe fare ci? che dici ? il seguente:
Function Main() Dim mc30 As Numeric Dim mc60 As Numeric Dim dMyPos As Numeric Dim i As Numeric Dim dTot As Numeric
If (TotBar - CurrentBar >= 30) then mc60 = Moveav(Close, 60, "S", 0, - 30) else dMyPos = TotBar - CurrentBar dTot = Sum(Close, 30) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (30 - dMyPos) mc60 = dTot / 60 endif
If (TotBar - CurrentBar >= 15) then mc30 = Moveav(Close, 30, "S", 0, - 15) else dMyPos = TotBar - CurrentBar dTot = Sum(Close, 15) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (15 - dMyPos) mc30 = dTot / 30 endif
Return mc30 - mc60
EndFunction
|
 |
|
mrcstefy
Nuovo Utente
9 Posts |
Posted - 01 November 2004 : 16:17:35
|
Come potete capire sono proprio nuovo, nuovo, di forum e cose del genere, scusate a mia discolpa posso dirvi che avevo pensato anche agli altri utenti utilizzando sempre lo stesso titolo per i miei post. Visto la vostra disponibilit? continuo nelle mie delucidazioni. Applicando il vostro codice mi accorgo che funziona abbastanza bene, alcune cose non le ho capite anche se funzionano; avete scritto: If (TotBar - CurrentBar >= 30) then mc60 = Moveav(Close, 60, "S", 0, - 30) else dMyPos = TotBar - CurrentBar
dTot = Sum(Close, 30) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (30 - dMyPos)
mc60 = dTot / 60 endif
Non capisco che bisogno c?? della condizione : If (TotBar - CurrentBar >= 30) then
Che cos? interpreto Se (tutto il periodo ? il giorno attuale ? maggiore uguale a 30 allora calcola la media centrata mc60 = Moveav(Close, 60, "S", 0, - 30) altrimenti dMypos = tutto il periodo ? il giorno attuale
e della parte successiva che suppongo serva per riempire i giorni mancanti, potrei avere la spiegazione
dTot = Sum(Close, 30) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (30 - dMyPos)
mc60 = dTot / 60
poi c?? l?altra parte che si ripete ed infine rimane: Return mc30-mc60 A questo punto plottando su un grafico ho un andamento abbastanza attinente ad un ciclo. Ora vorrei sottrarre ad ogni valore trovato di mc30-mc60 il suo precedente e cio? calcolare la velocit?. Ho provato a procedere senza ottenere alcun risultato in questo modo:
(alla fine del codice che riporto completo per tutti ho inserito un'altra variabile)
Function Main() Dim mc30 As Numeric Dim mc60 As Numeric Dim dMyPos As Numeric Dim i As Numeric Dim dTot As Numeric
If (TotBar - CurrentBar >= 30) then mc60 = Moveav(Close, 60, "S", 0, - 30) else dMyPos = TotBar - CurrentBar
dTot = Sum(Close, 30) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (30 - dMyPos)
mc60 = dTot / 60 endif
If (TotBar - CurrentBar >= 15) then mc30 = Moveav(Close, 30, "S", 0, - 15) else dMyPos = TotBar - CurrentBar
dTot = Sum(Close, 15) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (15 - dMyPos)
mc30 = dTot / 30 endif
in questo punto elimino (Return mc30 - mc60) e lo sostituisco con dim intermedio as Numeric intermedio = mc30 - mc60 return intermedio - (1) ( in questo punto voglio dirgli sottrai ad ogni valore d?intermedio il suo precedente EndFunction
Grazie a tutti
|
 |
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 01 November 2004 : 17:13:30
|
Il pezzo di codice:
If (TotBar - CurrentBar >= 30) then mc60 = Moveav(Close, 60, "S", 0, - 30) else dMyPos = TotBar - CurrentBar
dTot = Sum(Close, 30) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (30 - dMyPos)
mc60 = dTot / 60 endif
? tutto assieme. L'If serve per calcolare la media mobile semplice nel modo tradizionale (usando cio? l'apposita funzione) fino a che ci sono periodi disponibili altrimenti la si calcola "a mano" aggiungendo i periodi mancanti.
Infatti:
dTot = Sum(Close, 30) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (30 - dMyPos) mc60 = dTot / 60
non fa altro che calcolare la media mobile semplice a 60 giorni.
Il codice che hai scritto alla fine:
dim intermedio as Numeric intermedio = mc30 - mc60 return intermedio - (1)
sottrae 1 al valore di "intermedio", quindi non fa quello che vuoi tu.
Per fare ci? che desideri ci sono diversi modi. Uno di questi potrebbe essere:
Dim dMemIntermedio As Numeric = 0
Function Main() Dim mc30 As Numeric Dim mc60 As Numeric Dim dMyPos As Numeric Dim i As Numeric Dim dTot As Numeric Dim dResult As Numeric
If (TotBar - CurrentBar >= 30) then mc60 = Moveav(Close, 60, "S", 0, - 30) else dMyPos = TotBar - CurrentBar
dTot = Sum(Close, 30) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (30 - dMyPos)
mc60 = dTot / 60 endif
If (TotBar - CurrentBar >= 15) then mc30 = Moveav(Close, 30, "S", 0, - 15) else dMyPos = TotBar - CurrentBar
dTot = Sum(Close, 15) For i = 1 to dMyPos dTot = dTot + Close(i) next i dTot = dTot + Close(dMyPos) * (15 - dMyPos)
mc30 = dTot / 30 endif
dResult = ((mc30 - mc60) - dMemIntermedio) dMemIntermedio = mc30 - mc60
Return dResult
EndFunction
|
 |
|
|
Topic  |
|
|
|