Salve,
l’indicatore contenuto su Pro Real Time (AverageTrueRange[n](close)) viene calcolato come MEDIA SEMPLICE dei True Range del periodo scelto.
E’ possibile averne una versione dell’Average True Range calcolato come MEDIA ESPONENZIALE dei True Range?
Grazie,
Giordano
Lunedì posto il codice, così puoi modificarlo come vuoi.
Buongiorno, questo è il codice:
// ATR formula
//
// https://en.wikipedia.org/wiki/Average_true_range
// https://www.investopedia.com/terms/a/atr.asp
//
// Calculation of TR:
//
// The range of a day's trading is simply high − low {\displaystyle {\text{high}}-{\text{low}}} {\displaystyle {\text{high}}-{\text{low}}}.
// The true range extends it to yesterday's closing price if it was outside of today's range:
//
// MyTR = max(Range,max(abs (high − close[1]),abs (low − close[1])))
//
// The true range is the largest of the:
// Most recent period's high minus the most recent period's low
// Absolute value of the most recent period's high minus the previous close
// Absolute value of the most recent period's low minus the previous close
//
// Calculation of ATR (of P periods):
p = 10
MyTR = max(Range,max(abs(high - close[1]),abs(low - close[1])))
IF BarIndex < p THEN
MyATR = MyTR
ELSE
MyATR = ((MyATR[1] * (p - 1)) + MyTR) / p
ENDIF
RETURN MyATR
Però non c’è un riferimento specifico a nessuna media, è semplicemente la formula standard di calcolo.
Puoi modificarla come vuoi.
Ciao, e grazie per il riscontro.
In realtà, il riferimento alla MEDIA SEMPLICE c’è, ed è dopo “ELSE”: ((MyATR[1] * (p – 1)) + MyTR) / p
Non capisco molto il linguaggio (ecco perchè ti chiedo aiuto), ma direi che si tratta di una sommatoria di 10 osservazioni “diviso” 10 (quindi una media semplice).
Per ottenere una EMA (es. 21, come vorrei utilizzare io) si dovrebbe utilizzare questa formula:
Multiplo= 2 /(1+21)
EMA= ultimo prezzo chiusura x Multiplo + EMA(giorno precedente) x (1 – Multiplo)
….riesci a “tradurre” questa formula e utilizzarla nel codice precedente (al posto di quella “semplice”)?
Grazie!
Giordano
…forse bisogna aggiungere un riferimento alla EMA(giorno precedente).
Di fatto, in una successione di valori (in questo caso TrueRange), la MEDIA SEMPLICE dei primi 21 valori (nel caso di una EMA21) diventa la EMA(giorno precedente) da utilizzare nel calcolo della prima EMA21.
Quindi, la prima EMA21 è calcolabile solo alla chiusura del 22esimo giorno come: Prezzo chiusura (del 22esimo giorno) X Multiplo + SMA(dei primi 21 valori) X (1 – Multiplo)
Ce la facciamo?!
Grazie ancora,
Giordano
L’espressione
MyATR = ((MyATR[1] * (p - 1)) + MyTR) / p
non è esattamente la sommatoria dei valori precedenti, ma IL valore precedente moltiplicato per PERIODI-1, a cui viene aggiunto il valore attuale, dopodiché viene tutto diviso per i PERIODI.
Credo sia già una forma di calcolo esponenziale (o forse ponderato), perché se fosse una semplice sommatoria sarebbe:
MyATR = (summation[p - 1](MyATR[1]) + MyTR) / p
Una EMA è:
Periods = 20
Alpha = 2 / (Periods + 1)
IF BarIndex = 0 THEN
MyEMA = close
ENDIF
MyEMA = ((close - MyEMA) * Alpha) + MyEMA
IF MyEMA = 0 THEN
MyEMA = close
ENDIF
Return MyEMA AS "Ema"
Una EMA è:
|
|
Periods = 20
Alpha = 2 / (Periods + 1)
IF BarIndex = 0 THEN
MyEMA = close
ENDIF
MyEMA = ((close – MyEMA) * Alpha) + MyEMA
IF MyEMA = 0 THEN
MyEMA = close
ENDIF
Return MyEMA AS “Ema”
|
…questa è esattamente la formula che riportavo sopra (solo che è scomposta diversamente)!!
Prezzo chiusura (del 22esimo giorno) X Multiplo + SMA(dei primi 21 valori) X (1 – Multiplo)
— > close * Alpha + Ema*(1-Alpha) (sopra c’era la SMA perchè stavo parlando di come calcolare la PRIMA EMA di una seria)
—>close * Alpha + Ema – Ema * Alpha
–> (close – Ema) * Alpha + Ema (ovviamente le Ema in queste formule sono quelle note, del giorno prima)
Detto questo, fermo restando che al posto del prezzo di chiusura dobbiamo inserire l’ultimo True Range (visto che vogliamo una media esponenziale di True Range, e non di prezzi come nell’esempio sopra), come si può procedere per calcolare la media esponenziale a 21 periodi del True Range?
Del True Range abbiamo la definizione che hai riportato sopra…
E abbiamo anche la formula della sua media esponenziale: (UltimoTrueRange – EmaPrecedente) * (2/(1+21)) + EmaPrecedente
Quello che a me non riesce è “far girare” la cosa nel linguaggio della PRT… forse basta solo sostituire nella formala di EMA che hai postato la definizione di TrueRange a quella di prezzo (close)?
Grazie per l’aiuto,
Giordano
Scusa, ma se al posto di close inserisci la seguente riga, dovresti ottenere quello che cerchi, cioè l’ema del true range (scusa ma anche io sono poco pratico di codifiche). Roberto potrà confermare o meno, per sicurezza
MyTR = max(Range,max(abs(high - close[1]),abs(low - close[1])))
Se parte del codice che ho postato lo modifichiamo così, non va bene?
IF BarIndex < p THEN
MyATR = average[max(1,BarIndex),1](MyTR)
ELSE
MyATR = ((MyATR[1] * (p - 1)) + average[p,1](MyTR)) / p
ENDIF
in pratica calcoliamo semplicemente la media esponenziale di P periodi (o meno, quando < P) del TR e lo aggiungiamo ad ATR precedente ottenendo un ATR calcolato in modo esponenziale.
Scusa luxrun, ho visto il tuo post in ritardo.
Non sono un esperto di matematica (la programmazione ha più a che fare con la logica), però visto il calcolo della EMA (che mi sono ricreato semplicemente cercando la formula su internet) non credo la tua proposta renda il calcolo esponenziale.
Non sono sicuro neppure della mia, forse Neromaori potrà confermarlo, o meno.
La mia proposta non funziona, mi spiace aver contribuito in maniera erronea. Ho provato a montare i diversi pezzi dei codici di Roberto, ma neanche lì ho ottenuto risultati degni di nota. Lascio a voi commenti e soluzioni
Ciao a tutti, e grazie veramente per l’interessamento.
A livello matematico le proposte fornite sopra non sono medie esponenziali (manca per esempio il fattore di “lisciatura”, cioè il coefficiente “Alpha”).
Detto questo, ho ben chiaro la formula matematica per arrivare ad ottenere l’ATR (calcolato in maniera esponenziale, così come introdotta da Wilder) e la conferma può essere trovata qui:
https://school.stockcharts.com/doku.php?id=technical_indicators:average_true_range_atr
In definitiva, quello che vorrei che il linguaggio facesse per creare una ATR(esponenziale) a 21 periodi è:
- deve “capire” che i primi 20 True Range (a partire dalla candela n.1 in assoluto, la più a sinistra insomma), NON generano alcun ATR,
- che il primo ATR viene calcolato alla chiusura della 21esima candela ed è una MEDIA SEMPLICE dei primi 21 TR,
- che i successivi ATR vengono calcolati come: TR(del giorno appena chiuso) * Alpha + ATR (del giorno precedente) * (1- Alpha)
Alpha = 2/(1+p), quindi nel nostro caso = 2/(1+21) = 2/22
Non so se queste istruzioni possono bastare per creare il codice…spero di si!
Grazie ancora se vorrete provarci!
Neromaori
…come non detto…sono ritornato da capo alla prima risposta…in realtà quel tipo di formale è la stessa che ho riportato io (solo scomposta diversamente)…quindi è esponenziale…faccio qualche verifica ancora…