EXPONENTIAL Average True Range

Viewing 15 posts - 1 through 15 (of 18 total)
  • Author
    Posts
  • #144044 quote
    Neromaori
    Participant
    New

    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

    #144045 quote
    robertogozzi
    Moderator
    Master

    Lunedì posto il codice, così puoi modificarlo come vuoi.

    #144166 quote
    Neromaori
    Participant
    New

    Grazie!!!

    #144167 quote
    robertogozzi
    Moderator
    Master

    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.

    #144302 quote
    Neromaori
    Participant
    New

    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

    #144312 quote
    Neromaori
    Participant
    New

    …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

    #144315 quote
    robertogozzi
    Moderator
    Master

    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
    #144316 quote
    robertogozzi
    Moderator
    Master

    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"
    #144338 quote
    Neromaori
    Participant
    New

    Una 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

    #144346 quote
    luxrun
    Participant
    Master

    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])))
    #144423 quote
    robertogozzi
    Moderator
    Master

    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.

    #144425 quote
    robertogozzi
    Moderator
    Master

    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.

    #144442 quote
    luxrun
    Participant
    Master

    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

    robertogozzi thanked this post
    #144605 quote
    Neromaori
    Participant
    New

    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 è:

    1. 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,
    2. che il primo ATR viene calcolato alla chiusura della 21esima candela ed è una MEDIA SEMPLICE dei primi 21 TR,
    3. 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

    #144606 quote
    Neromaori
    Participant
    New

    …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…

Viewing 15 posts - 1 through 15 (of 18 total)
  • You must be logged in to reply to this topic.

EXPONENTIAL Average True Range


ProBuilder: Indicatori & Strumenti Personalizzati

New Reply
Author
Summary

This topic contains 17 replies,
has 3 voices, and was last updated by robertogozzi
5 years, 6 months ago.

Topic Details
Forum: ProBuilder: Indicatori & Strumenti Personalizzati
Language: Italian
Started: 09/12/2020
Status: Active
Attachments: No files
Logo Logo
Loading...