Page 1 sur 1

Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 15:10
par Brice
Bonjour à tous :-)

J'essaie de terminer un premier jet d'EA très simple : achat ou vente au croisement de deux moyennes mobiles simples.

Il y a une gestion des stop loss, take profit, breakeven, et trailing stop.

Mon problème est que l'erreur 130 apparaît pour la fonction ModifyOrder. Je n'arrive vraiment pas à savoir pourquoi et comment résoudre ce problème. La documentation officielle ne m'avance pas beaucoup...

Code :

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                                    CroisementMM.mq4 |
//|                                                            Brice |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Brice"
#property link      ""

//---- parametres saisis

extern int StopLoss=5;
extern int BreakEven=5;
extern bool Pyramidage=false;
extern int TakeProfit=50;
extern int TrailingStop=5;
extern int Period_MA_Small=3;
extern int Period_MA_Big=14;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
double MA_Small, MA_Big;
int buyON=0;
int sellON=0;
MA_Small=iMA(Symbol(),0,Period_MA_Small,0,MODE_SMA,PRICE_CLOSE,0);
MA_Big=iMA(Symbol(),0,Period_MA_Big,0,MODE_SMA,PRICE_CLOSE,0);

//Code ci-dessous visant à savoir s'il y a déjà un ordre d'achat ou de vente ouvert
if (OrdersTotal()>0)
{
   for (int cnt=0;cnt<OrdersTotal();cnt++)
   { 
      OrderSelect(cnt, SELECT_BY_POS);
      if(OrderType()==OP_BUY) buyON=1;
      if(OrderType()==OP_SELL) sellON=1;    
   }
}
if(MA_Small>MA_Big && buyON==0) //Si la moyenne mobile de petite période est au-dessus de la MM de grande période
{
   OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0); //Ordre d'achat. Les stop loss et take profit sont donnés dans la fonction OrdersList()
}
if(MA_Small<MA_Big && sellON==0) //Si le contraire
{
   OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); //Ordre de vente
}

if (OrdersTotal()>0) OrdersList();
return(0);
}

//+------------------------------------------------------------------+
//Traitement de chaque ordre, pour fixer un stop loss, un take profit, un breakeven et un trailing stop
//Très inspiré du code de Christophe Sangouard disponible sur o-bo.com 
void OrdersList()
{        
    for (int cnt=0;cnt<OrdersTotal();cnt++)
    { 
     OrderSelect(cnt, SELECT_BY_POS);      
        if (OrderSymbol()==Symbol()) 
        {
            if (OrderType()==OP_BUY)
            {
               //----Stop Loss
               if (OrderStopLoss()==0) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderOpenPrice()+TakeProfit*Point,0,LightGreen);
                  return(0);
               }
               //---- Trailing Stop
               if (Bid-OrderStopLoss()>Point*TrailingStop)
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+TrailingStop*Point,OrderTakeProfit(),0,LightGreen);
               }
               //---- BreakEven
               if (Bid-OrderOpenPrice()>Point*BreakEven&&OrderStopLoss()<OrderOpenPrice()) 
               {
                  //OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLoss*Point,OrderTakeProfit(),0,LightGreen);
                  if(Pyramidage==true)
                  {
                     OrderSend(Symbol(),OP_BUY,0.1,Ask,30,0,0,NULL,123456,Red);
                  }
                  else
                  {
                  return(0);
                  }
               }
            }
            if (OrderType()==OP_SELL)
            {
               //---- Stop Loss
               if (OrderStopLoss()==0) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLoss*Point,OrderOpenPrice()-TakeProfit*Point,0,Yellow);
                  return(0);
               }
               //---- Trailing Stop
               if (OrderStopLoss()-Ask>Point*TrailingStop)
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()-TrailingStop*Point,OrderTakeProfit(),0,LightGreen);
               } 
               //---- BreakEven
               if (OrderOpenPrice()-Ask>Point*BreakEven&&OrderStopLoss()>OrderOpenPrice()) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderTakeProfit(),0,LightGreen);
                  if(Pyramidage==true)
                  {
                     OrderSend(Symbol(),OP_SELL,0.1,Bid,30,0,0,NULL,123456,Red);
                  }
                  else
                  {
                     return(0);   
                  }
               }
            }
         }   
      } 
}
//+------------------------------------------------------------------+
J'espère que vous pourrez m'apporter vos lumières !

Merci !

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 15:21
par Fabien LABROUSSE
Bonjour Brice, bienvenue sur VideoBourse.

Essaye d'élargir tes stop loss et take profit, l'erreur 130 vient souvent de ça.

Pour ton test tu avais placé des stop loss et take profit à combien te sur quelle paire?

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 15:34
par Brice
Merci dreamfab,

J'ai essayé des stop loss et take profit très variés (jusqu'à 50), sur de l'EUR/USD, en M1.

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 15:49
par Fabien LABROUSSE
Brice a écrit :Merci dreamfab,

J'ai essayé des stop loss et take profit très variés (jusqu'à 50), sur de l'EUR/USD, en M1.
Ok, cela vient peut être du fait que ton broker propose des cours avec 5 décimales?

Dans ce cas il faut que tu rajoutes un 0, donc si tu veux un stop loss à 50 pips il faut indiqué 500 par exemple.

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 15:51
par Brice
Encore raté ;-) !

J'ai changé pour un broker 4digits pour ne plus avoir ce problème récurrent...

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 16:00
par Fabien LABROUSSE
Brice a écrit :J'ai changé pour un broker 4digits pour ne plus avoir ce problème récurrent...
Et ca marche avec un broker 4 digits?

Je vais tester ton expert et voir si je rencontre les même problèmes.

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 16:02
par Brice
Non ça marche pas avec un 4 décimales...

Je suis preneur de ton retour de test, merci ;-)

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 16:12
par Fabien LABROUSSE
J'ai testé et je rencontre également l'erreur 130.

Je ne sais pas de quoi cela peut venir, il faudrait que j'étudie précisément le code.

Re: Erreur 130 sur OrderModify()

Publié : 27 juil. 2010, 16:31
par Brice
Bon, déjà c'est bien le code qui pose problème !

Re: Erreur 130 sur OrderModify()

Publié : 28 juil. 2010, 22:09
par Brice
J'ai trouvé la solution ! Le problème venait du trailing stop... Voici le code corrigé.

Bon, c'est bien tout ça, mais ça n'en fait pas un super robot pour autant !

Merci Dremfab.

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                                    CroisementMM.mq4 |
//|                                                            Brice |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Brice"
#property link      ""

//---- parametres saisis

extern int StopLoss=15;
extern int BreakEven=15;
extern bool Pyramidage=false;
extern int TakeProfit=500;
extern int TrailingStop=30;
extern int Period_MA_Small=5;
extern int Period_MA_Big=10;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
double MA_Small, MA_Big, MA_Small_pre, MA_Big_pre;
int buyON=0;
int sellON=0;
MA_Small=iMA(Symbol(),0,Period_MA_Small,0,MODE_SMA,PRICE_CLOSE,0);
MA_Big=iMA(Symbol(),0,Period_MA_Big,0,MODE_SMA,PRICE_CLOSE,0);
MA_Small_pre=iMA(Symbol(),0,Period_MA_Small,0,MODE_SMA,PRICE_CLOSE,1);
MA_Big_pre=iMA(Symbol(),0,Period_MA_Big,0,MODE_SMA,PRICE_CLOSE,1);

//Code ci-dessous visant à savoir s'il y a déjà un ordre d'achat ou de vente ouvert
if (OrdersTotal()>0)
{
   for (int cnt=0;cnt<OrdersTotal();cnt++)
   { 
      OrderSelect(cnt, SELECT_BY_POS);
      if(OrderType()==OP_BUY) buyON=1;
      if(OrderType()==OP_SELL) sellON=1;    
   }
}
if(MA_Small>MA_Big && MA_Small_pre<MA_Big_pre && buyON==0) //Si la moyenne mobile de petite période est au-dessus de la MM de grande période
{
   OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0); //Ordre d'achat. Les stop loss et take profit sont donnés dans la fonction OrdersList()
}
if(MA_Small<MA_Big && MA_Small_pre>MA_Big_pre && sellON==0) //Si le contraire
{
   OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); //Ordre de vente
}

if (OrdersTotal()>0) OrdersList();
return(0);
}

//+------------------------------------------------------------------+
//Traitement de chaque ordre, pour fixer un stop loss, un take profit, un breakeven et un trailing stop
//Très inspiré du code de Christophe Sangouard disponible sur o-bo.com 
void OrdersList()
{        
    for (int cnt=0;cnt<OrdersTotal();cnt++)
    { 
     OrderSelect(cnt, SELECT_BY_POS);      
        if (OrderSymbol()==Symbol()) 
        {
            if (OrderType()==OP_BUY)
            {
               //----Stop Loss
               if (OrderStopLoss()==0) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderOpenPrice()+TakeProfit*Point,0,LightGreen);
                  return(0);
               }
               //---- Trailing Stop
               if (Bid-OrderStopLoss()>Point*TrailingStop)
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+(TrailingStop/2)*Point,OrderTakeProfit(),0,LightGreen);
               }
               //---- BreakEven
               if (Bid-OrderOpenPrice()>Point*BreakEven&&OrderStopLoss()<OrderOpenPrice()) 
               {
                  //OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLoss*Point,OrderTakeProfit(),0,LightGreen);
                  if(Pyramidage==true)
                  {
                     OrderSend(Symbol(),OP_BUY,0.1,Ask,30,0,0,NULL,123456,Red);
                  }
                  else
                  {
                  return(0);
                  }
               }
            }
            if (OrderType()==OP_SELL)
            {
               //---- Stop Loss
               if (OrderStopLoss()==0) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+StopLoss*Point,OrderOpenPrice()-TakeProfit*Point,0,Yellow);
                  return(0);
               }
               //---- Trailing Stop
               if (OrderStopLoss()-Ask>Point*TrailingStop)
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+(TrailingStop/2)*Point,OrderTakeProfit(),0,LightGreen);
               } 
               //---- BreakEven
               if (OrderOpenPrice()-Ask>Point*BreakEven&&OrderStopLoss()>OrderOpenPrice()) 
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-StopLoss*Point,OrderTakeProfit(),0,LightGreen);
                  if(Pyramidage==true)
                  {
                     OrderSend(Symbol(),OP_SELL,0.1,Bid,30,0,0,NULL,123456,Red);
                  }
                  else
                  {
                     return(0);   
                  }
               }
            }
         }   
      } 
}
//+------------------------------------------------------------------+

Re: Erreur 130 sur OrderModify()

Publié : 29 juil. 2010, 13:26
par Fabien LABROUSSE
Brice a écrit :J'ai trouvé la solution ! Le problème venait du trailing stop... Voici le code corrigé.

Bon, c'est bien tout ça, mais ça n'en fait pas un super robot pour autant !
Ok merci Brice, c'est important ce type de message, car le prochain qui rencontrera ce type de problème précis aura directement la réponse ici.

Quel était le problème avec le trailing stop? Il était trop serré?

Quels sont les meilleurs résultats que tues réussi à obtenir avec cet expert?

Re: Erreur 130 sur OrderModify()

Publié : 29 juil. 2010, 23:13
par Brice
En effet, le StopLoss pour les Trailing Stop était trop court car il était fixé exactement au niveau du cours !

J'ai fait d'autres test, après quelques menus changements et surtout en prenant l'USDJPY. En 1h. Avec l'EURUSD c'est l'hécatombe...

Voilà le résultat du 1er janvier au 30 juin 2010.

La taille des ordres dépend de l'"équité" du compte, donc c'est pas trop risqué pour les petites sommes.

Qu'en pensez-vous ?

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 09:23
par Fabien LABROUSSE
Brice a écrit :Qu'en pensez-vous ?
Les résultats semblent très bon d'après le graphique, mais attention à la qualité du modelage qui est insuffisante (31.79% alors qu'elle devrait être à 90%).

Pour améliorer celà et avoir un backtest dont les résultats sont plus proche de la réalité, il faut que tu télécharges l'historique de la paire étudiée.

Pourrais-tu poster ton backtest complet pour que l'on puisse voir le drawdown max et autres informations stp?

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 10:57
par Fabien LABROUSSE
Je suis entrain de le backtester mais chez moi il prend énormément de mémoire et les backtests dur très longtemps.

Ce le fait aussi chez toi Brice?

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 11:12
par Fabien LABROUSSE
Bon j'arrête les backtests c'est vraiment trop long.

J'en lancerai un sur un autre PC ou pendant la nuit car les résultats ont l'air intéressants.

La lenteur vient du trailing stop qui modifie le stop loss, il n'y aurait pas un moyen de rendre cette opération plus rapide?

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 11:43
par Brice
Eh bien chez moi ca met quelques minutes pour le graphe que j'ai envoyé, et ce avec un Intel Atom, processeur pas vraiment rapide...

C'est vrai que les trailing stops occupent beaucoup de place dans le journal, c'est parce que le stop est réévalué tick apres tick en cas de progression dans le bon sens du cours, en meme temps c'est le plus optimal...
Pour améliorer celà et avoir un backtest dont les résultats sont plus proche de la réalité, il faut que tu télécharges l'historique de la paire étudiée.
Comment faire ca ?

Merci pour tes encouragements :)

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 12:11
par Fabien LABROUSSE
Brice a écrit :Comment faire ca ?
Tu vas sur ta plateforme MT4 et tu cliques sur "F2".
Brice a écrit :Eh bien chez moi ca met quelques minutes pour le graphe que j'ai envoyé, et ce avec un Intel Atom, processeur pas vraiment rapide...
Bizarre, moi j'ai un bon processeur et 4Go de mémoire vive.

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 12:51
par Brice
C'est un truc à savoir : avec 90%, le compteur tombe à zero très rapidement !

Avec d'autres EA trouvées ici ou là, j'ai également des résultats totalement différents...

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 12:54
par Fabien LABROUSSE
Brice a écrit :C'est un truc à savoir : avec 90%, le compteur tombe à zero très rapidement !

Avec d'autres EA trouvées ici ou là, j'ai également des résultats totalement différents...
Oui c'est souvent le cas. C'est très important d'avoir une qualité de modelage d'au moins 90%.

La je backtest ton expert sur un autre PC pour pas que ça me prenne trop de RAM.

Je te publierai les résultats dès que c'est fini.

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 13:09
par Brice
Une question : est-ce qu'il faut cocher la case "Optimisation" dans le testeur ?

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 15:13
par Fabien LABROUSSE
Brice a écrit :Une question : est-ce qu'il faut cocher la case "Optimisation" dans le testeur ?
Non pas pour faire un backtest classique.

Une optimisation sert à tester différents paramètre pour un expert afin de voir quels sont les réglages optimaux.

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 17:42
par Fabien LABROUSSE
Voici un backtest sur USD/JPY en H1 avec 90% de fidélité au niveau des graphiques depuis le début de l'année:

http://www.videobourse.fr/backtest/croisement.htm

Image

Comment ça se fait qu'il laisse courir les pertes comme ça?

Re: Erreur 130 sur OrderModify()

Publié : 30 juil. 2010, 17:49
par Brice
Merci.

Pour les pertes, je ne vois pas, il y a suffisamment de suivi du stop pour ne pas les laisser courir !

Il faut que je me replonge dans le code...