ATR (Average True Range): Guida Completa, Formula, Calcolo e Uso nel Trading | Manuel Trotta

ATR — Average True Range:
La Guida Definitiva con Formula,
Calcolo, Dati Reali e Codice MQL5.

L’ATR (Average True Range) è l’indicatore di volatilità più robusto, più usato e più frainteso nel trading. La maggior parte dei trader sa che “misura la volatilità”. Pochi capiscono esattamente come viene calcolato, perché il True Range è diverso dal Range normale, e soprattutto come usarlo concretamente per stop loss adattivi, position sizing e filtri di volatilità. Questa guida copre tutto, con i dati reali di Oracle v78 su XAUUSD.

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.

StrumentoTimeframeATR(14) medio tipicoATR in pipsUso per SL (×2,5 ATR)
XAUUSD (Oro)M15$3,50–$6,0035–60 pips$8,75–$15,00
XAUUSD (Oro)H4$18,00–$35,00180–350 pips$45–$87
XAUUSD (Oro)D1$35,00–$65,00350–650 pips$87,5–$162
EURUSDH40,0040–0,007040–70 pips100–175 pips
USDJPYH40,45–0,8045–80 pips112–200 pips
BTCUSDH4$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.

atr_position_sizing.mq5MQL5
// 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)
💡 Con alta volatilità (ATR=$50), i lotti scendono automaticamente. Con bassa volatilità (ATR=$15), i lotti crescono. Il rischio in euro rimane sempre 1% del capitale.

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.

atr_filtro_volatilita.mq5MQL5
// 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.

MisuraCosa catturaProControUso ideale
ATRVolatilità price range + gapSemplice, stabile, adattivoLagging (14 barre di ritardo)Stop loss, position sizing
Bande di Bollinger (larghezza)Deviazione standard dei prezziVisivo, intuitivoReagisce diversamente ai trendBreakout da range
GARCHVolatilità condizionaleTeoricamente ottimaleComplesso, richiede stima parametriRisk management avanzato
Ulcer IndexProfondità e durata drawdownCattura il dolore realeNon standard, meno conosciutoTiming segnali Oracle v78
Volatilità storica (HV)Std dev log-rendimenti annualizzataComparabile cross-assetSensibile agli outlierConfronto tra strumenti
VIX (proxy)Volatilità implicita opzioniForward-lookingSolo S&P500, non forexFiltro 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.

atr_mql5_utilizzo.mq5MQL5
// 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

2,5×
Multiplo SL ATR
H4
Timeframe ATR
14
Periodo ATR
~$71
SL medio attuale
Oracle usa ATR(14) su H4 per tre funzioni. Prima: calcolo del stop loss dinamico a 2,5× ATR — ottimizzato su 65.587 trade storici come il punto di massima aspettativa (+0,684R). Seconda: normalizzazione del punteggio di uno dei 6 componenti di scoring — l’ATR relativo (rapporto ATR corrente / ATR medio 100 barre) misura il regime di volatilità. Terza: componente del calcolo del position sizing per adattare automaticamente i lotti alla volatilità corrente. L’ATR è l’indicatore tecnico più usato in Oracle — non come segnale di ingresso, ma come misura oggettiva del rischio.
“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
⚡ Stop loss a 2,5×ATR — testato su 65.587 trade XAUUSD H4

Smetti di Usare Stop Loss Fissi.
Il Mercato Cambia. Il Tuo Stop Deve Cambiatre con Lui.

Oracle v78 usa ATR dinamico su ogni operazione. 65.587 trade verificabili. WR 42,1%, EV +0,684R, MDD 13,1%. La live gratuita mostra il sistema in azione ogni settimana.

SL dinamico 2,5×ATR 65.587 trade XAUUSD H4 WR 42,1% verificato MDD 13,1% su 19 anni
ENTRA NELLA LIVE GRATUITA →

Scrivi “SERIO” a Rossella su WhatsApp Nessun costo. Rossella risponde entro 2 ore.

Domande Frequenti sull’ATR

L’ATR mi dice in che direzione andrà il mercato? ▼
No. L’ATR misura la dimensione dei movimenti, non la loro direzione. Un ATR alto significa che le barre recenti sono state ampie — sia rialziste che ribassiste. L’ATR non ha informazioni sulla direzione del trend, non genera segnali di acquisto o vendita, e non indica supporti o resistenze. È esclusivamente una misura di volatilità da usare per calibrare stop loss, take profit e dimensione delle posizioni.
Qual è il periodo ATR migliore per il trading intraday su XAUUSD? ▼
Il periodo standard di Wilder è 14. Per XAUUSD su H4 (il timeframe di Oracle) è ottimale — rappresenta circa 2,3 settimane di trading e cattura bene la volatilità di medio termine. Per timeframe più brevi (M15, H1) alcuni trader usano periodi più corti (7-10) per maggiore reattività, ma si perde la stabilità. Per D1, periodi più lunghi (20-25) danno segnali più stabili. Non esiste un periodo “migliore assoluto” — dipende dalla tua strategia. La cosa più importante è essere consistenti: scegli un periodo e usalo sempre.
Come converto l’ATR in pip per XAUUSD? ▼
Per XAUUSD su MT5: il valore ATR che vedi sull’indicatore è espresso in USD. Un ATR di 28.50 significa che le ultime 14 barre H4 hanno avuto un True Range medio di $28,50. Per convertire in pips nel senso MT5: 1 pip XAUUSD = $0,10 (con 2 decimali di prezzo). Quindi ATR $28,50 ÷ $0,10 = 285 pips MT5. Il valore in pip è utile per il calcolo dei lotti, il valore in USD è più intuitivo per capire il rischio reale in termini monetari.
L’ATR funziona su tutti gli strumenti finanziari? ▼
Sì, l’ATR è completamente universale: funziona su forex, azioni, indici, materie prime, criptovalute. Il concetto di True Range è applicabile a qualsiasi strumento con prezzo High, Low e Close. L’unico adattamento necessario è la scala: un ATR di 28$ su XAUUSD è nella norma, ma un ATR di 28$ su EURUSD sarebbe impossibile (il prezzo è ~1,18$). Il multiplo ottimale per lo stop loss può variare tra strumenti — il 2,5× è ottimale per XAUUSD H4 ma potrebbe non essere il migliore per EURUSD M15.
Manuel Trotta — Trader quantitativo, fondatore MTInvestments, autore Hoepli
◆ Scritto da

Manuel Trotta

Trader quantitativo italiano dal novembre 2007 — 19 anni online. Fondatore MTInvestments, creatore UlcerZenith Oracle v78 con 65.587 trade reali verificati H4 XAUUSD. Autore di 18 libri sul trading e finanza personale: "Fare Trading con Excel" (Hoepli 2019), "Diventa Investitore Profittevole in 15 Minuti al Giorno", "Il Latte con la Mucca" (memoir 2026), più 2 volumi tecnici. Speaker IT Forum Rimini. Online dal 2007 — stesso nome, stessa P.IVA.

P.IVA 14349331000 Dal Novembre 2007 18 Libri su Amazon ↗ 150K+ Follower