Trailing Stop et Magic Number dans un EA - Je n'y arrive pas

Forum sur le trading automatique et algorithmique : systèmes, backtests, robots de trading, résultats et limites, code à l'appui.
Avatar du membre
Gacanga
Chevalier Émérite Jedi
Messages : 3676
Enregistré le : 30 sept. 2016 13:50

Trailing Stop et Magic Number dans un EA - Je n'y arrive pas

Message non lu par Gacanga »

Bonjour,

Voilà 2 jours que j'essaie de modifier un EA en MQL4 pour y mettre un Magic Number mais je n'y arrive pas malgré l'aide de certains.

Du coup, je vous propose mon code dans ce message, si une bonne âme voulait bien le modifier pour que je comprenne comment faire.

le robot est complet (hors magic number) et fonctionne mais je souhaite vraiment un magic number dedans.

D'avance Merci

Spoiler:
//+------------------------------------------------------------------+
//| Retournements-UK100-V2.mq4 |
//+------------------------------------------------------------------+

input double TakeProfit =1000;
input double StopLoss =500;
input double Lots =5;
input double TrailingStop =50;
input double Seuil =350;

int bougie = 0;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick(void)
{
double SignalAchat;
double SignalVente;
double Achat;
double Vente;
double RSICloseBuy;
double RSICloseSell;
int cnt,ticket,total;

//--- Variables Internes
SignalAchat=iCustom(NULL, PERIOD_CURRENT, "Tendance", 1, 2) != 0 && iCustom(NULL, PERIOD_CURRENT, "Tendance", 1, 2) != EMPTY_VALUE && iCustom(NULL, PERIOD_CURRENT, "Tendance", 0, 1) != 0 && iCustom(NULL, PERIOD_CURRENT, "Tendance", 0, 1) != EMPTY_VALUE;
SignalVente=iCustom(NULL, PERIOD_CURRENT, "Tendance", 0, 2) != 0 && iCustom(NULL, PERIOD_CURRENT, "Tendance", 0, 2) != EMPTY_VALUE && iCustom(NULL, PERIOD_CURRENT, "Tendance", 1, 1) != 0 && iCustom(NULL, PERIOD_CURRENT, "Tendance", 1, 1) != EMPTY_VALUE;
RSICloseBuy=iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE,0)>95;
RSICloseSell=iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE,0)<5;
Achat=Bars > bougie && SignalAchat ;
Vente=Bars > bougie && SignalVente ;

total=OrdersTotal();
if(total<2)
{
//--- Vérification Marge Disponible
if(AccountFreeMargin()<(1*Lots))
{
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- Possibilité Achat
if(Achat)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Retournements-UK100-V2",666555,0,Green);
bougie=Bars;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else
Print("Error opening BUY order : ",GetLastError());
return;
}
//--- Possibilité Vente
if(Vente)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"Retournements-UK100-V2",666555,0,Red);
bougie=Bars;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order : ",GetLastError());
}

return;
}
//--- Conditions Fermeture Ordres (hors SL & TP)
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
//--- Si Position Achat Ouverte
if(OrderType()==OP_BUY)
{
//--- Condition Fermeture
if(RSICloseBuy)
{
//--- Fermeture Achat
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- Vérification Stop Suiveur
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*Seuil)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
//--- Modification Stop
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
else // Si Position Vente
{
//--- Condition Fermeture
if(RSICloseSell)
{
//--- Fermeture Vente
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- Vérification Stop Suiveur
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*Seuil))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+
Avatar du membre
oscar
Messages : 7
Enregistré le : 13 mars 2017 16:43

Re: Trailing Stop et Magic Number dans un EA - Je n'y arrive

Message non lu par oscar »

Bonjour,

Qu'entends-tu par ça ne marche pas ? As-tu des erreurs dans les logs ? ("OrderModify error" ? Si oui, quel code d'erreur ?) En général, ça donne une bonne piste.

Je n'ai pas essayé ton code (samedi matin, week-end qui s'annonce...), je vois les améliorations suivantes à apporter :
- utilisation du NormalizeDouble(x,Digits) dans tes OrderSend et OrderModify (voir https://docs.mql4.com/trading/ordersend, et https://docs.mql4.com/trading/ordermodify ). Pour illustrer, on n'envoie pas au serveur 6.666666 mais 6.66.
- utilisation du STOP_LEVEL (voir https://book.mql4.com/trading/ordermodify). Tu ne peux pas envoyer une mise à jour du stoploss (ou takeprofit) qui est trop proche du prix actuel

J'ai regardé ton code, je n'ai rien vu qui m'ait choqué. Cependant, si problème, si tu ne rentre pas dans une boucle que tu aurais pensé , tu peux tester en lançant ton action unitaire uniquement sur une condition de date (if maDateHeure > datecourante ){ OrderModify().... . Ca éclaire pas mal.

Oscar.
Ano782345

Re: Trailing Stop et Magic Number dans un EA - Je n'y arrive

Message non lu par Ano782345 »

Tu as aussi cette outils forexeadvisor.com pour faire des ea simple.

Tu as aussi ce ea qui ressemble au tien avec le magic
e-BJF-RSI.mq4 sur factory, et sûrement d'autre en cherchant ea rsi mt4 dans google.
Avatar du membre
Edd
Apprenti Jedi
Messages : 732
Enregistré le : 10 août 2015 12:36

Re: Trailing Stop et Magic Number dans un EA - Je n'y arrive

Message non lu par Edd »

Salut,
il suffit de mettre la condition du magicnumber juste après orderselect pour que le stop suiveur ne prene en compte que les ordres avec le même magicnumber.

J'ai simplifié un exemple du code en différenciant chaque actions par 3 "fonctions". Ce qui peut être plus lisible et leger pour dévellopper d'avantage le corp du "OnTick()" qui ce résume 3 fonctions:
void OnTick()
{
if(OrdersTotal() >0)closeOrd();
if(OrdersTotal()==0) signal();
if(OrdersTotal() <1) openOrd();
return;
}

Spoiler:

Code : #

//+------------------------------------------------------------------+
//| Retournements-UK100-V2.mq4 |
//+------------------------------------------------------------------+
#property strict
input double TakeProfit=1000;
input double StopLoss=500;
input double Lots=5;
input double TrailingStop=50;
input double Seuil=350;
extern int magicNumber=666555;

int bougie=0;
double SignalAchat,SignalVente;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OrdersTotal() >0)closeOrd();
   if(OrdersTotal()==0)  signal();
   if(OrdersTotal() <1) openOrd();
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void signal()
  {
   if(
      iCustom(NULL,0,"Tendance",1,2)!=0 && iCustom(NULL,0,"Tendance",1,2)!=EMPTY_VALUE && iCustom(NULL,0,"Tendance",0,1)!=0 && iCustom(NULL,0,"Tendance",0,1)!=EMPTY_VALUE
      && Bars>bougie
      )SignalAchat=true;else SignalAchat=false;
   if(
      iCustom(NULL,0,"Tendance",0,2)!=0 && iCustom(NULL,0,"Tendance",0,2)!=EMPTY_VALUE && iCustom(NULL,0,"Tendance",1,1)!=0 && iCustom(NULL,0,"Tendance",1,1)!=EMPTY_VALUE
      && Bars>bougie
      )SignalVente=true;else SignalVente=false;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void openOrd()
  {
  //--- Vérification Marge Disponible
      if(AccountFreeMargin()<(1*Lots))
        {
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
        }
  if(SignalAchat==true)
     {
      int ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"Retournements-UK100-V2",magicNumber,0,clrGreen);
      bougie=Bars;
     }
   if(SignalVente==true)
      int ticket2=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"Retournements-UK100-V2",magicNumber,0,clrRed);
      bougie=Bars;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void closeOrd()
  {
  double seuilReel;
  if(Seuil<MarketInfo(Symbol(),MODE_STOPLEVEL))seuilReel=MarketInfo(Symbol(),MODE_STOPLEVEL);else seuilReel=Seuil; //controle du seuil vs stoplevel broker 
  
   int total=OrdersTotal();for(int cnt=0;cnt< total;cnt++)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true 
      && TrailingStop>0                   //Conditions Trailing Stop
      && OrderSymbol()==Symbol()          //      
      && OrderMagicNumber()==magicNumber) //
        {
         if(OrderType()==OP_BUY)
           {
            if(iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE,0)>95)int clB=OrderClose(OrderTicket(),OrderLots(),Bid,3,clrViolet);
            if(Bid-OrderOpenPrice()>Point*seuilReel)
              {
               if(OrderStopLoss()<Bid-Point*TrailingStop)
                 {
                  bool tsB=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,clrBlue);
                  if(!tsB)
                     Print("Error in OrderModify. Error code=",GetLastError());
                  else
                     Print("Order modified successfully.");
                 }}}
        

         if(OrderType()==OP_SELL)
           {
            if(iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE,0)<5)int clS=OrderClose(OrderTicket(),OrderLots(),Ask,3,clrViolet);
            if(OrderOpenPrice()-Ask>Point*seuilReel)
              {
               if(OrderStopLoss()>(Ask+Point*TrailingStop))
                 {
                  bool tsS=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,clrRed);
                  if(!tsS)
                     Print("Error in OrderModify. Error code=",GetLastError());
                  else
                     Print("Order modified successfully.");
                 }}}
         }}}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Avatar du membre
Gacanga
Chevalier Émérite Jedi
Messages : 3676
Enregistré le : 30 sept. 2016 13:50

Re: Trailing Stop et Magic Number dans un EA - Je n'y arrive

Message non lu par Gacanga »

Bon finalement, j'ai tout recommencer d'une page blanche en utilisant vos divers idées et explications.

ET ça marche !!

Merci à tous.

@edd: Le "seuil" dans mon robot n'est pas le seuil Stop autorisé par le broker (dans mon cas il n'y a pas de limitation) mais le seuil de déclenchement du stop suiveur, c'est à dire à partir de combien de pips "gagnants" je déclenche le suiveur.