English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Comment créer rapidement un Expert Advisor  pour le championnat de trading automatisé 2010

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

MetaTrader 5Exemples | 17 novembre 2021, 16:02
191 0
Andrey Kornishkin
Andrey Kornishkin

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 :
  • Sélection de la stratégie
  • Rédaction d'un Expert Advisor
  • Test
  • Optimisation dans le Testeur de Stratégie
  • Optimisation de la stratégie
  • Tests à différents intervalles

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 :

  • Modifiez l'indicateur de tendance
  • Sélectionnez une autre enveloppe
  • Sélectionnez un autre délai
  • Modifiez les conditions de trade

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.   

Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/148

Fichiers joints |
mabol.mq5 (6.65 KB)
macena.mq5 (6.94 KB)
maena.mq5 (6.58 KB)
Recherche d'erreurs et journalisation Recherche d'erreurs et journalisation
MetaEditor 5 dispose de la fonctionnalité de débogage. Mais lorsque vous écrivez vos programmes MQL5, vous souhaitez souvent afficher non pas les valeurs individuelles, mais tous les messages qui apparaissent lors des tests et du travail en ligne. Lorsque le contenu du fichier journal est de grande taille, il est évident d'automatiser la récupération rapide et facile du message requis. Dans cet article, nous examinerons les moyens de trouver des erreurs dans les programmes MQL5 et les méthodes de collecte de données. Nous simplifierons également la connexion aux fichiers et apprendrons à connaître un programme simple LogMon pour une visualisation confortable des fichiers journaux
Contrôler  la Pente de la Courbe d' Équilibre Pendant le Travail d'un Expert Advisor Contrôler la Pente de la Courbe d' Équilibre Pendant le Travail d'un Expert Advisor
Trouver des règles pour un système de trade et les programmer dans un Expert Advisor est la moitié du travail. D'une certaine manière, vous devez corriger le fonctionnement de l'Expert Advisor au fur et à mesure qu'il accumule les résultats du trading. Cet article décrit l'une des approches qui permet d'améliorer les performances d'un Expert Advisor à travers un feedback qui mesure la pente de la courbe d'équilibre.
Simulink : un guide pour les développeurs d'Expert Advisors Simulink : un guide pour les développeurs d'Expert Advisors
Je ne suis pas un programmeur professionnel. Et donc, le principe de « passer du simple au complexe » est d’une importance capitale pour moi lorsque je travaille sur l’élaboration d’un système de trading. Qu’est-ce qui est précisément simple pour moi? Tout d’abord, il s’agit de la visualisation du processus de création du système et la logique de son travail. En outre, il s’agit d’un minimum de code manuscrit. Dans cet article, je tenterai de créer et de tester le système de trading, basé sur un package Matlab, puis écrire un Expert Advisor pour MetaTrader 5. Les données historiques de MetaTrader 5 seront utilisées pour le processus de test.
L'utilisation des bibliothèques MQL5 Standard de Cours de Trade  dans la rédaction d'un Expert Advisor L'utilisation des bibliothèques MQL5 Standard de Cours de Trade dans la rédaction d'un Expert Advisor
Cet article explique comment utiliser les principales fonctionnalités de la bibliothèque standard MQL5 de classes de trade dans la rédaction des conseillers experts qui implémente la fermeture de la position et la modification , la passation et la suppression de commande en attente et la vérification de la marge avant de passer un trade.. Nous avons également démontré comment les classes de trade peuvent être utilisés pour obtenir les détails des commandes et des deals.