Dans cet article, nous allons plonger dans la création d'un Expert Advisor (EA) basé sur le croisement de moyennes mobiles pour MetaTrader 4. C'est un projet passionnant qui peut vraiment améliorer votre expérience de trading si vous le mettez en œuvre correctement !
Définir les paramètres d'entrée
Commencez par définir les variables d'entrée qui guideront notre EA. Voici un exemple de code :
//--- paramètres d'entrée input int period_ma_fast = 8; // Période de la MA rapide input int period_ma_slow = 20; // Période de la MA lente input double takeProfit = 20.0; // Take Profit (pips) input double stopLoss = 20.0; // Stop Loss (pips) input double lotSize = 0.10; // Taille de lot input double minEquity = 100.0; // Équité minimale ($) input int Slippage = 3; // Slippage input int MagicNumber = 889; // Numéro magique
Variables globales
Ensuite, définissons les variables globales. Ces variables seront accessibles à toutes nos fonctions :
// Variables globales double myPoint = 0.0; int mySlippage = 0; int BuyTicket = 0; int SellTicket = 0;
Initialisation de l'EA
Lorsque l'EA est exécuté, la première fonction qui se lance est OnInit(). Cette fonction est parfaite pour valider et initialiser nos variables globales :
int OnInit() { // Validation des entrées if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10) { Alert("AVERTISSEMENT - Les données d'entrée ne sont pas valides"); return (INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); mySlippage = GetSlippage(Symbol(),Slippage); return(INIT_SUCCEEDED); }
Gestion des ticks
À chaque mouvement du marché (tick), la fonction OnTick() est appelée et exécute les instructions contenues dans son bloc :
void OnTick() { if (cekMinEquity()) { int signal = -1; bool isNewCandle = NewCandle(Period(), Symbol()); signal = getSignal(isNewCandle); transaction(isNewCandle, signal); setTPSL(); } else { // Arrêter le trading si l'équité est insuffisante Print("L'EA sera arrêté car l'équité est insuffisante"); } }
Fonction pour définir TPSL
void setTPSL() { int tOrder = 0; string strMN = "", pair = ""; double sl = 0.0, tp = 0.0; pair = Symbol(); tOrder = OrdersTotal(); for (int i=tOrder-1; i>=0; i--) { bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); strMN = IntegerToString(OrderMagicNumber()); if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0) { if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0)) { if (takeProfit > 0) { tp = OrderOpenPrice() + (takeProfit * myPoint); } else { tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() - (stopLoss * myPoint); } else { sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl) { if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)) { Print ("Modification de l'ordre réussie"); } } } if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0)) { if (takeProfit > 0) { tp = OrderOpenPrice() - (takeProfit * myPoint); } else { tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() + (stopLoss * myPoint); } else { sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl) { if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)) { Print ("Modification de l'ordre réussie"); } } } } }// Fin de la boucle }
Rejoignez notre communauté !
Pour des échanges enrichissants et des conseils sur le trading, n'hésitez pas à rejoindre notre groupe Telegram :
Application de trading recommandée
Si vous cherchez une application pour soutenir votre trading, téléchargez notre application SignalForex sur le Play Store :
Commentaire 0