MQL5 Wizard permet de générer automatiquement le code d'Experts Advisors. Pour plus de détails, consultez l'article sur la création d'Experts Advisors prêts à l'emploi avec MQL5 Wizard.
Dans cet article, nous allons explorer une stratégie basée sur le crossover de prix avec l'indicateur de Moyenne Mobile, confirmée par l'indicateur ADX. Cette stratégie est appelée "Signaux de crossover de prix avec MA confirmés par ADX" lors de la création de l'EA dans MQL5 Wizard.
Signaux de Trading :
- Achat : le prix de clôture de la dernière bougie complétée est supérieur à la moyenne mobile, et la moyenne mobile augmente sur la bougie actuelle et la dernière bougie complétée.
- Vente : le prix de clôture de la dernière bougie complétée est inférieur à la moyenne mobile, et la moyenne mobile diminue sur la bougie actuelle et la dernière bougie complétée.
- Pour filtrer les faux signaux, la puissance de la tendance est vérifiée (ADX > ADXmin) ainsi que la direction de la tendance à l'aide des Indices de Mouvement Directionnel (DI+ et DI-).
Cette stratégie est implémentée dans la classe CSignalADX_MA (elle doit être placée dans le dossier terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh).

Figure 1. Signaux de trading basés sur le crossover de prix avec la Moyenne Mobile, confirmés par l'ADX
Signaux de Trading
La stratégie de trading est implémentée dans la classe CSignalADX_MA, qui possède des méthodes protégées pour simplifier l'accès aux indicateurs et aux valeurs de prix :
double PlusADX(int ind) // retourne la valeur de la ligne DI+ de la bougie double MainADX(int ind) // retourne la valeur de la ligne principale de la bougie double MinusADX(int ind) // retourne la valeur de la ligne DI- de la bougie double EMA(int ind) // retourne la valeur de la moyenne mobile de la bougie double Close(int ind) // retourne la valeur du prix de clôture de la bougie double StateADX(int ind) // retourne la différence entre les lignes DI+ et DI- double StateEMA(int ind) // retourne une valeur positive si la EMA augmente et négative si elle diminue double StateClose(int ind) // retourne la différence entre le prix de clôture et la moyenne mobile
1. Ouvrir une position longue
Conditions pour ouvrir une position longue :
- StateEMA(0) < 0 et StateEMA(1) > 0 : la moyenne mobile augmente sur la bougie actuelle et la dernière bougie complétée ;
- StateClose(1) > 0 : le prix de clôture de la dernière bougie complétée est supérieur à la moyenne mobile ;
- MainADX(0) > minimum_ADX : la valeur de l'ADX de la bougie actuelle est supérieure à la valeur minimale spécifiée (pour vérifier la présence de tendance) ;
- StateADX(0) > 0 : le DI+ est supérieur au DI- de la bougie actuelle.
//+------------------------------------------------------------------+ //| Vérifie les conditions pour ouvrir une position longue (achat) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- condition 1 : la moyenne mobile augmente sur les bougies actuelle et dernière bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- condition 2 : le prix de clôture de la dernière bougie est supérieur à la moyenne mobile bool Buy_Condition_2=(StateClose(1)>0); //--- condition 3 : la valeur de l'ADX de la bougie actuelle est supérieure à la valeur minimale spécifiée (seuil de tendance) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4 : la valeur de DI+ est supérieure à DI- de la bougie actuelle bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- vérification de toutes les conditions return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. Fermer une position longue
Conditions pour fermer une position longue :
- StateEMA(0) < 0 et StateEMA(1) < 0 : la moyenne mobile diminue sur les bougies actuelle et dernière ;
- StateClose(1) < 0 : le prix de clôture de la bougie complétée est inférieur à la moyenne mobile ;
- MainADX(0) > minimum_ADX : la valeur de l'ADX de la bougie actuelle est supérieure à la valeur minimale spécifiée (pour vérifier la présence de tendance) ;
- StateADX(0) < 0 : le DI- est supérieur au DI+ de la bougie actuelle.
//+------------------------------------------------------------------+ //| Vérifie les conditions pour fermer une position longue | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- condition 1 : la moyenne mobile diminue sur les bougies actuelle et dernière bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- condition 2 : le prix de clôture de la bougie complétée est inférieur à la moyenne mobile bool Sell_Condition_2=(StateClose(1)<0); //--- condition 3 : la valeur de l'ADX de la bougie actuelle est supérieure à la valeur minimale spécifiée (seuil de tendance) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4 : la valeur de DI- est supérieure à DI- de la bougie actuelle bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- vérification de toutes les conditions return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. Ouvrir une position courte
Les conditions pour ouvrir une position courte sont les mêmes que celles pour fermer une position longue.
//+------------------------------------------------------------------+ //| Vérifie les conditions pour ouvrir une position courte (vente) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- condition 1 : la moyenne mobile diminue sur les bougies actuelle et dernière bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- condition 2 : le prix de clôture de la bougie complétée est inférieur à la moyenne mobile bool Sell_Condition_2=(StateClose(1)<0); //--- condition 3 : la valeur de l'ADX de la bougie actuelle est supérieure à la valeur minimale spécifiée (seuil de tendance) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4 : la valeur de DI- est supérieure à DI- de la bougie actuelle bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- vérification de toutes les conditions return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. Fermer une position courte
Les conditions pour fermer une position courte sont les mêmes que celles pour ouvrir une position longue.
//+------------------------------------------------------------------+ //| Vérifie les conditions pour fermer une position courte | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- condition 1 : la moyenne mobile augmente sur les bougies actuelle et dernière bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- condition 2 : le prix de clôture de la dernière bougie est supérieur à la moyenne mobile bool Buy_Condition_2=(StateClose(1)>0); //--- condition 3 : la valeur de l'ADX de la bougie actuelle est supérieure à la valeur minimale spécifiée (seuil de tendance) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- condition 4 : la valeur de DI+ est supérieure à DI- de la bougie actuelle bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- vérification de toutes les conditions return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
Créer un Expert Advisor avec MQL5 Wizard
Pour créer un robot de trading basé sur cette stratégie, choisissez les propriétés des signaux comme "Signaux de crossover de prix avec MA confirmés par ADX" dans l'option "Créer des Experts Advisors prêts à l'emploi" de MQL5 Wizard :

Figure 2. Choisissez les signaux basés sur le crossover de prix avec MA confirmés par ADX dans MQL5 Wizard
Ensuite, vous devez spécifier l'algorithme de trailing stop et le système de gestion de l'argent et des risques nécessaires. Le code de l'Expert Advisor sera créé automatiquement, vous pourrez le compiler et le tester dans le Strategy Tester de MetaTrader 5.
Résultats des Tests
Considérons le backtesting de l'Expert Advisor sur des données historiques (EURUSD H1, période de test : 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).
Lors de la création de l'Expert Advisor, nous avons utilisé un volume fixe (Trading Fixed Lot, 0.1), l'algorithme de Trailing Stop n'est pas utilisé (Trailing non utilisé).

Figure 3. Résultats du backtesting historique de l'Expert Advisor, basé sur le crossover de prix avec MA confirmés par ADX
Pièces jointes : Le fichier SignalADX-MA.mqh avec la classe CSignalADX_MA doit être placé dans le dossier terminal_data_folder\MQL5\Include\Expert\Signal\.
Le fichier ma_crossover_adx.mq5 contient le code de l'Expert Advisor, créé avec MQL5 Wizard.
Articles connexes
- Utiliser MQL5 Wizard pour Créer un Expert Advisor Basé sur les Modèles de Chandeliers Englobants et MFI
- Développez un Expert Advisor avec MQL5 : Signaux de Trading 3 Corbeaux Noirs / 3 Soldats Blancs + RSI
- Découvrez l'Expert Advisor exp_iCustom_v5 pour MetaTrader 4
- Découvrez le Système de Trading Exp_XPeriodCandle_X2 pour MetaTrader 5
- Découvrez CoensioTrader1V06 : Votre nouvel allié sur MetaTrader 5