Moving Average EA MT5 : automatiser les croisements EMA/SMA
Découvrez comment créer et optimiser un Expert Advisor (EA) pour MT5 qui exploite les croisements de moyennes mobiles (EMA et SMA). Maîtrisez les stratégies de trading algorithmique pour automatiser vos décisions et gagner en efficacité sur le marché Forex et CFD.
Introduction : pourquoi automatiser les croisements de moyennes mobiles ?
Le trading algorithmique a révolutionné la manière dont les traders abordent les marchés financiers. Parmi les stratégies les plus éprouvées et les plus simples à comprendre, le croisement de moyennes mobiles (Moving Average Crossover) reste un pilier. Qu’il s’agisse d’une moyenne mobile simple (SMA) ou d’une moyenne mobile exponentielle (EMA), le principe est le même : un signal d’achat est généré lorsqu’une moyenne rapide (ex : EMA 9) croise par le haut une moyenne lente (ex : SMA 21), et un signal de vente dans le cas inverse.
L’intérêt d’un Moving Average EA MT5 est de ne plus avoir à surveiller constamment vos graphiques. L’EA (Expert Advisor) exécute automatiquement les ordres selon des règles strictes, éliminant ainsi l’émotion et le stress. Dans cet article, nous allons détailler la conception d’un EA dédié aux croisements EMA/SMA, en expliquant le code MQL5, les paramètres clés et les optimisations possibles. Que vous soyez débutant ou expert en développement, vous trouverez ici les bases pour créer votre propre robot de trading.
1. Comprendre les moyennes mobiles : EMA vs SMA
Avant de coder, il est essentiel de comprendre les deux types de moyennes mobiles que nous allons utiliser. La moyenne mobile simple (SMA) calcule la moyenne arithmétique des prix sur une période donnée. Par exemple, une SMA 20 additionne les 20 derniers prix de clôture et les divise par 20. Elle donne un poids égal à chaque point de données.
La moyenne mobile exponentielle (EMA), en revanche, accorde plus de poids aux prix récents. Cela la rend plus réactive aux changements de tendance. L’EMA est donc plus rapide à réagir lors de ruptures de tendance, mais aussi plus sensible au bruit du marché. Dans la pratique, on utilise souvent une EMA rapide (ex : 9 ou 12) et une SMA lente (ex : 21 ou 50) pour combiner réactivité et fiabilité.
Le choix des périodes est crucial. Une combinaison EMA 9 / SMA 21 sera adaptée à un horizon court terme (scalping ou day trading), tandis qu’une EMA 50 / SMA 200 sera plus appropriée pour du swing trading. L’EA que nous allons développer devra donc permettre de paramétrer librement ces valeurs.
2. Structure d’un EA de croisement sur MT5
Un Expert Advisor MQL5 se compose de plusieurs fonctions obligatoires : OnInit(), OnTick() et OnDeinit(). La logique de croisement se trouve dans OnTick(), qui est exécutée à chaque nouveau tick de prix. Voici les étapes clés pour implémenter notre stratégie :
- Déclaration des handles d’indicateurs : nous utilisons
iMA()pour créer les handles de l’EMA et de la SMA. Chaque handle doit être créé dansOnInit(). - Récupération des valeurs : dans
OnTick(), on copie les valeurs des indicateurs dans des buffers à l’aide deCopyBuffer(). - Détection du croisement : on compare les valeurs actuelles et précédentes des deux moyennes. Si EMA > SMA et que la veille EMA < SMA, c'est un croisement haussier (achat).
- Gestion des ordres : on vérifie qu’aucune position n’est déjà ouverte dans la même direction, puis on utilise
OrderSend()pour placer un ordre au marché ou un ordre en attente.
Un bon EA doit aussi inclure un filtre de tendance pour éviter les faux signaux en range. Par exemple, on peut ajouter une condition sur la pente d’une SMA 200 pour ne trader que dans le sens de la tendance long terme.
3. Code MQL5 : l’implémentation du croisement EMA/SMA
Voici un squelette de code pour notre Moving Average EA MT5. Ce code se concentre uniquement sur la logique de croisement, sans gestion avancée du risque (à ajouter selon vos besoins).
//+------------------------------------------------------------------+
//| MovingAverageCrossover.mq5 |
//| Copyright 2025, VotreNom |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025"
#property version "1.00"
input int FastMAPeriod = 9; // Période EMA rapide
input int SlowMAPeriod = 21; // Période SMA lente
input double LotSize = 0.1; // Taille du lot
input int MagicNumber = 12345; // Identifiant unique
int fastMAHandle, slowMAHandle;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
fastMAHandle = iMA(_Symbol, _Period, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE);
slowMAHandle = iMA(_Symbol, _Period, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
if(fastMAHandle==INVALID_HANDLE || slowMAHandle==INVALID_HANDLE)
return(INIT_FAILED);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double fastMA[3], slowMA[3];
if(CopyBuffer(fastMAHandle,0,0,3,fastMA)<3 || CopyBuffer(slowMAHandle,0,0,3,slowMA)<3)
return;
// Détection de croisement
if(fastMA[1] > slowMA[1] && fastMA[2] < slowMA[2])
{
// Croisement haussier - Achat
if(!PositionExists(MagicNumber, POSITION_TYPE_BUY))
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize;
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.deviation = 10;
request.magic = MagicNumber;
OrderSend(request, result);
}
}
else if(fastMA[1] < slowMA[1] && fastMA[2] > slowMA[2])
{
// Croisement baissier - Vente
if(!PositionExists(MagicNumber, POSITION_TYPE_SELL))
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize;
request.type = ORDER_TYPE_SELL;
request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
request.deviation = 10;
request.magic = MagicNumber;
OrderSend(request, result);
}
}
}
//+------------------------------------------------------------------+
//| Vérifie si une position existe avec le magic number donné |
//+------------------------------------------------------------------+
bool PositionExists(int magic, ENUM_POSITION_TYPE type)
{
for(int i=0; i
Ce code de base ouvre une position à chaque nouveau croisement. Pour une version plus robuste, ajoutez des stops (SL/TP), un filtre de tendance et une gestion des risques (taille de lot dynamique).
💡 Astuce pro : optimisez vos paramètres avec un test de robustesse
Ne vous fiez pas uniquement à un backtest sur une seule période. Utilisez un Forward Test (test en avant) sur des données hors échantillon pour valider la robustesse de votre EA. Sur MT5, le Strategy Tester permet de réaliser des tests multi-périodes. Testez votre Moving Average EA MT5 sur au moins 5 ans de données, avec des périodes de volatilité variable (crise, marché calme). Ajustez les périodes EMA/SMA en fonction de l'instrument : une paire comme EURUSD peut nécessiter des valeurs différentes d'un indice boursier.
4. Paramètres avancés et filtres pour améliorer la performance
Un EA basé uniquement sur un croisement de moyennes mobiles peut générer de nombreux faux signaux, surtout dans un marché sans tendance (range). Voici quelques améliorations essentielles :
- Filtre de tendance (SMA 200) : n'achetez que si le prix est au-dessus de la SMA 200, ne vendez que s'il est en dessous. Cela évite de trader contre la tendance long terme.
- Filtre de volatilité (ATR) : utilisez l'Average True Range pour éviter d'entrer en position lors de faibles mouvements de prix. Par exemple, ne tradez que si l'ATR dépasse un seuil minimal.
- Gestion des positions multiples : au lieu de n'ouvrir qu'une seule position, vous pouvez autoriser plusieurs positions avec un pas (pyramidage). Attention, cela augmente le risque.
- Time filter : limitez le trading à certaines heures de la journée (ex : London ou New York session) pour éviter les périodes de faible liquidité.
- Trailing Stop : déplacez automatiquement le stop loss pour protéger les gains lorsque la tendance se renforce.
Ces filtres doivent être paramétrables via des inputs (externes) pour pouvoir les optimiser facilement dans le Strategy Tester.
5. Backtesting et optimisation de votre EA
Le backtesting est une étape cruciale avant de déployer votre EA en réel. MT5 propose un Strategy Tester puissant qui permet de tester votre robot sur des années de données historiques. Voici les bonnes pratiques :
- Qualité des données : utilisez des ticks réels (toutes les variations de prix) pour un test réaliste. Évitez les données OHLC seules.
- Période de test : testez sur au moins 3 à 5 ans, en incluant des périodes de volatilité et de calme.
- Optimisation : utilisez l'optimisation génétique (Genetic Algorithm) pour trouver les meilleures combinaisons de paramètres (périodes EMA/SMA, SL/TP, etc.). Attention au surapprentissage (overfitting) : privilégiez des paramètres robustes qui fonctionnent sur plusieurs périodes.
- Forward Test : après optimisation, testez votre EA sur une période non utilisée (par exemple les 6 derniers mois) pour valider la performance.
N'oubliez pas qu'un backtest parfait ne garantit pas les résultats futurs. Les conditions de marché changent, et votre EA doit être régulièrement mis à jour.
Besoin d'un EA sur-mesure ? Demander un devis gratuit
Questions fréquentes
Quelle est la différence entre EMA et SMA dans un EA de croisement ?
L'EMA (Exponential Moving Average) réagit plus rapidement aux changements de prix que la SMA (Simple Moving Average). Dans un EA de croisement, on utilise souvent une EMA comme moyenne rapide et une SMA comme moyenne lente. L'EMA donne des signaux plus précoces mais peut générer plus de faux signaux en range. La SMA est plus fiable en tendance mais plus lente.
Mon EA ouvre trop de trades, comment réduire le nombre de signaux ?
Vous pouvez ajouter un filtre de tendance (ex : SMA 200) pour ne trader que dans la direction de la tendance principale. Vous pouvez aussi augmenter la période des moyennes mobiles (ex : EMA 20/SMA 50) pour filtrer le bruit. Un autre filtre efficace est l'ATR (Average True Range) : n'ouvrez une position que si la volatilité dépasse un seuil minimal.
Puis-je utiliser cet EA sur n'importe quel instrument (Forex, indices, crypto) ?
Oui, en théorie. Cependant, chaque instrument a ses propres caractéristiques (volatilité, spread, horaires de trading). Il est fortement recommandé d'optimiser les paramètres (périodes EMA/SMA, SL/TP) pour chaque instrument. Par exemple, une paire comme GBPJPY est plus volatile que EURUSD, donc les périodes et les stops devront être ajustés. Testez toujours votre EA sur l'instrument cible avant de l'utiliser en réel.
Comment éviter le surapprentissage (overfitting) lors de l'optimisation ?
Le surapprentissage se produit lorsque votre EA est trop optimisé sur des données historiques et qu'il échoue en forward test. Pour l'éviter : 1) Utilisez une période de test longue (au moins 5 ans). 2) Limitez le nombre de paramètres à optimiser (max 4-5). 3) Testez sur plusieurs périodes hors échantillon (ex : 2020-2022 pour l'optimisation, 2023-2024 pour la validation). 4) Privilégiez des paramètres "robustes" qui donnent de bons résultats sur une large plage de valeurs.