Besoin d'aide avec l'erreur #130 "invalid stoploss". - page 3

 
Même problème. L'ordre s'ouvre bien avec stoploss = 0 et takeprofit = 0.
Mais ensuite OrderModify échoue.

Le code ci-dessous est exécuté après le code ci-dessus du dernier post.

   bool modify = false;
   entry_price = OrderOpenPrice();
   if(long) {  
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Red);  
   } else {    
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Green); 
   }
   Log("[5] SL: " + SL);
   Log("[5] TP: " + TP);
   
   if(!modify) {
      Log("error="+GetLastError());
      return(-1);
   }

Le journal est :

#ESZ1,M5 : Position d'ouverture
#ESZ1,M5 : tickvalue : 12.50000000
#ESZ1,M5 : Taille de la position : 1.00000000
#ESZ1,M5 : Demande/offre 1242.00000000/1241.75000000
#ESZ1,M5 : Spread 0.25000000
#ESZ1,M5 : open #13679252 buy 1.00 #ESZ1 at 1242.00 ok
#ESZ1,M5 : Ordre 13679252 ouvert avec succès
#ESZ1,M5 : SL : 1241.25000000
#ESZ1,M5 : TP : 1242.25000000
#ESZ1,M5 : error=130

Donc, même l'ouverture et le réglage du stoploss ne semblent pas fonctionner :-/
 

L'écart est de 0.25

#ESZ1,M5 : Spread 0.25000000

OK, vous ouvrez un BUY à ... 1242.00 (Ask)

#ESZ1,M5 : open #13679252 buy 1.00 #ESZ1 at 1242.00 ok

#ESZ1,M5 : Ordre 13679252 ouvert avec succès

Ensuite, vous essayez de modifier avec un TP au prix d'achat + 2 * Spread et un SL au prix d'achat - 2 * Spread.

#ESZ1,M5 : SL : 1241.25000000

#ESZ1,M5 : TP : 1242.25000000

Si votre FreezeLevel est de 0.50, alors c'est votre problème... quel est votre FreezeLevel ?

 
shinobi:
Même problème. L'ordre s'ouvre bien avec stoploss = 0 et takeprofit = 0.
Mais ensuite OrderModify échoue.

Pas de réglage pour les courtiers à 4/5 chiffres. Ne pas ouvrir d'abord et ensuite fixer des arrêts.

Comme répondu précédemment

 

Oui, vous traitez probablement avec un courtier ECN, vous devez ouvrir des ordres avec des stops nuls, puis modifier l'ordre après qu'il a été ouvert, il y a donc un problème avec 50 pips SL et TP, donc faites comme Raptor a dit vérifier le niveau de gel et de stoplevel aussi juste au cas où.

Vérifiez également votre code OrderModify() .... peut-être que cela fonctionne de cette façon, mais je pense que vous devriez sélectionner l'ordre en utilisant OrderSelect() avant de pouvoir faire OrderOpenPrice().

 
Merci encore pour votre aide !
Hélas, le numéro 130 continue de me hanter la nuit ;)

Voici mon prochain essai :

   double stoploss = 50;
   double SL = 0.0;
   
   //open position
   if(long)  //take long position
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);  
   else     //take short position
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, 0, 0, "", 12345); 
   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Order "+result_ticket+" Successfully Opened");

   //select order
   if (!OrderSelect(result_ticket, SELECT_BY_TICKET)) {
      Log("error="+GetLastError());
      return(-1);
   }    
   entry_price = OrderOpenPrice();
   
   //check stoplevel
   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

   //checl freezelevel
   double freezelevel = MarketInfo(Symbol(), MODE_FREEZELEVEL);
   Log("Freezelevel: " + freezelevel);
   Log("stoploss: " + stoploss);
   if(stoploss < freezelevel)
      stoploss = freezelevel + 1;
   
   if(long)
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
   else
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
   Log("SL: " + SL*pips2dbl);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Stoploss successfully set");

Comme vous pouvez le voir, j'ai simplifié l'exemple en n'utilisant pas le takeprofit. L'erreur se produit définitivement à cause du stoploss, donc nous n'avons pas besoin de takeprofit.
J'ouvre d'abord l'ordre avec 0 stoploss (et takeprofit) et j'essaie ensuite de définir le stoploss en utilisant OrderModify.
Avant cela, je vérifie Mode_Stoplevel et Mode_Freezelevel et ajuste le stoploss, si nécessaire. (Un ajustement se produit ci-dessous dans le journal, parce que le stoploss est initialement de 50, mais le Mode_Stoplevel est de 75, je fixe alors le stoploss au Mode_Stoplevel + 1, donc 76).

RaptorUK et SDC :
MarketInfo(MODE_FREEZELEVEL) retourne 0. Je ne pense pas que Freezelevel soit le problème.
J'ai inclus la sortie dans le fichier journal.

SDC :
J'ai également inséré un OrderSelect, avant d'appeler OrderOpenPrice, juste pour être sûr. Dans le journal, vous pouvez voir que l'OrderSelect a fonctionné, sinon le code ne serait pas allé aussi loin (exit -1).

WHRoeder :
J'ai suivi l'exemple simple de SDC. Mais je l'ai maintenant étendu en utilisant l'ajustement des pips à 4/5 chiffres lors de la définition du stoploss, comme vous pouvez le voir ci-dessus. Vous pouvez également voir que l'ordre est d'abord ouvert avec le stoploss et le takeprofit fixés à zéro, puis le stoploss est fixé avec OrderModify. Comme vous pouvez le voir dans le journal ci-dessous, avec le S/L et le T/P fixés à zéro, l'ordre s'ouvre avec succès, mais je ne parviens toujours pas à fixer le S/L à l'étape suivante avec OrderModify.

Voici le journal complet :

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/15 9:24
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56489.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: pos size: 1
#ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok 
#ESZ1,M5: Order 13697436 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 12.51260000
#ESZ1,M5: error=130

Je vous suis vraiment reconnaissant pour votre aide continue et je pense que nous sommes en train de réduire le problème :)
Alors, qu'est-ce qui pourrait être le problème ? Quelque chose d'autre que je pourrais essayer ?

shinobi
 
RaptorUK:

L'écart est de 0.25

#ESZ1,M5 : Spread 0.25000000

OK, vous ouvrez un BUY à ... 1242.00 (Ask)

#ESZ1,M5 : open #13679252 buy 1.00 #ESZ1 at 1242.00 ok

#ESZ1,M5 : Ordre 13679252 ouvert avec succès

Puis vous essayez de modifier avec un TP au prix d'achat + 2 * Spread et un SL au prix d'achat - 2 * Spread.

Votre STOP_LEVEL n'est pas 3 * Spread ? votre Stop est trop proche ....

#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
 
Hey Raptor,

Ouais c'est pourquoi je vérifie le stoplevel ici (du code ci-dessus) :

   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

Donc, dans le dernier exemple, le stoploss a été fixé à 76, ce qui correspond à 3*Spread +1.
Cela devrait être suffisamment éloigné, non ?
 
shinobi:
Hey Raptor,

Oui, c'est pourquoi je vérifie le stoplevel ici (à partir du code ci-dessus) :


Donc, dans le dernier exemple, le stoploss a été fixé à 76, ce qui correspond à 3*Spread +1.
Cela devrait être assez loin, non ?
Oui, mais je me demande si vous n'avez pas un problème d'arrondi et si vous n'avez pas besoin d'arrondir à la valeur la plus proche de 0,25 (le S&P500 se déplace par pas de 0,25) pour que votre SL soit à l'écart de STOP_LEVEL de 0,25 ou plus... si vous voyez ce que je veux dire ?
 
Bonne idée, mais hélas cela n'a pas aidé non plus.
Voici ce que j'ai fait.

J'ai d'abord écrit une fonction personnalisée pour arrondir les doubles au double le plus proche :
.
double DoubleRound(double number, double step)
{
    double mod = MathMod(number, step);
    if(mod < step/2.0)
      step = 0;
    double rounded = number - mod + step;
    return (rounded);
}

Elle fait ce que vous attendez. Si vous l'appelez avec DoubleRound(1237.687360000), elle renvoie 1237.50.

Je l'ai ensuite utilisée sur mon S/L juste avant d'appeler OrderModify. Et j'ai utilisé MODE_TICKVALUE, qui est de 0,25 pour #ESZ1.
Donc :

   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKVALUE));

 
  Log("SL: " + SL);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }

Dans le journal, vous pouvez voir que l'arrondi a bien fonctionné. Cependant, le stoploss a toujours été rejeté :/

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 7:44
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56364.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Opening Position
#ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok 
#ESZ1,M5: Order 13708089 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: error=130

Je ne peux pas imaginer ce que le problème pourrait être d'autre ! Ce #130 est vraiment persistant !!!
 

Vous avez ouvert une vente

#ESZ1,M5 : open #13708089 sell 1.00 #ESZ1 at 1239.75 ok

et vous avez essayé de mettre un SL en dessous...

#ESZ1,M5 : SL : 1237.50000000

#ESZ1,M5 : error=130