Comment créer rapidement un Expert Advisor pour le championnat de trading automatisé 2010
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 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 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 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 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 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é
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
- 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.
- 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% |
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 :- 20 signaux de trade dans l'article MQL5.
- L'article sur le prototype de robot de trade.
- L’article sur Plusieurs façons de détecter une tendance dans MQL5.
- L’article sur Expert Advisors axés sur les systèmes de trading populaires et l'optimisation des robots de trading Alchemy of Trading.
- L’article Limitations et vérifications dans Expert Advisors.
- L’article Rédaction d'un Expert Advisor à l'aide de l'approche de programmation orientée objet MQL5.
- 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
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation