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: Tout sélectionner
//+------------------------------------------------------------------+
//| 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.

Articles en relation
[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)
Stop lost en stop suiveur et objectif de sortie en plus?
par GOLDENBOY » 01 Aoû 2015 14:44 (6 Réponses)
HELP Backtesting - stop loss pas exécuté !
Fichier(s) joint(s) par plataxis » 29 Juil 2016 12:58 (7 Réponses)
Expert advisor dans les starting-blocks
Fichier(s) joint(s) par Boom » 09 Sep 2017 13:35 (21 Réponses)

ProRealTime

Alors partagez-le 5 fois c'est bon pour la santé