Trading automatique : coder un EA complet sans indicateur – partie 1
Trading Automatique
Un Expert Advisor en MQL4 complet
Dans cette 3ème leçon sur le trading automatique avec MetaTrader et MQL4 nous allons coder un Expert Advisor tiré du numéro de mai 2013 du magazine Currency Trader.
Cette leçon MQL4 sera divisée en 2 parties (2 articles). La première introduira quelques notions pas encore abordées dans les leçons précédentes, tandis que la seconde mettra le tout ensemble et nous y testerons l’EA.
Ce système de trading a la particularité de ne pas utiliser d’indicateur. Il n’utilise que les cours.
Pourquoi ai-je choisi ce système de trading ?
Tout simplement parce que les courbes des tests m’ont semblé intéressantes.
Attaquons tout de suite.
Le système de trading automatique
Les règles du système de trading sont les suivantes.
Entrée longue ou sortie de position courte :
- 1. La clôture d’aujourd’hui est inférieure à l’ouverture (Close[0] < Open[0]).
- 2. L’ouverture d’aujourd’hui est supérieure au plus bas d’il y a 2 jours (Open[0] > Low[2]).
- 3. Le range du jour est supérieur à celui d’il y a 7 jours (Range[0] > Range[7]).
- 4. La clôture d’hier est supérieure à celle d’il y a 7 jours (Close[1] > close[7]).
- 5. La clôture d’hier est supérieure au plus haut d’il y a 4 jours (Close[1] > high[4]).
Entrée en position courte ou sortie de position longue :
- 1. La clôture d’aujourd’hui est supérieure à l’ouverture (Close[0] > Open[0]).
- 2. L’ouverture d’aujourd’hui est inférieure au plus haut d’il y a 2 jours (Open[0] < High[2]).
- 3. Le range du jour est supérieur à celui d’il y a 7 jours (Range[0] > Range[7]).
- 4. La clôture d’hier est inférieure à celle d’il y a 7 jours (Close[1] < close[7]).
- 5. La clôture d’hier est inférieure au plus bas d’il y a 4 jours (Close[1] > low[4]).
Dans ce système de trading on est toujours en position. Lorsque l’on ferme une position longue on ouvre une position en sens inverse.
Le code correspondant aux critères
Dans l’Expert Advisor cela va donner le code suivant.
double pclose = iClose(Symbol(),PERIOD_D1,1); double popen = iOpen(Symbol(),PERIOD_D1,1); double phigh = iHigh(Symbol(),PERIOD_D1,1); double plow = iLow(Symbol(),PERIOD_D1,1); double p2low = iLow(Symbol(),PERIOD_D1,3); double p2high = iHigh(Symbol(),PERIOD_D1,3); double p7low = iLow(Symbol(),PERIOD_D1,8); double p7high = iHigh(Symbol(),PERIOD_D1,8); double p1close = iClose(Symbol(),PERIOD_D1,2); double p7close = iClose(Symbol(),PERIOD_D1,8); double p4high = iHigh(Symbol(),PERIOD_D1,5); double p4low = iLow(Symbol(),PERIOD_D1,3); bool crit1 = pclose < popen; bool crit2 = popen > p2low; double range = phigh - plow; double range7 = p7high - p7low; bool crit3 = range > range7; bool crit4 = p1close > p7close; bool crit5 = p1close > p4high; bool critBuy = crit1 && crit2 && crit3 && crit4 && crit5; if (critBuy) { OpenBuy = true; } else { OpenBuy = false; } crit1 = pclose > popen; crit2 = popen < p2high; crit3 = range > range7; crit4 = p1close < p7close; crit5 = p1close < p4low; bool critSell = crit1 && crit2 && crit3 && crit4 && crit5; if (critSell) { OpenSell = true; } else { OpenSell = false; }
Ouvrir les positions en trading automatique
Pour ouvrir les positions on utilise la fonction OrderSend.
Les paramètres de cette fonction MQL4 sont :
- le symbole (la paire de devise ou l’action)
- le sens (long ou court, avec les constantes OP_SELL ou OP_BUY)
- le nombre de lots
- le prix d’achat (Bid ou Ask)
- le slippage maximal
- le stop loss (0 s’il n’y en a pas) (voir ici ce qu’est un SL)
- le Target Price (0 s’il pas fixé)
- un commentaire
- le nombre magique
- l’expiration (0 si pas défini)
- la couleur de la flèche sur le graphique qui indiquera l’exécution de l’ordre.
Voici le code :
void openOrder() { RefreshRates(); double SL=0; double TP=0; double Ticket = 0; bool weAreLong = orderNumber(MagicNumberBuy) > 0; bool weAreShort = orderNumber(MagicNumberSell) > 0; bool notInMarket = !weAreLong && !weAreShort; if (OpenBuy && (weAreShort || notInMarket)) { if (weAreShort) { closeTrades(MagicNumberSell); } Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,2,SL,TP,"Simple",MagicNumberBuy,0,Green); if (Ticket>=0) { OpenBuy = false; } } else if (OpenSell && (weAreLong || notInMarket)) { if (weAreLong) { closeTrades(MagicNumberBuy); } Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,2,SL,TP,"Simple",MagicNumberSell,0,Green); if (Ticket>=0) { OpenSell = false; } } }
Les positions longues et les positions courtes ont des nombres magiques différents. Cela permet de les distinguer plus facilement.
Fermer les positions de trade
Pour fermer les positions on fait une boucle sur les positions selon leur nombre magique. Et on utilise la fonction OrderClose.
Le code est le suivant.
void closeTrades(int mgNb) { int total = orderNumber(mgNb); for(int j=total-1;j>=0;j--) { OrderSelect(j, SELECT_BY_POS); int type = OrderType(); if (OrderMagicNumber() != mgNb) { continue; } bool result = false; switch(type) { //Close opened long positions case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; //Close opened short positions case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); } } }
La suite de ce système de trading automatique…
…dans la prochaine leçon.
Nous venons de voir comment passer des ordres et les fermer. Les fonctions SendOrder et OrderClose sont le cœur du trading automatique avec MetaTrader.
Nous verrons dans de futures leçons les autres types d’ordres.
Dans la prochaine leçon vous saurez si ce système de trading automatique est performant.
Vous aurez aussi le code complet de cet Expert Advisor.
À bientôt !
PS : formez-vous à MQL4 grâce à notre partenaire et sa formation en vidéo sur MQL4.
PS 2 : je parle ici d’un EA très pratique qui vous permet de gérer votre risque et votre spread.
Comments ( 3 )