Accueil Trading Systématique Publication

Optimisez vos trades avec le MQL5 Wizard : Signaux basés sur le croisement de deux EMA

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

MQL5 Wizard vous permet de générer automatiquement le code de vos Expert Advisors. Pour plus de détails, consultez Créer des Expert Advisors prêts à l'emploi avec MQL5 Wizard.

Les signaux de trading de cette stratégie, basée sur deux moyennes mobiles exponentielles, sont expliqués dans MQL5 Wizard - Signaux de trading basés sur le croisement de deux moyennes mobiles exponentielles. Les moyennes mobiles sont efficaces en tendance, mais peuvent générer de nombreux faux signaux dans d'autres cas. Une des manières d'améliorer la stratégie est d'utiliser des filtres temporels (par exemple, ouvrir de nouvelles positions uniquement pendant la session européenne du FOREX).

Dans cet article, nous allons explorer la stratégie basée sur le croisement de deux moyennes mobiles exponentielles (EMA rapide et EMA lente) avec un filtre temporel intrajournalier. Cette stratégie est désignée sous le nom de "Signaux basés sur le croisement de deux EMA avec filtre temporel intrajournalier" lors de la création d'un EA automatiquement via MQL5 Wizard.

Signaux de trading :

  • Ouvrir une position longue : l'EMA rapide croise à la hausse l'EMA lente et les conditions du filtre temporel intrajournalier ne sont pas remplies.
  • Ouvrir une position courte : l'EMA rapide croise à la baisse l'EMA lente et les conditions du filtre temporel intrajournalier ne sont pas remplies.

Cette stratégie est implémentée dans la classe CSignal2EMA_ITF.

La filtration des signaux, basée sur des périodes temporelles spécifiées, est implémentée dans la classe CSignalITF. Nous prendrons comme exemple la classe CSignal2EMA_ITF (qui contient un objet de la classe CSignalITF).

Le système de trading repose sur des ordres en attente, les niveaux de prix étant calculés en fonction des valeurs des moyennes mobiles, avec des unités ATR (Average True Range) utilisées.

Figure 1. Signaux de trading, basés sur le croisement de deux EMA avec filtre temporel intrajournalier

Figure 1. Signaux de trading, basés sur le croisement de deux EMA avec filtre temporel intrajournalier

Signaux de trading

La stratégie de trading est implémentée dans CSignal2EMA_ITF, qui comprend des méthodes protégées pour simplifier l'accès aux valeurs des indicateurs :

 double  FastEMA(int ind)      // retourne la valeur de l'EMA rapide de la bougie
double  SlowEMA(int ind)      // retourne la valeur de l'EMA lente de la bougie
double  StateFastEMA(int ind) // retourne la valeur positive/négative si l'EMA rapide a augmenté/diminué
double  StateSlowEMA(int ind) // retourne la valeur positive/négative si l'EMA lente a augmenté/diminué
double  StateEMA(int ind)     // retourne la différence entre l'EMA rapide et l'EMA lente
double  ATR(int ind)          // retourne la valeur de l'ATR de la bougie


La particularité de ce système est que le trading dépend du paramètre d'entrée Limit. Selon son signe, il existe différents cas :

  1. Limit>0. L'ordre sera placé lors d'un mouvement de retour, lorsque le faux franchissement de la moyenne mobile est à un prix meilleur que le prix du marché (ordres Buy Limit et Sell Limit seront placés selon le signal de trading).
  2. Limit<0. L'ordre sera placé dans la direction du mouvement de prix (ordres Buy Stop et Sell Stop seront placés selon le signal de trading).
  3. Limit=0. Dans ce cas, il échangera en utilisant les prix du marché.


1. Ouvrir une position longue

Il vérifie les conditions pour ouvrir une position longue : si la différence entre l'EMA rapide et l'EMA lente sur la dernière bougie clôturée a changé de signe de "-" à "+" (StateEMA(1)>0 && StateEMA(2)<0).

Ensuite, il vérifie les conditions du filtre temporel intrajournalier en appelant la méthode CheckOpenLong() de la classe CSignalITF. Si le trading est autorisé, il calculera le niveau de prix de base (la valeur de la moyenne mobile) et la plage de valeur ATR de la dernière bougie clôturée.

En fonction du signe du paramètre d'entrée Limit, il placera l'ordre d'achat en attente. Le prix de l'ordre, les niveaux de Take Profit et de Stop Loss sont calculés par rapport au niveau de prix de base (en unités ATR). Le temps d'expiration de l'ordre est défini (en bougies) par le paramètre d'entrée Expiration.

//+------------------------------------------------------------------+
//| Vérifie les conditions pour ouvrir une position longue (achat)        |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)>0 && StateEMA(2)<0))                    return(false);
   if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
   sl   =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp   =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

2. Fermer une position longue

Dans notre cas, la fonction qui vérifie les conditions pour fermer une position longue retourne toujours faux, c'est-à-dire qu'on suppose que la position longue sera fermée par Take Profit ou Stop Loss. Si nécessaire, vous pouvez écrire votre propre code pour implémenter cette méthode.

//+------------------------------------------------------------------+
//| Vérifie les conditions pour fermer une position longue               |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseLong(double& price)
  {
   return(false);
  }


3. Ouvrir une position courte

Il vérifie les conditions pour ouvrir une position courte : si la différence entre l'EMA rapide et l'EMA lente sur la dernière bougie clôturée a changé de signe de "+" à "-" (StateEMA(1)<0 && StateEMA(2)>0).

Ensuite, il vérifie les conditions du filtre temporel intrajournalier en appelant la méthode CheckOpenLong() de la classe CSignalITF. Si le trading est autorisé, il calculera le niveau de prix de base (la valeur de la moyenne mobile) et la plage de valeur ATR de la dernière bougie clôturée.

En fonction du signe du paramètre d'entrée Limit, il placera l'ordre de vente en attente. Le prix de l'ordre, les niveaux de Take Profit et de Stop Loss sont calculés par rapport au niveau de prix de base (en unités ATR). Le temps d'expiration de l'ordre est défini (en bougies) par le paramètre d'entrée Expiration.

//+------------------------------------------------------------------+
//| Vérifie les conditions pour ouvrir une position courte (vente)       |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)<0 && StateEMA(2)>0))                     return(false);
   if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price      =m_symbol.NormalizePrice(ema+m_limit*atr);
   sl         =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp         =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

4. Fermer une position courte

Dans notre cas, la fonction qui vérifie les conditions pour fermer une position courte retourne toujours faux, c'est-à-dire qu'on suppose que la position sera fermée par Take Profit ou Stop Loss. Si nécessaire, vous pouvez écrire votre propre code pour implémenter cette méthode.

//+------------------------------------------------------------------+
//| Vérifie les conditions pour fermer une position courte              |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseShort(double& price)
  {
   return(false);
  }


5. Suivi de Stop des ordres en attente d'achat

L'Expert Advisor ajustera les ordres en attente en fonction de la valeur actuelle de la moyenne mobile et de l'ATR.

Le système de trading placera des ordres en attente en fonction des signaux de trading. Si l'ordre a été placé avec succès, il suivra l'ordre en attente le long de la moyenne mobile. L'ordre sera exécuté si le prix du marché atteindra le prix de l'ordre.
//+--------------------------------------------------------------------+
//| Vérifie les conditions pour modifier l'ordre d'achat en attente     |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price)
  {
//--- vérification
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
//---
   return(true);
  }


6. Suivi de Stop des ordres en attente de vente

L'Expert Advisor ajustera les ordres en attente en fonction de la valeur actuelle de la moyenne mobile et de l'ATR.

L'ordre sera exécuté si le prix du marché atteindra le prix de l'ordre.

//+--------------------------------------------------------------------+
//| Vérifie les conditions pour modifier l'ordre de vente en attente     |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price)
  {
//--- vérification
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price=m_symbol.NormalizePrice(ema+m_limit*atr);
//---
   return(true);
  }

Créer un Expert Advisor avec MQL5 Wizard

Pour créer un robot de trading basé sur la stratégie, vous devez sélectionner les propriétés de signal comme "Signaux basés sur le croisement de deux EMA avec filtre temporel intrajournalier" dans l'option MQL5 Wizard :

Figure 2. Sélectionnez les signaux basés sur le croisement de deux EMA avec filtre temporel intrajournalier dans MQL5 Wizard

Figure 2. Sélectionnez les signaux basés sur le croisement de deux EMA avec filtre temporel intrajournalier dans MQL5 Wizard

Ensuite, vous devrez spécifier le système de suivi de stop nécessaire et le système de gestion de l'argent et des risques. Le code de l'Expert Advisor sera créé automatiquement, vous pourrez le compiler et le tester dans le Testeur de Stratégie du terminal client MetaTrader 5.


Résultats des tests

Voyons le backtesting de l'Expert Advisor sur des données historiques (EUenSD H1, période de test : 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0).

Pour la création de l'Expert Advisor, nous avons utilisé un volume fixe (Trading Fixed Lot, 0.1), l'algorithme de suivi de stop n'est pas utilisé (Suivi non utilisé).

Figure 3. Résultats des tests de l'Expert Advisor avec signaux de trading, basés sur le croisement de deux EMA sans utilisation du filtre ITF

Figure 3. Résultats des tests de l'Expert Advisor avec signaux de trading, basés sur le croisement de deux EMA sans utilisation du filtre ITF

Le filtre intrajournalier n'est pas utilisé, donc il y a de nombreux faux signaux. Les signaux de trading peuvent être améliorés si nous analysons les résultats des transactions en fonction des heures de trading.

Dans notre cas, nous avons constaté que le croisement de deux EMA génère de nombreux faux signaux entre 6h00 et 23h59. Nous pouvons spécifier le filtre temporel intrajournalier en définissant les paramètres du filtre.

Par exemple, nous pouvons spécifier un filtre temporel qui permet d'ouvrir des positions uniquement de 0h00 à 5h59. Cela peut être fait en définissant la valeur de BadHoursOfDay=16777152=111111111111111111000000b. Toutes les autres heures de trading sont "mauvaises", il est donc préférable d'interdire l'ouverture de nouvelles positions de 6h00 jusqu'à la fin de la journée.

Si nous définissons la valeur de BadHoursOfDay=16777152, nous filtrerons de nombreux faux signaux :

Figure 4. Résultats des tests de l'Expert Advisor avec signaux de trading, basés sur le croisement de deux EMA avec filtre temporel (BadHoursofDay=16777152)

Figure 4. Résultats des tests de l'Expert Advisor avec signaux de trading, basés sur le croisement de deux EMA avec filtre temporel (BadHoursofDay=16777152)


La classe CSignalITF offre de nombreuses autres fonctionnalités de filtration temporelle (il suffit de spécifier les minutes "bonnes" et "mauvaises" dans l'heure, les heures dans la journée, les jours de la semaine).

L'utilisation de filtres temporels permet d'améliorer les signaux de trading et de prendre en compte la dynamique du marché (par exemple, les caractéristiques des sessions de trading).

Pièces jointes : Le fichier Signal2EMA-ITF.mqh avec la classe CSignal2EMA_ITF doit être placé dans le dossier terminal_data_folder\MQL5\Include\Expert\Signal.

Le fichier expert_2ema_itf.mq5 contient le code de l'Expert Advisor, créé à l'aide de MQL5 Wizard.


Articles connexes

Commentaire (0)