EA mélange les ordres d'ACHAT et de VENTE

 
Bonjour,

J'essaie de coder un EA et à un certain endroit dans mon code je dois mettre à jour le stoploss des ordres ouverts et en attente. J'affiche une alerte avec les informations sur l'ordre.

Quand je l'exécute, je reçois un message comme : "Count : 2 Stoploss 1.44705 pour ordre d'achat : 46450421 orderType : 1".

Le type d'ordre : 1 signifie que l'ordre 46450421 est un ordre OP_SELL, ce qu'il est, mais pourquoi déclenche-t-il le test "if ((orderType == OP_BUY || orderType == OP_BUYSTOP))" au lieu de "if ((orderType == OP_SELL || orderType == OP_SELLSTOP))" ?

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();
      if(/*OrderMagicNumber()==Magic &&*/ OrderSymbol()==Symbol())
      {      
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {
            if (!(isSLinTheZone && areBuyOrdersInProfitAt(NormalizeDouble(Low[1] - NbPipsTolerance*Point*10,Digits))))
               if (NormalizeDouble(OrderStopLoss(), Digits) != longSL) { 
                  if (Debug) {
                     Alert("LongSL: " + longSL);
                     Alert("Order SL: " + NormalizeDouble(OrderStopLoss(), Digits));
                     Alert("Modif required");
                     Alert("Count: " + cnt + " Stoploss " + longSL + " for buy order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), longSL, OrderTakeProfit(),0, Yellow);
                  //cnt = total-1;
               }
         }
         
         if ((orderType == OP_SELL || orderType == OP_SELLSTOP)) { 
            if (!(isSLinTheZone && areSellOrdersInProfitAt(NormalizeDouble(High[1] + NbPipsTolerance*Point*10 + Spread*Point*10,Digits))))
               if (NormalizeDouble(OrderStopLoss(), Digits) != shortSL) { 
                  if (Debug) {
                     Alert("ShortSL: " + shortSL);
                     Alert("Order SL: " + NormalizeDouble(OrderStopLoss(), Digits));
                     Alert("Modif required");
                     Alert("Count: " + cnt + " Stoploss " + shortSL + " for sell order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), shortSL, OrderTakeProfit(),0, Yellow);
                  //cnt = total-1; 
               }
         }   
      } // end of if
   } // end of for


Veuillez m'aider :-)

Daniel
 

 
ubzen:


J'ai mis à jour le post.
 

Pour commencer, essayez d'utiliser les représentations des nombres entiers et recommencez le test. Voyez si cela résout votre problème et nous en reparlerons. Edit : Je pense que cela a quelque chose à voir avec le fait que ordertype commencera à 0. Et orderselect gardera la dernière commande sélectionnée en place.

 
ubzen:

Pour commencer, essayez d'utiliser les représentations des nombres entiers et recommencez le test. Voyez si cela résout votre problème et nous en reparlerons.

Cela n'a rien changé. Ce que je ne comprends pas, c'est que dans le message d'alerte, OrderType() est égal à 1, ce qui signifie qu'il s'agit d'un ordre de vente. Et c'est vraiment un ordre de vente, mais le code de l'ordre d'achat est exécuté. Je suis vraiment perdu. J'ai essayé de boucler jusqu'à ce que OrderSelect(...) renvoie true, comme il apparaît dans le code ci-dessus. J'ai pensé que peut-être il ne pouvait pas sélectionner l'ordre. Mais avec ou sans, cela fait exactement la même chose.
 
ubzen:

Edit : Je pense que cela a quelque chose à voir avec le fait que ordertype commencera à 0. Et orderselect gardera la dernière commande sélectionnée en place.

Cela pourrait être...

Essayez de déclarer orderType comme quelque chose qu'il ne peut pas être... par ex.

int orderType = 10;

... et voyez ce qui se passe. Si vous n'obtenez aucun message, c'est que la sélection des ordres ne fonctionne pas.

 
RaptorUK:

Cela pourrait être...

Essayez de déclarer orderType comme quelque chose qu'il ne peut pas être ... par ex.

... et voyez ce qui se passe, si vous n'obtenez aucun message, c'est que votre sélection de commandes ne fonctionne pas.


Cela fonctionne exactement de la même manière si je déclare d'abord : int orderType = 10 ;

J'ai également essayé d'utiliser OrderType() toujours au lieu de déclarer une variable, mais il y a le même problème.

J'ai également essayé d'appeler OrderSelect(...) juste avant de modifier la commande, mais aucun changement.

 
Est-ce que vous testez cela dans le back-tester ou dans un compte de démonstration ?
 
ubzen:
Faites-vous ce test dans le back-tester ou dans un compte de démonstration ?

Je teste en direct. Je place l'EA sur un graphique pour voir ce qu'il fait et j'utilise la case à cocher "Demander confirmation".
 

Ajoutez quelques instructions Print() ; pour voir ce qui ne va pas, par exemple.

if(/*OrderMagicNumber()==Magic &&*/ OrderSymbol()==Symbol())
      {      
         Print("orderType = ",orderType);
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {

... puis jetez un coup d'œil à l'onglet Experts.

 
Est-il possible que le problème vienne de l'utilisation de la confirmation manuelle des salaires ?
Raison: