ProRealTime
Pour partager sur le trading automatique, nos algorithmes, nos backtests
Répondre • Page 1 sur 1

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

par Gacanga » 07 avr. 2017 11:51

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;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+

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

par oscar » 08 avr. 2017 09:40

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.

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

par AlgoFlex » 08 avr. 2017 10:24

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.

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

par Edd » 08 avr. 2017 20:21

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.");
                 }}}
         }}}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

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

par Gacanga » 10 avr. 2017 13:57

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.

Sujets similaires
Stop Suiveur (Trailing Stop)
par Ernesto » 10 sept. 2013 13:20 (8 Réponses)
PRT cfd à risque limité trailing stop et stop garanti
par Alex44 » 27 avr. 2017 20:56 (17 Réponses)
Trailing Stop??
par Dav4ex » 13 nov. 2015 23:51 (3 Réponses)
[Demo] Systeme Trailing Stop
par Edd » 24 déc. 2016 10:21 (14 Réponses)
MQL4 - MagicNumber et Trailing Stop
par Gacanga » 04 avr. 2017 12:39 (5 Réponses)
Besoin d’aide pour un trailing stop
par Philippe56380 » 06 mars 2019 21:21 (1 Réponses)
Magic Trend
par lemerou » 11 sept. 2014 14:58 (12 Réponses)
Apple Magic Trackpad I
par DarthTrader » 04 oct. 2016 08:53 (40 Réponses)
La file du dernier week-end de juillet. Août arrive STOP
par Florian » 28 juil. 2018 10:00 (110 Réponses)