Buongiorno, questo è il codice:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
// ATR formula
//
//
// 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.
Azzarderei che quello che non torna in questa formula è il modo in cui calcola l’ATR nei primi p periodi…bisognerebbe che le righe 21 e 22 “dicessero” che i primi 20 giorni non c’è calcolo di ATR e che al 21esimo giorno l’ATR è una media semplice dei primi 21 TR…
Ok, credo di avercela fatta.
Il valore restituito è lo stesso che mi da it.tradingview.com (che permette di scegliere la tipologia di media da usare per il calcolo dell’ATR):
atrperiods = p
alpha = 2/(1+atrperiods)
MyTR = max(Range,max(abs(high – close[1]),abs(low – close[1])))
IF BarIndex < (atrperiods+1) THEN
MyATR = Average[atrperiods](MyTR)
ELSE
MyATR = ((MyTR-MyATR[1])*alpha)+MyATR[1]
ENDIF
RETURN MyATR
Grazie