Accueil Trading Systématique Publication

Créez un Robot de Trading avec MQL5 : Signaux de Crossover de Prix et MA Confirmés par ADX

Pièce jointe
258.zip (3.23 KB, Télécharger 0 fois)

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

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
Une caractéristique de cette implémentation est le contrôle supplémentaire de la présence de tendance (à l'aide de l'Indicateur de Mouvement Directionnel). Cela permet de filtrer les faux signaux et de vérifier les conditions de trading à l'aide des valeurs de la bougie actuelle (non complétée).

1. Ouvrir une position longue

Conditions pour ouvrir une position longue :

  1. StateEMA(0) < 0 et StateEMA(1) > 0 : la moyenne mobile augmente sur la bougie actuelle et la dernière bougie complétée ;
  2. StateClose(1) > 0 : le prix de clôture de la dernière bougie complétée est supérieur à la moyenne mobile ;
  3. 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) ;
  4. 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 :

  1. StateEMA(0) < 0 et StateEMA(1) < 0 : la moyenne mobile diminue sur les bougies actuelle et dernière ;
  2. StateClose(1) < 0 : le prix de clôture de la bougie complétée est inférieur à la moyenne mobile ;
  3. 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) ;
  4. 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

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

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

Commentaire (0)