Cosa è l’ATR e Perché Il “Range” Normale Non Basta
J. Welles Wilder Jr. ha sviluppato l’ATR nel 1978, pubblicandolo nel suo libro New Concepts in Technical Trading Systems — lo stesso libro che ha introdotto RSI, Parabolic SAR e ADX. L’intuizione di Wilder era semplice ma geniale: il range di una barra (High − Low) non cattura tutta la volatilità del mercato, perché ignora i gap e i movimenti avvenuti dalla chiusura della barra precedente.
Considera questo scenario su XAUUSD H4: la barra precedente chiude a 3.200$. La barra corrente ha un High di 3.215$ e un Low di 3.205$. Il range classico è 3.215 − 3.205 = 10$. Ma il mercato in realtà si è mosso di 15$ rispetto alla chiusura precedente (da 3.200$ al High di 3.215$). Il range classico non cattura questo movimento.
Wilder ha risolto questo problema con il True Range: il massimo tra tre misure.
Formula del True Range — La Definizione Completa
TRUE RANGE (TR) = max(
|High_corrente - Low_corrente|, // Range normale della barra
|High_corrente - Close_precedente|, // Distanza dall'High alla chiusura prec.
|Low_corrente - Close_precedente| // Distanza dal Low alla chiusura prec.
)
ESEMPIO PRATICO XAUUSD H4:
Chiusura barra precedente: 3.200,00 $
High barra corrente: 3.215,20 $
Low barra corrente: 3.198,50 $
Misura 1: |3.215,20 - 3.198,50| = 16,70 $ ← Range normale
Misura 2: |3.215,20 - 3.200,00| = 15,20 $ ← Distanza High da close prec.
Misura 3: |3.198,50 - 3.200,00| = 1,50 $ ← Distanza Low da close prec.
TRUE RANGE = max(16,70 ; 15,20 ; 1,50) = 16,70 $
ESEMPIO CON GAP (dove TR differisce dal Range normale):
Chiusura precedente (venerdì): 3.200,00 $
Open lunedì (gap up): 3.230,00 $
High lunedì: 3.245,00 $
Low lunedì: 3.228,00 $
Misura 1: |3.245 - 3.228| = 17,00 $ ← Range normale (ignora il gap!)
Misura 2: |3.245 - 3.200| = 45,00 $ ← Distanza dall'apertura al close prec.
Misura 3: |3.228 - 3.200| = 28,00 $ ← Low distante dalla chiusura prec.
TRUE RANGE = max(17 ; 45 ; 28) = 45,00 $
Range normale avrebbe dato solo 17,00 $ — errore del 62% sulla volatilità reale
Il True Range cattura il gap perché include la distanza dal Low (o dall’High) della barra corrente alla chiusura della barra precedente. Il range classico avrebbe ignorato completamente il gap del weekend, sottostimando gravemente la volatilità reale vissuta dal trader che aveva posizioni aperte.
Il Calcolo dell’ATR: La Media Mobile Esponenziale di Wilder
L’ATR(14) non è una semplice media aritmetica degli ultimi 14 True Range. Usa una media mobile esponenziale specifica di Wilder — più efficiente computazionalmente e con caratteristiche di smoothing particolari. Capire questa distinzione è fondamentale per interpretare correttamente l’ATR e per riconciliare i valori che calcoli manualmente con quelli che vedi su MT5.
Formula ATR Completa — Wilder Smoothing
PASSO 1: Prima ATR (14 barre iniziali)
ATR_iniziale = media aritmetica dei primi 14 True Range
ATR_iniziale = (TR_1 + TR_2 + ... + TR_14) / 14
PASSO 2: ATR successivi (formula ricorsiva di Wilder)
ATR_n = (ATR_{n-1} × 13 + TR_n) / 14
oppure equivalentemente:
ATR_n = ATR_{n-1} - (ATR_{n-1} / 14) + TR_n / 14
ATR_n = ATR_{n-1} × (1 - 1/14) + TR_n × (1/14)
ATR_n = ATR_{n-1} × (13/14) + TR_n × (1/14)
CONFRONTO con EMA classica (alpha = 2/(n+1)):
EMA standard(14): alpha = 2/15 = 0,1333
Wilder EMA(14): alpha = 1/14 = 0,0714
→ Il Wilder smoothing è PIÙ LENTO dell'EMA classica a parità di periodo.
→ Reagisce ai picchi di volatilità con più ritardo.
→ Questo è INTENZIONALE: Wilder voleva un indicatore stabile, non reattivo.
ESEMPIO NUMERICO (XAUUSD H4, 5 barre):
TR: 18.2, 22.5, 15.8, 31.4, 19.7, 24.1, 16.3, 20.8, 28.5, 17.2,
21.6, 19.3, 25.7, 22.1 (prime 14 barre per ATR iniziale)
ATR_14 = (18.2+22.5+15.8+31.4+19.7+24.1+16.3+20.8+28.5+17.2+21.6+19.3+25.7+22.1) / 14
ATR_14 = 303.2 / 14 = 21,66 $
Barra 15: TR = 26,4
ATR_15 = (21,66 × 13 + 26,4) / 14 = (281,58 + 26,4) / 14 = 307,98 / 14 = 22,00 $
Barra 16: TR = 12,8 (barra tranquilla)
ATR_16 = (22,00 × 13 + 12,8) / 14 = (286,0 + 12,8) / 14 = 298,8 / 14 = 21,34 $
La natura ricorsiva del calcolo significa che MT5 deve avere sufficienti barre storiche per calcolare un ATR affidabile. Con solo 14 barre, hai solo il primo valore grezzo. Con 200 barre il valore è completamente stabilizzato. Oracle usa LOOKBACK_MAX = 500 per garantire valori ATR perfettamente stabili.
ATR su Diversi Timeframe: Come Cambia il Valore
L’ATR dipende fortemente dal timeframe. Un ATR(14) su M15 di XAUUSD darà un valore completamente diverso da un ATR(14) su H4 o D1. Per usare l’ATR correttamente nei calcoli di stop loss, è fondamentale sapere a quale timeframe stai lavorando e quale è il “range tipico” per quello strumento su quel timeframe.
| Strumento | Timeframe | ATR(14) medio tipico | ATR in pips | Uso per SL (×2,5 ATR) |
|---|---|---|---|---|
| XAUUSD (Oro) | M15 | $3,50–$6,00 | 35–60 pips | $8,75–$15,00 |
| XAUUSD (Oro) | H4 | $18,00–$35,00 | 180–350 pips | $45–$87 |
| XAUUSD (Oro) | D1 | $35,00–$65,00 | 350–650 pips | $87,5–$162 |
| EURUSD | H4 | 0,0040–0,0070 | 40–70 pips | 100–175 pips |
| USDJPY | H4 | 0,45–0,80 | 45–80 pips | 112–200 pips |
| BTCUSD | H4 | $800–$2.500 | — | $2.000–$6.250 |
Perché l’ATR cambia nel tempo sullo stesso strumento
Anche su uno stesso strumento e timeframe, l’ATR non è costante. La volatilità tende a essere ciclica: periodi di bassa volatilità (consolidamento, range stretto) alternano periodi di alta volatilità (breakout, eventi macro). Su XAUUSD H4, l’ATR(14) nel periodo 2020-2021 (COVID, stimoli monetari, inflazione) era mediamente 45–60$. Nel 2023 (mercato più stabile) era sceso a 18–25$.
Questa variabilità è esattamente il motivo per cui lo stop loss ATR-based è superiore allo stop loss fisso: si adatta automaticamente alle condizioni di mercato. Quando la volatilità è alta, il tuo stop diventa più largo per non essere colpito dal “rumore” normale. Quando è bassa, si stringe per ottimizzare il risk/reward.
I Tre Usi Principali dell’ATR nel Trading Sistematico
Uso 1: Stop Loss Dinamico Adattivo
Questo è l’utilizzo più diffuso e più robusto statisticamente. Invece di uno stop loss fisso (es. 30 pip sempre), usi un multiplo dell’ATR corrente. Il vantaggio: il tuo stop si adatta automaticamente alla volatilità del momento senza richiedere aggiustamenti manuali.
Stop Loss ATR-Based — Calcolo e Ottimizzazione
FORMULA STOP LOSS ATR: SL_distanza = Multiplo × ATR(14, timeframe_operativo) DOVE POSIZIONARE LO STOP: Long: SL = Entry_price - (Multiplo × ATR) Short: SL = Entry_price + (Multiplo × ATR) OTTIMIZZAZIONE DEL MULTIPLO su XAUUSD H4 (dati Oracle 2009-2026): Multiplo | Trades colpiti | WR finale | EV finale | Commento ---------------------------------------------------------------------- 0,5×ATR | 73% | 29,2% | -0,130R | Troppo stretto, rumore normale 1,0×ATR | 58% | 36,8% | +0,214R | Ancora troppo stretto 1,5×ATR | 47% | 40,1% | +0,503R | Buono 2,0×ATR | 41% | 41,8% | +0,632R | Ottimo 2,5×ATR | 37% | 42,1% | +0,684R | ← ORACLE — punto ottimale 3,0×ATR | 32% | 42,3% | +0,718R | Marginalmente meglio 3,5×ATR | 27% | 41,9% | +0,685R | EV plateau 4,0×ATR | 22% | 41,1% | +0,622R | Inizia a scendere CONCLUSIONE: il multiplo ottimale su XAUUSD H4 con Oracle è 2,5×ATR. Il plateau si estende da 2,5 a 3,5× — area di robustezza del sistema. Sotto 1,5× il rumore normale del mercato colpisce lo stop troppo spesso. Sopra 3,5× i profitti non compensano le perdite più grandi quando si sbaglia. ESEMPIO OPERATIVO ATTUALE (XAUUSD H4, aprile 2026): ATR(14) corrente: $28,50 Entry long a: $3.228,00 Stop Loss: $3.228,00 - (2,5 × $28,50) = $3.228,00 - $71,25 = $3.156,75 Take Profit (RR 1:3): $3.228,00 + (3 × $71,25) = $3.228,00 + $213,75 = $3.441,75
Uso 2: Position Sizing con ATR (Risk per Pip Normalizzato)
Combinare ATR e fixed fractional position sizing produce un sistema completamente adattivo: la dimensione della posizione si aggiusta sia al capitale corrente che alla volatilità corrente del mercato. Nei periodi ad alta volatilità, le posizioni diventano più piccole. Nei periodi tranquilli, crescono proporzionalmente. Questo produce un profilo di rischio molto più stabile nel tempo.
// Position sizing completamente adattivo: capitale × volatilità
// Rischi sempre 1% del capitale indipendentemente dalla volatilità ATR
double CalcolaLottiATR(double rischioPercento)
{
// 1. Leggi ATR corrente
int handleATR = iATR(_Symbol, PERIOD_H4, 14);
double atrBuffer[];
ArraySetAsSeries(atrBuffer, true);
CopyBuffer(handleATR, 0, 0, 1, atrBuffer);
double atrCorrente = atrBuffer[0];
if(atrCorrente <= 0) return(0.0);
// 2. Stop loss come multiplo ATR
double stopDistanzaUSD = 2.5 * atrCorrente; // 2.5× ATR
// 3. Stop in pips (1 pip XAUUSD = $0.10)
double stopPips = stopDistanzaUSD / SymbolInfoDouble(_Symbol, SYMBOL_POINT) / 10;
// 4. Rischio in USD
double capitaleEUR = AccountInfoDouble(ACCOUNT_BALANCE);
double eurusd = SymbolInfoDouble("EURUSD", SYMBOL_BID);
double rischioUSD = capitaleEUR * eurusd * (rischioPercento / 100.0);
// 5. Valore pip per lotto 1.0 su XAUUSD
double valorePipLotto = 10.0; // $10 per pip per lotto 1.0
// 6. Lotti finali
double lotti = rischioUSD / (stopPips * valorePipLotto);
// 7. Arrotondamento al lotto minimo
double lottoStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lotti = MathFloor(lotti / lottoStep) * lottoStep;
Print("ATR: ", DoubleToString(atrCorrente, 2),
" | Stop: ", DoubleToString(stopDistanzaUSD, 2), " USD",
" | Lotti: ", DoubleToString(lotti, 2));
return(lotti);
}
// Con ATR = $28,50 e capitale €10.000:
// Rischio = €100 × 1.1714 = $117,14
// Stop = 2.5 × 28,50 = $71,25 → 712,5 pips
// Lotti = 117,14 / (712,5 × 10) = 117,14 / 7125 = 0.016 lotti
// → Posizione di 0.02 lotti (arrotondato al minimo 0.01)
Uso 3: Filtro di Volatilità per Evitare Mercati “Morti”
Un sistema di trading può performare bene in mercati normali ma produrre segnali pessimi in fasi di volatilità estrema (troppo alta o troppo bassa). L’ATR come filtro permette di bloccare automaticamente l’apertura di nuove posizioni quando le condizioni di mercato sono anomale.
// Filtro di volatilità basato su ATR: evita mercati morti o in esplosione
// Calcola il rapporto ATR_corrente / ATR_medio_100_barre
bool FiltroATRok()
{
double atrBuffer[];
ArraySetAsSeries(atrBuffer, true);
int handle = iATR(_Symbol, PERIOD_H4, 14);
if(CopyBuffer(handle, 0, 0, 100, atrBuffer) < 100) return(false);
double atrCorrente = atrBuffer[0];
// Media ATR sulle ultime 100 barre H4
double somma = 0;
for(int i = 0; i < 100; i++) somma += atrBuffer[i];
double atrMedio = somma / 100.0;
if(atrMedio <= 0) return(false);
double rapporto = atrCorrente / atrMedio;
// Filtro: opera solo se ATR corrente è tra 50% e 250% dell'ATR medio
// Sotto 50%: mercato morto (spread alto relativo, poca direzionalità)
// Sopra 250%: esplosione di volatilità (news, eventi, spread allargato)
if(rapporto < 0.50)
{
Print("ATR troppo basso (", DoubleToString(rapporto, 2), "× media) — skip");
return(false);
}
if(rapporto > 2.50)
{
Print("ATR troppo alto (", DoubleToString(rapporto, 2), "× media) — skip");
return(false);
}
return(true); // Condizioni di volatilità normali → procedi col segnale
}
// Utilizzo in OnTick():
void OnTick()
{
if(!IsNewBar(PERIOD_H4)) return; // Solo su nuova barra H4
if(!FiltroATRok()) return; // Filtro volatilità
// ... calcola segnale e apri posizione
}
ATR vs Altre Misure di Volatilità: Quando Usare Quale
L’ATR non è l’unica misura di volatilità disponibile. Esistono alternative con caratteristiche diverse. Capire i pro e contro di ciascuna aiuta a scegliere quella più adatta al proprio sistema.
| Misura | Cosa cattura | Pro | Contro | Uso ideale |
|---|---|---|---|---|
| ATR | Volatilità price range + gap | Semplice, stabile, adattivo | Lagging (14 barre di ritardo) | Stop loss, position sizing |
| Bande di Bollinger (larghezza) | Deviazione standard dei prezzi | Visivo, intuitivo | Reagisce diversamente ai trend | Breakout da range |
| GARCH | Volatilità condizionale | Teoricamente ottimale | Complesso, richiede stima parametri | Risk management avanzato |
| Ulcer Index | Profondità e durata drawdown | Cattura il dolore reale | Non standard, meno conosciuto | Timing segnali Oracle v78 |
| Volatilità storica (HV) | Std dev log-rendimenti annualizzata | Comparabile cross-asset | Sensibile agli outlier | Confronto tra strumenti |
| VIX (proxy) | Volatilità implicita opzioni | Forward-looking | Solo S&P500, non forex | Filtro macro |
Come Leggere l’ATR in MT5: Impostazioni e Parametri
Su MetaTrader 5, l’ATR è disponibile come indicatore built-in. Lo trovi in: Inserisci → Indicatori → Trend → Average True Range. I parametri configurabili sono solo due: il periodo (standard: 14) e il metodo di smoothing (standard: Smoothed, che corrisponde al Wilder smoothing).
⚠ Attenzione al Metodo di Smoothing in MT5
MT5 offre quattro metodi: SMA, EMA, SMMA (Smoothed = Wilder), LWMA. Il valore default “Smoothed” è il Wilder smoothing — quello corretto per l’ATR originale. Se selezioni “EMA”, otterrai valori leggermente diversi perché l’EMA ha un alpha più alto (più reattivo). Le differenze sono piccole ma possono creare discrepanze se confronti i valori con quelli calcolati manualmente con la formula di Wilder.
// Utilizzo ATR in un Expert Advisor — pattern completo
int g_handleATR;
int OnInit()
{
// Crea handle ATR(14) su H4 — Wilder smoothing (MODE_SMMA)
g_handleATR = iATR(_Symbol, PERIOD_H4, 14);
if(g_handleATR == INVALID_HANDLE)
{
Print("Errore creazione handle ATR: ", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
// Leggi valore ATR corrente e precedente
bool LeggiATR(double &atrCorrente, double &atrPrecedente)
{
double atrBuffer[];
ArraySetAsSeries(atrBuffer, true);
if(CopyBuffer(g_handleATR, 0, 0, 3, atrBuffer) < 3)
{
Print("Errore lettura buffer ATR: ", GetLastError());
return(false);
}
atrCorrente = atrBuffer[0]; // Barra più recente (chiusa)
atrPrecedente = atrBuffer[1]; // Barra prima
return(true);
}
// Verifica se volatilità sta aumentando (segnale di breakout potenziale)
bool VolatilitaInAumento()
{
double atrC, atrP;
if(!LeggiATR(atrC, atrP)) return(false);
return(atrC > atrP * 1.15); // ATR corrente > 115% di quello precedente
}
// Calcola stop loss ATR-based (distanza in punti)
double StopLossATR(double multiplo = 2.5)
{
double atrC, atrP;
if(!LeggiATR(atrC, atrP)) return(0.0);
return(multiplo * atrC); // In USD per XAUUSD
}
void OnDeinit(const int reason)
{
if(g_handleATR != INVALID_HANDLE)
IndicatorRelease(g_handleATR); // Libera sempre l'handle in OnDeinit
}
⚡ ATR in Oracle v78: Come Viene Usato sui 65.587 Trade
“Lo stop loss fisso è il segnale più chiaro che un trader non capisce il mercato. Un XAUUSD con ATR di $50 e uno stop di $30 può chiudersi per rumore casuale anche su un’operazione corretta. Lo stop ATR-based risolve questo problema in modo matematicamente preciso e automatico.”— Manuel Trotta · MTInvestments · P.IVA 14349331000