ATR en MQL5 : mesurer la volatilité et l’intégrer dans votre EA

⏱ 6 min de lecture
Mis à jour le 26 mai 2026

ATR en MQL5 : mesurer la volatilité et l’intégrer dans votre EA

Maîtrisez l’indicateur Average True Range (ATR) en MQL5 pour optimiser vos Expert Advisors. Découvrez comment coder, paramétrer et exploiter la volatilité pour des stratégies de trading algorithmique plus robustes.

1. Comprendre l’ATR et son importance pour un EA en MQL5

L’Average True Range (ATR), développé par J. Welles Wilder, est un indicateur de volatilité essentiel. Contrairement aux oscillateurs, il ne prédit pas la direction du prix, mais mesure l’amplitude des mouvements. Pour un Expert Advisor (EA) codé en MQL5, l’ATR est un outil fondamental pour :

  • Adapter les stop-loss et take-profit : Un SL fixe de 20 pips sera inefficace sur un actif très volatil. L’ATR permet de le définir comme un multiple de la volatilité actuelle (ex: 2 * ATR).
  • Filtrer les entrées : Éviter de trader pendant les périodes de faible volatilité (range) ou au contraire, entrer en position lors d’explosions de volatilité.
  • Gérer la taille des positions : Calculer un lot dynamique basé sur la volatilité pour standardiser le risque (ex: risque 1% du capital par ATR).

En intégrant l’ATR dans votre code MQL5, vous rendez votre EA adaptable aux conditions de marché changeantes, ce qui est crucial pour la survie à long terme d’un algorithme.

2. Comment calculer l’ATR en MQL5 : Code et paramétrage

MQL5 propose l’indicateur technique intégré iATR() et le handle ATR. Voici la méthode la plus efficace pour l’implémenter dans votre EA.

Étape 1 : Déclaration des variables

//--- Inputs pour l'ATR
input int      ATR_Period = 14;           // Période de l'ATR
input double   ATR_Multiplier_SL = 1.5;   // Multiplicateur pour le Stop Loss
input double   ATR_Multiplier_TP = 3.0;   // Multiplicateur pour le Take Profit

//--- Handles et buffers
int            atr_handle;
double         atr_buffer[];

Étape 2 : Initialisation dans OnInit()

int OnInit()
{
   //--- Créer le handle de l'indicateur ATR
   atr_handle = iATR(_Symbol, _Period, ATR_Period);
   if(atr_handle == INVALID_HANDLE)
   {
      Print("Erreur création handle ATR. Erreur : ", GetLastError());
      return(INIT_FAILED);
   }
   //--- Configuration du tableau pour CopyBuffer
   ArraySetAsSeries(atr_buffer, true);
   return(INIT_SUCCEEDED);
}

Étape 3 : Récupération de la valeur dans OnTick()

void OnTick()
{
   //--- Copier la dernière valeur de l'ATR
   if(CopyBuffer(atr_handle, 0, 0, 3, atr_buffer) < 3)
   {
      Print("Erreur CopyBuffer ATR");
      return;
   }
   double current_atr = atr_buffer[0]; // Valeur ATR en points
   Print("ATR actuel : ", current_atr);
}

Important : La valeur retournée est en points (prix). Pour la convertir en pips sur le Forex, divisez par _Point si la paire est standard (ex: EURUSD), ou par 10*_Point pour les paires avec le Yen.

💡 Astuce Pro : Ne pas utiliser l'ATR seul. Combinez-le avec un filtre de tendance (comme une moyenne mobile 200) pour éviter de trader contre la tendance lors de pics de volatilité. Par exemple : if(current_atr > atr_filter_value && close > MA200).

3. Intégrer l'ATR pour un Stop Loss dynamique

L'application la plus courante de l'ATR dans un EA est le calcul d'un Stop Loss (SL) et Take Profit (TP) dynamiques. Voici comment le coder proprement.

//--- Calcul du SL et TP basés sur l'ATR
double atr_value = atr_buffer[0];
double sl_points = atr_value * ATR_Multiplier_SL;
double tp_points = atr_value * ATR_Multiplier_TP;

//--- Pour un ordre BUY
double sl_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - sl_points;
double tp_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + tp_points;

//--- Pour un ordre SELL
double sl_price_sell = SymbolInfoDouble(_Symbol, SYMBOL_BID) + sl_points;
double tp_price_sell = SymbolInfoDouble(_Symbol, SYMBOL_BID) - tp_points;

//--- Vérification des niveaux de Stop Level
double stop_level = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
if(MathAbs(sl_price - SymbolInfoDouble(_Symbol, SYMBOL_ASK)) < stop_level)
{
   // Ajuster le SL si trop proche du prix d'entrée
   sl_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + stop_level;
}

Ce code garantit que votre SL s'élargit lorsque le marché est volatil et se resserre en période calme, protégeant ainsi votre capital de manière adaptative.

4. Filtrer les signaux d'entrée avec l'ATR

L'ATR peut servir de filtre pour ne trader que dans des conditions de volatilité optimales. Voici une structure logique à intégrer dans votre EA :

//--- Définition des seuils de volatilité
input double   ATR_Min_Filter = 0.0010;  // Seuil minimum (ex: 10 pips)
input double   ATR_Max_Filter = 0.0050;  // Seuil maximum (ex: 50 pips)

bool VolatilityFilter()
{
   double atr = atr_buffer[0];
   if(atr < ATR_Min_Filter || atr > ATR_Max_Filter)
   {
      Print("Volatilité hors plage. ATR = ", atr);
      return(false); // Ne pas trader
   }
   return(true); // Volatilité acceptable
}

//--- Utilisation dans OnTick()
void OnTick()
{
   if(!VolatilityFilter())
      return; // Sortir si la volatilité est trop faible ou trop élevée
   // ... suite de votre logique d'entrée
}

Ce filtre évite les entrées pendant les périodes de "faible bruit" (ATR trop bas) ou de "panique" (ATR trop haut), améliorant la qualité statistique de vos trades.

5. Calcul de la taille de lot basée sur le risque ATR

Pour un money management professionnel, utilisez l'ATR pour standardiser le risque par trade. L'idée est de risquer un pourcentage fixe du capital, où le risque est défini par la distance ATR * multiplicateur.

double CalculateLotSize(double risk_percent, double atr_sl_distance)
{
   double account_balance = AccountInfoDouble(ACCOUNT_BALANCE);
   double tick_value = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
   double tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
   
   //--- Risque en argent
   double risk_money = account_balance * (risk_percent / 100.0);
   
   //--- Valeur d'un pip en fonction de la distance SL
   double sl_in_ticks = atr_sl_distance / tick_size;
   double risk_per_lot = sl_in_ticks * tick_value;
   
   //--- Calcul du lot
   double lot = risk_money / risk_per_lot;
   
   //--- Normalisation selon les règles du broker
   double lot_step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
   lot = MathFloor(lot / lot_step) * lot_step;
   
   double min_lot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   double max_lot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
   
   return(MathMax(min_lot, MathMin(max_lot, lot)));
}

//--- Appel dans OnTick()
double sl_distance = atr_buffer[0] * ATR_Multiplier_SL;
double trade_lot = CalculateLotSize(1.0, sl_distance); // Risque 1% du capital

Cette approche garantit que chaque trade expose un pourcentage identique de votre compte, quelle que soit la volatilité. C'est la base du risque fixe par trade.

6. Bonnes pratiques et optimisation pour votre EA

Pour tirer le meilleur parti de l'ATR dans votre EA MQL5, suivez ces recommandations :

  • Période par défaut : 14 est un standard, mais testez 7 (volatilité à court terme) ou 21 (vue plus lissée).
  • Multiplicateurs : Un SL à 1.5x ATR est serré ; 2.5x à 3x est plus large. Testez sur vos données historiques.
  • Unités : L'ATR est en prix. Si vous tradez des indices ou des actions, l'ATR peut être de 100 points. Adaptez vos seuils en conséquence.
  • Backtesting : Vérifiez que votre EA réagit correctement aux changements de volatilité lors du backtest. Utilisez le mode "Tous les ticks" pour une simulation réaliste.

Besoin d'un EA sur-mesure intégrant l'ATR ? Demander un devis gratuit

Questions fréquentes sur l'ATR en MQL5

Comment obtenir l'ATR en pips dans MQL5 ?

L'ATR est retourné en points (prix). Pour le convertir en pips sur le Forex, divisez par _Point pour la plupart des paires. Pour les paires avec le JPY (ex: USDJPY), divisez par 10*_Point. Exemple : double atr_pips = atr_buffer[0] / _Point; pour EURUSD donne des pips.

Quelle est la différence entre iATR et CopyBuffer ?

iATR() crée un handle (un pointeur) vers l'indicateur ATR. Ce handle est ensuite utilisé par CopyBuffer() pour copier les valeurs calculées dans un tableau. C'est la méthode standard et la plus efficace pour accéder aux données des indicateurs en MQL5.

Puis-je utiliser l'ATR sur plusieurs timeframes ?

Oui, c'est même une stratégie avancée. Par exemple, utilisez l'ATR H1 pour définir le SL, et l'ATR M15 pour filtrer les entrées. Il suffit de créer plusieurs handles avec des périodes et timeframes différents : int atr_h1 = iATR(_Symbol, PERIOD_H1, 14);.

L'ATR est-il fiable en période de forte volatilité ?

L'ATR est un indicateur retardé (lagging). En cas de pic soudain de volatilité, l'ATR mettra quelques bougies à réagir. Pour atténuer cela, certains traders utilisent une moyenne mobile de l'ATR (ex: ATR sur ATR) ou combinent l'ATR avec les bandes de Bollinger pour une confirmation plus rapide.

Quels sont les meilleurs réglages pour un EA scalping avec ATR ?

Pour le scalping, utilisez une période ATR plus courte (5-7) et un multiplicateur SL faible (0.8x à 1.2x). Filtrez les trades avec un ATR minimum pour éviter les périodes trop calmes. Attention : le scalping nécessite un broker avec des spreads très faibles.

Recevez nos meilleurs conseils

1 email par semaine, désinscription en 1 clic. Pas de spam, jamais.

Site realise par Agence FluxDigital