Author |
Topic |
|
andrealucidi
Nuovo Utente
4 Posts |
Posted - 07 September 2008 : 14:03:21
|
Buongiorno, dovrei risolvere questo tipo di problema: come calcolare il valore medio e la deviazione standard della differenza di due medie mobili, più in generale non riesco a comprendere la logica di indirizzamento di un array dati tipo Moveav, ad esempio come è possibile estrarre un singolo valore numerico facente riferiemento ad un determinato bin ? In particolare mi interessa calcolare la media e Std della variabile Veloc EMA0 = ((Moveav(High, Durata, "E", 0) + Moveav(Low, Durata, "E", 0)) / 2) EMA3 = ((Moveav(High, Durata, "E", 0, 2) + Moveav(Low, Durata, "E", 0, 2)) / 2) Veloc = (EMA3 - EMA0) / 3
Grazie !
|
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 07 September 2008 : 18:37:40
|
Le funzioni dati ed indicatori funzionano in questo modo:
- Se utilizzate in espressioni l'inteprete del linguaggio prende il valore del periodo in elaborazione (quindi un valore singolo)
- Se utilizzate come argomenti di una funzione, l'interprete passa alla funzione tutta la serie dati (quindi NON un singolo valore).
- Se desideri un determinato valore della serie dati allora devi utilizzare la funzione "Value". A questa funzione viene passato l'array dati e l'offset rispetto al periodo in elaborazione. In pratica, se vuoi il valore della media mobile del periodo precedente devi scrivere:
Value(MoveAve(..parametri vari..), -1)
----------------
Per risolvere invece il tuo problema e calcolare la deviazione standard ti suggerisco di costruire un indicatore utente con il codice da te scritto in questo post. L'indicatore utente alla fine sarà ovviamente il valore di Veloc.
Una volta creato l'indicatore, puoi usare la funzione stdev per calcolarne la deviazione standard.
|
|
|
andrealucidi
Nuovo Utente
4 Posts |
Posted - 13 September 2008 : 17:42:12
|
Il calcolo della devizione standard e del valore medio lo vorrei calcolare come se Veloc fosse un variabile alatoria discrera ( campionata daily) e conseguentemente come risultato vorrei ottenere due valori numerici il valore medio e la deviazione standard della variabile Veloc. L'equivalente in excel viene fatto con le funzioni MEDIA e DEV.ST
Grazie per il supporto! |
|
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 13 September 2008 : 20:44:17
|
Appunto e dove sta il problema? Facendo come ti ho suggerito ottieni proprio quello che vuoi tu! |
|
|
andrealucidi
Nuovo Utente
4 Posts |
Posted - 15 September 2008 : 23:24:45
|
Ok mi torna !
L'obiettivo del mio indicatore, del calcolo del valore medio e della devizione standard è quello di definire due soglie (due bande) e successivamente normalizzare la variabile Veloc quando supera la soglia inferiore e superiore al valore delle soglie stesse. Il codice di seguito riportato, però, ha problemi nel gestire l'indicatore Velocity3 (ex Veloc) dopo l'utilizzo della funzione Stdev, infatti, impiegando un' opportuna Return ho notato che il codice non restituisce tutti i valori di Velocity3 ma soltanto l'ultimo. , conseguentemente gli if successivi non vengono eseguiti correttamente
Function Main() Dim Media As Numeric Dim St As Numeric Dim SogliaL As Numeric Dim SogliaH As Numeric Media = sum(Velocity3, TotBar) / TotBar St = Stdev(Velocity3, TotBar) SogliaL = Media - St SogliaH = Media + St
if (Velocity3 > SogliaH) then if (Velocity3 < SogliaL) Return Velocity3 else if (Velocity3 >= SogliaH) then Return SogliaH else if (Velocity3 <= SogliaL) Return SogliaL endif endif endif endif
Endfunction
Cosa c'è di sbagliato e quale può essere la possibile alternativa? |
|
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 16 September 2008 : 00:47:25
|
Il problema sta sicuramente su queste due righe:
Media = sum(Velocity3, TotBar) / TotBar St = Stdev(Velocity3, TotBar)
Non so cosa tu voglia calcolare esattamente ma il modo in cui hai calcolato la Media per me non ha senso.
In pratica, in italiano hai scritto: - calcolami la somma di tutti i valori di Velocity3 degli ultimi totbar periodi e poi dividili per totbar periodi.
Considerando che:
- TotBar è il numero totale di periodi della serie storica del titolo (tutti dal primo all'ultimo)
- che se i periodi precedenti al periodo in elaborazione sono meno di totbar (e cioè praticamente sempre), la somma verrà fatta con i periodi disponibili.
In pratica, supponendo di avere 1000 periodi e che il periodo in elaborazione sia ad esempio il decimo avrai la somma di velocity3 dei primi 9 periodi diviso 1000. Non ha senso!
Non è che volevi usare CurrentBar ?
|
|
|
andrealucidi
Nuovo Utente
4 Posts |
Posted - 16 September 2008 : 11:20:40
|
Il mio obiettivo e quello di calcolare il valore medio di un vettore inteso come la media dell' array costituito da tutti gli N elementi, il risultato che mi aspetto è un numero reale, e non un array campionato daily. Se utilizzassii CurrentBar avrei come risultato un array delle medie calcolate di volta in volta sul vettore passato come argomento.
Con riferimento al linguaggio di programmazione C l'indicatore Velocity3 non è un numero ma un array di numeri reali campionato daily e la media calcolato su tutti gli elementi del vettore sarebbe la sommatoria di tutti gli elementi dell'array diviso la lunghezza dell'array stesso e il risultato è un tipo real
Spero di essere riuscito a spiegare il mio problema.
|
|
|
SupportoTecnico
Forum Admin
1261 Posts |
Posted - 16 September 2008 : 13:11:08
|
Allora non puoi utilizzare la funzione SUM.
Devi utilizzare un paio di cicli for:
For i = 0 to CurrentBar - 1 Media = Media + value(Velocity3, -i) Next i For i = CurrentBar + 1 to TotBar Media = Media + value(Velocity3, i - CurrentBar) Next i Media = Media / TotBar
Purtroppo al momento non c'è una funzione che ti restituisce il valore di un periodo preciso.. la funzione value ci permette di indicare un offset rispetto alla posizione attuale (currentbar).
|
|
|
|
Topic |
|