Comment créer rapidement un Expert Advisor pour le championnat de trading automatisé 2010

Andrey Kornishkin | 17 novembre, 2021

Introduction

Afin de développer un expert pour participer au Championnat de Trading Automatisé 2010, utilisons un modèle de conseiller expert prêt de l'article The Prototype of Trade Robot. Même le programmeur novice MQL5 sera en mesure d’assurer cette tâche, car pour vos stratégies les classes de base, les fonctions, les modèles sont déjà élaborés Il suffit d'écrire un minimum de code pour implémenter votre idée de trading.  

Ce que nous devrons préparer :

1. Sélection de la stratégie

On pense que le trading avec tendance est plus rentable que le trading dans une fourchette, et le rebond des niveaux intra-journaliers se produit plus fréquemment que la rupture des frontières du canal.

Sur la base de ces hypothèses, nous ouvrirons une position vers la tendance actuelle sur le rebond des limites du canal (Enveloppes). Nous clôturerons la position sur un signal de clôture de position ou lorsque les niveaux Arrêt de Perte ou Prise de Bénéfice seront atteints.

Comme le signal de tendance, nous utiliserons la croissance ou la diminution du MACD sur le graphique journalier, et nous négocierons sur le rebond des limites du canal sur la période horaire.  

Figure 1. Indicateur MACD sur le

Figure 1. Indicateur MACD sur le graphique journalier EURUSD

Si l'indicateur MACD croît sur deux barres successives, c'est le signal d'achat. S'il diminue sur deux barres successives, c'est le signal de vente.

 Figure 2. Rebond de prix à partir des limites d'enveloppes

Figure 2. Rebond de prix des limites des enveloppes


2. Rédaction d'un Expert Advisor 

2.1. Modules inclus

L'expert utilisera la classe ExpertAdvisor du module ExpertAdvisor.mqh.

#include <ExpertAdvisor.mqh>

2.2. Variables d'Entrées

input int    SL        =  50; // Stop Loss distance
input int    TP        = 100; // Take Profit distance
input int    TS        =  50; // Trailing Stop distance
input int    FastEMA   =  15; // Fast EMA
input int    SlowEMA   =  26; // Slow EMA
input int    MACD_SMA  =   1; // MACD signal line
input int    EnvelPer  =  20; // Envelopes period
input double EnvelDev  = 0.4; // Envelopes deviation
input double Risk      = 0.1; // Risk

2.3. Créer une classe héritée de CExpertAdvisor

class CMyEA : public CExpertAdvisor
  {
protected:
   double            m_risk;          // size of risk
   int               m_sl;            // Stop Loss
   int               m_tp;            // Take Profit
   int               m_ts;            // Trailing Stop
   int               m_pFastEMA;      // Fast EMA
   int               m_pSlowEMA;      // Slow EMA
   int               m_pMACD_SMA;     // MACD signal line
   int               m_EnvelPer;      // Envelopes period
   double            m_EnvelDev;      // Envelopes deviation
   int               m_hmacd;         // MACD indicator handle
   int               m_henvel;        // Envelopes indicator handle
public:
   void              CMyEA();
   void             ~CMyEA();
   virtual bool      Init(string smb,ENUM_TIMEFRAMES tf); // initialization
   virtual bool      Main();                              // main function
   virtual void      OpenPosition(long dir);              // open position on signal
   virtual void      ClosePosition(long dir);             // close position on signal
   virtual long      CheckSignal(bool bEntry);            // check signal
  };
//------------------------------------------------------------------
2.4. Supprimer les indicateurs
//------------------------------------------------------------------    
void CMyEA::~CMyEA()
  {
   IndicatorRelease(m_hmacd);  // delete MACD indicator
   IndicatorRelease(m_henvel); // delete Envelopes indicator
  }
//------------------------------------------------------------------    
2.5. Initialiser les variables
//------------------------------------------------------------------    Init
bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf)
  {
   if(!CExpertAdvisor::Init(0,smb,tf)) return(false);    // initialize parent class
   // copy parameters
    m_risk=Risk; 
   m_tp=TP; 
   m_sl=SL; 
   m_ts=TS;
   m_pFastEMA=FastEMA; 
   m_pSlowEMA=SlowEMA; 
   m_pMACD_SMA=MACD_SMA;
   m_EnvelPer = EnvelPer;
   m_EnvelDev = EnvelDev;
   m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE);      // create MACD indicator
   m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
   if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false);             // if there is an error, then exit
   m_bInit=true; 
   return(true);                                                                      // trade allowed
  } 

2.6. Fonction Trade

//------------------------------------------------------------------    CheckSignal
long CMyEA::CheckSignal(bool bEntry)
  {
   double macd[4],   // Array of MACD indicator values
         env1[3],    // Array of Envelopes' upper border values
         env2[3];    // Array of Bollinger Bands' lower border values
   MqlRates rt[3];   // Array of price values of last 3 bars
   
   if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
     {
       Print("CopyRates ",m_smb," history is not loaded"); 
        return(WRONG_VALUE);
     }
   // Copy indicator values to array
   if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2)
     { 
        Print("CopyBuffer - no data"); 
       return(WRONG_VALUE);
     }
   // Buy if MACD is growing and if there is a bounce from the Evelopes' lower border
   if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] &&  macd[2]<macd[3])
      return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
   // Sell if MACD is dwindling and if there is a bounce from the Evelopes' upper border
   if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] &&  macd[2]>macd[3])
      return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell

   return(WRONG_VALUE); // if there is no signal
  }

CMyEA ea; // class instance

Et donc, après avoir écrit le code, envoyez l'expert subséquent au Testeur de Stratégie


3. Test 

Dans le Testeur de Stratégie pour la période "L'année dernière" sur l'EURUSD, nous obtenons le graphique suivant :

Figure 3. Résultats du test du système de trading avec les paramètres initiaux

Figure 3. Résultats des tests du système de trading avec les paramètres initiaux

Les résultats ne sont pas impressionnants, commençons donc l’optimisation des niveaux Arrête de Perte et Prise de Bénéfice.


4. Optimisation dans le Testeur de Stratégie

Nous optimiserons les paramètres Arrêt de Perte et Prise de Bénéfice à l'intervalle 10-500 avec l'étape 50.

Meilleurs résultats : Arrêt de Perte = 160, Prise de Bénéfice = 310. Après l'optimisation d’ Arrêt de Perte et de Prise de Bénéfice, nous avons reçu 67% de trades rentables contre 36% précédents et un bénéfice net de 1522,97 $. Ainsi, par de simples manipulations, nous avons amélioré notre système pour atteindre le seuil de rentabilité et même obtenu des bénéfices.

Figure 4. Résultats du test du système de trading avec Arrêt de Perte et Prise de Bénéfice optimisés

Figure 4. Résultats du test du système de trading avec un Arrêt de Perte et une Prise de Bénéfice optimisés

Optimisons ensuite la période et l'écart des enveloppes.

La période des enveloppes passera de 10 à 40 avec l'étape 4, et l'écart - de 0,1 à 1 avec l'étape 0,1.

Les meilleurs résultats d'optimisation sont : Période enveloppes = 22, écart enveloppes = 0,3. Même maintenant, nous avons un bénéfice net de 14418,92 $ et 79% de trades rentables.

Figure 5. Résultats du test du système de trading avec une période et un écart d'enveloppes optimisés

Figure 5. Résultats des tests du système de trading avec une période et un écart d'enveloppes optimisés

Si nous augmentons le risque à 0,8, nous obtiendrons un bénéfice net de 77330,95 $.

 Figure 6. Les résultats du test du système de trading avec un risque optimisé

Figure 6. Les résultats du test du système de trading avec un risque optimisé

 

5. Optimisation de la stratégie

L'optimisation de la stratégie peut comprendre les étapes suivantes :

5.1. Modifiez l’Indicateur de Tendance

Comme nous pouvons le voir dans l'article Plusieurs façons de trouver une tendance dans MQL5, les meilleurs indicateurs de tendance sont la moyenne mobile et un "fan" de moyennes mobiles.

Remplaçons l'indicateur MACD par une moyenne mobile simple. Le code de l'expert se trouve dans le fichier Macena.mq5 joint.

5.2. Sélectionnez une autre enveloppe

Outre les enveloppes, vous pouvez également sélectionner une autre enveloppe à notre disposition. Par exemple, Price Channel, Bollinger Bands ou une enveloppe axée sur des moyennes mobiles.

Un exemple d'expert, qui utilise les bandes MA et Bollinger, peut être trouvé dans le fichier Maboll.mq5 ci-joint.

5.3. Sélectionnez un autre délai

Modifions le délai en plus grand ou plus petit. En tant que délai plus long - prenez H4, en tant que moindre - M15, puis testez et optimisez votre système.

Pour ce faire, remplacez une seule ligne dans le code :

m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

Dans le cas du délai H4 :

m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator 

Pour le délai M15 : 

m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

5.4. Modifiez les conditions du trade

À titre d'expérience, modifions également les conditions du trade  

  1. Rendre le système capable d'inverser. Nous achèterons sur le rebond de la limite inférieure de l'enveloppe et vendrons sur le rebond de la limite supérieure des enveloppes.
  2. Vérifiez le système sans suivre la tendance du jour. Cela se fait simplement en insérant le code suivant dans le bloc de trade :
    //------------------------------------------------------------------ CheckSignal
    long CMyEA::CheckSignal(bool bEntry)
      {
       double env1[3],   // Array of Envelopes' upper border values
             env2[3];    // Array of Bollinger Bands' lower border values
       MqlRates rt[3];   // Array of price values of last 3 bars
    
       if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
         {
          Print("CopyRates ",m_smb," history is not loaded");
          return(WRONG_VALUE);
         }
    // Copy indicator values to array
       if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2)
         {
          Print("CopyBuffer - no data");
          return(WRONG_VALUE);
         }
    // Buy if there is a bounce from the Evelopes' lower border
       if(rt[1].open<env2[1] && rt[1].close>env2[1])
          return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
    // Sell if there is a bounce from the Evelopes' upper border
       if(rt[1].open>env1[1] && rt[2].close<env1[1])
          return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell
    
       return(WRONG_VALUE); // if there is no signal
      }
    
    CMyEA ea; // class instance
    //------------------------------------------------------------------    OnInit
    

     3. Nous fermerons une position courte lorsque le prix n'a pas fortement baissé, mais a tourné et augmenté.

     4. Nous fermerons une position longue lorsque le prix n'a pas fortement augmenté, mais a tourné et baissé.

Vous pouvez inventer de nombreuses autres façons d'optimiser une stratégie de trading, certaines d'entre elles sont décrites dans la documentation correspondante.

C’est à vous qu’appartiennent d’autres recherches


6. Tests à différents intervalles

Testez notre Expert Advisor sur des intervalles de temps égaux avec un décalage de 1 mois. Prenons "l'Année Dernière" comme période de test Période de temps - 3 mois.

Intervalle de test
Bénéfice, USD
Trades rentables
 1.01.2010 - 30.03.2010
7239.50 76.92%
 1.02.2010 - 30.04.2010 -6577.50 0%
 1.03.2010 - 30.05.2010 -8378.50 50%
 1.04.2010 - 30.06.2010 -6608.00 0%
 1.05.2010 - 30.07.2010  41599.50 80%
  1.06.2010 - 30.08.2010  69835.50  85%
Sommaire: Il n'est pas souhaitable d'utiliser Expert Advisor avec une gestion de l'argent aussi agressive. Réduire le risque.


Conclusion

Brève conclusion : sur la base de ce modèle, vous pouvez implémenter assez rapidement votre idée de trading avec un minimum de temps et d'efforts.

L'optimisation des paramètres du système et des critères de trade ne pose également aucun problème.

Pour créer un système de trading opérationnel plus stable, il est souhaitable d'optimiser tous les paramètres sur des intervalles de temps plus longs.

Liste des sources utilisées :
  1. 20 signaux de trade dans l'article MQL5.
  2. L'article sur le prototype de robot de trade.
  3. L’article sur Plusieurs façons de détecter une tendance dans MQL5.
  4. L’article sur Expert Advisors axés sur les systèmes de trading populaires et l'optimisation des robots de trading Alchemy of Trading.
  5. L’article Limitations et vérifications dans Expert Advisors.
  6. L’article Rédaction d'un Expert Advisor à l'aide de l'approche de programmation orientée objet MQL5.
  7. Article sur Fonctions pour la gestion de l'argent dans un article Expert Advisor.