1. Paramètres d'entrée
#define ExtBotName "AK-47 Scalper EA" //Nom du Bot #define Version "1.00" //--- paramètres d'entrée extern string EASettings = "---------------------------------------------"; //-------- <Paramètres EA> -------- input int InpMagicNumber = 124656; //Numéro Magique extern string TradingSettings = "---------------------------------------------"; //-------- <Paramètres de Trading> -------- input double Inpuser_lot = 0.01; //Lots input double InpSL_Pips = 3.5; //Stoploss (en Pips) input double InpMax_spread = 0.5; //Spread maximum autorisé (en Pips) (0 = flottant) extern string MoneySettings = "---------------------------------------------"; //-------- <Paramètres Financiers> -------- input bool isVolume_Percent = true; //Autoriser le Volume en Pourcentage input double InpRisk = 3; //Pourcentage de Risque du Solde (%) input string TimeSettings = "---------------------------------------------"; //-------- <Paramètres de Temps de Trading> -------- input bool InpTimeFilter = true; //Filtre de Temps de Trading input int InpStartHour = 2; //Heure de Début input int InpStartMinute = 30; //Minute de Début input int InpEndHour = 21; //Heure de Fin input int InpEndMinute = 0 //Minute de Fin
2. Initialisation des variables locales
//--- Variables int Pips2Points; // glissement 3 pips 3=points 30=points double Pips2Double; // Stoploss 15 pips 0.015 0.0150 int InpMax_slippage = 3; // Glissement maximum autorisé en Pips. bool isOrder = false; // ouvrir juste 1 ordre int slippage; string strComment = "";
3. Code Principal
a/ Fonction d'initialisation de l'Expert
int OnInit() { //--- //Détection de 3 ou 5 chiffres //Pip et point if (Digits % 2 == 1) { Pips2Double = _Point*10; Pips2Points = 10; slippage = 10* InpMax_slippage; } else { Pips2Double = _Point; Pips2Points = 1; slippage = InpMax_slippage; } //--- return(INIT_SUCCEEDED); }
b/ Fonction de tick de l'Expert
void OnTick() { //--- if(IsTradeAllowed() == false) { Comment("AK-47 EA\nTrading non autorisé."); return; } MqlDateTime structTime; TimeCurrent(structTime); structTime.sec = 0; //Définir l'heure de début structTime.hour = InpStartHour; structTime.min = InpStartMinute; datetime timeStart = StructToTime(structTime); //Définir l'heure de fin structTime.hour = InpEndHour; structTime.min = InpEndMinute; datetime timeEnd = StructToTime(structTime); double acSpread = MarketInfo(Symbol(), MODE_SPREAD); StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); strComment = "\n" + ExtBotName + " - v." + (string)Version; strComment += "\nHeure GMT = " + TimeToString(TimeGMT(),TIME_DATE|TIME_SECONDS); strComment += "\nHeure de Trading = [" + (string)InpStartHour + "h" + (string)InpStartMinute + " --> " + (string)InpEndHour + "h" + (string)InpEndMinute + "]"; strComment += "\nSpread actuel = " + (string)acSpread + " Points"; strComment += "\nNiveau d'arrêt actuel = " + (string)StopLevel + " Points"; Comment(strComment); //Mettre à jour les valeurs UpdateOrders(); TrailingStop(); //Vérifier l'heure de trading if(InpTimeFilter) { if(TimeCurrent() >= timeStart && TimeCurrent() < timeEnd) { if(!isOrder) OpenOrder(); } } else { if(!isOrder) OpenOrder(); } }
3.1 Calculer le signal pour envoyer des ordres
void OpenOrder(){ //int OrdType = OP_SELL;//-1; double TP = 0; double SL = 0; string comment = ExtBotName; //Calculer les Lots double lot1 = CalculateVolume(); //if(OrdType == OP_SELL){ double OpenPrice = NormalizeDouble(Bid - (StopLevel * _Point) - (InpSL_Pips/2) * Pips2Double, Digits); SL = NormalizeDouble(Ask + StopLevel * _Point + InpSL_Pips/2 * Pips2Double, Digits); if(CheckSpreadAllow()) //Vérifier le Spread { if(!OrderSend(_Symbol, OP_SELLSTOP, lot1, OpenPrice, slippage, SL, TP, comment, InpMagicNumber, 0, clrRed)) Print(__FUNCTION__,"--> Erreur d'envoi de l'ordre ",GetLastError()); } //} }
3.2 Calculer le Volume
double CalculateVolume() { double LotSize = 0; if(isVolume_Percent == false) { LotSize = Inpuser_lot; } else { LotSize = (InpRisk) * AccountFreeMargin(); LotSize = LotSize /100000; double n = MathFloor(LotSize/Inpuser_lot); //Comment((string)n); LotSize = n * Inpuser_lot; if(LotSize < Inpuser_lot) LotSize = Inpuser_lot; if(LotSize > MarketInfo(Symbol(),MODE_MAXLOT)) LotSize = MarketInfo(Symbol(),MODE_MAXLOT); if(LotSize < MarketInfo(Symbol(),MODE_MINLOT)) LotSize = MarketInfo(Symbol(),MODE_MINLOT); } return(LotSize); }
3.3 L'EA dispose d'une fonction "Trailing Stop", SL changera chaque fois que le prix change (à la baisse)
void TrailingStop() { for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if((OrderMagicNumber() == InpMagicNumber) && (OrderSymbol() == Symbol())) //_Symbol)) { //Pour l'Ordre de Vente if(OrderType() == OP_SELL) { //--Calculer SL lorsque le prix change double SL_in_Pip = NormalizeDouble(OrderStopLoss() - (StopLevel * _Point) - Ask, Digits) / Pips2Double; if(SL_in_Pip > InpSL_Pips){ double newSL = NormalizeDouble(Ask + (StopLevel * _Point) + InpSL_Pips * Pips2Double, Digits); if(!OrderModify(OrderTicket(), OrderOpenPrice(), newSL, OrderTakeProfit(), 0, clrRed)) { Print(__FUNCTION__,"--> Erreur de modification de l'ordre ",GetLastError()); } } } //Pour l'Ordre de Vente Stop else if(OrderType() == OP_SELLSTOP) { double SL_in_Pip = NormalizeDouble(OrderStopLoss() - (StopLevel * _Point) - Ask, Digits) / Pips2Double; if(SL_in_Pip < InpSL_Pips/2){ double newOP = NormalizeDouble(Bid - (StopLevel * _Point) - (InpSL_Pips/2) * Pips2Double, Digits); double newSL = NormalizeDouble(Ask + (StopLevel * _Point) + (InpSL_Pips/2) * Pips2Double, Digits); if(!OrderModify(OrderTicket(), newOP, newSL, OrderTakeProfit(), 0, clrRed)) { Print(__FUNCTION__,"--> Erreur de modification de l'ordre en attente !", GetLastError()); continue; } } } } } }
Articles connexes
- Générer des Signaux de Trading avec MQL5 Wizard : Étoiles du Matin/du Soir et RSI
- Utiliser MQL5 Wizard pour Créer un Expert Advisor Basé sur les Modèles de Chandeliers Englobants et MFI
- Développez un Expert Advisor avec MQL5 : Signaux de Trading 3 Corbeaux Noirs / 3 Soldats Blancs + RSI
- Générez des Signaux de Trading avec MQL5 Wizard : Dark Cloud Cover et Piercing Line
- AOCCI : Un Expert pour MetaTrader 5