EA mischt BUY- und SELL-Aufträge

 
Hallo,

Ich versuche, einen EA zu programmieren, und an irgendeiner Stelle in meinem Code muss ich den Stoploss von offenen und schwebenden Aufträgen aktualisieren. Ich zeige eine Warnung mit den Informationen über die Bestellung.

Wenn ich ihn ausführe, erhalte ich eine Meldung wie: "Count: 2 Stoploss 1.44705 für Kaufauftrag: 46450421 orderType: 1".

orderType: 1 bedeutet, dass die Order 46450421 eine OP_SELL-Order ist, was sie auch ist, aber warum löst sie den Test "if ((orderType == OP_BUY || orderType == OP_BUYSTOP))" anstelle von "if ((orderType == OP_SELL || orderType == OP_SELLSTOP))" aus?

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


Bitte um Hilfe :-)

Daniel
 

 
ubzen:


Ich habe den Beitrag aktualisiert.
 

Versuchen Sie zunächst, die Integer-Darstellungen zu verwenden, und führen Sie den Test erneut durch. Schauen Sie, ob das Ihr Problem löst, dann werden wir weiter darüber sprechen. Edit: Ich denke, das hat etwas mit der Tatsache zu tun, dass ordertype bei 0 beginnt und orderselect die zuletzt ausgewählte Bestellung beibehält.

 
ubzen:

Versuchen Sie zunächst, die Integer-Darstellungen zu verwenden, und führen Sie den Test erneut durch. Schauen Sie, ob das Ihr Problem löst, dann werden wir weiter darüber sprechen.

Es hat sich nichts geändert. Was ich nicht verstehe, ist, dass in der Warnmeldung OrderType() gleich 1 ist, was bedeutet, dass es sich um eine Verkaufsorder handelt. und es ist wirklich eine Verkaufsorder, aber der Code der Kauforder wird ausgeführt. Ich bin wirklich ratlos. Ich habe versucht, eine Schleife zu bilden, bis OrderSelect(...) true zurückgibt, wie es im obigen Code erscheint. Ich dachte, dass es die Order vielleicht nicht auswählen kann. Aber ob mit oder ohne, es macht genau das Gleiche.
 
ubzen:

Edit: Ich denke, das hat etwas damit zu tun, dass ordertype bei 0 beginnt und orderselect den zuletzt ausgewählten Auftrag beibehält.

Könnte sein . . .

Versuchen Sie orderType als etwas zu deklarieren , das es nicht sein kann . . . z.B .

int orderType = 10;

. . . dann sehen Sie, was passiert, wenn Sie keine Meldungen erhalten, dann funktioniert Ihre Auftragsauswahl nicht.

 
RaptorUK:

Könnte sein . . .

Versuchen Sie, orderType als etwas zu deklarieren , das es nicht sein kann . . . z.B .

. . . und sehen Sie, was passiert, wenn Sie keine Meldungen erhalten, dann funktioniert Ihre Bestellungsauswahl nicht.


Es funktioniert genau so, wenn ich zuerst deklariere: int orderType = 10;

Ich habe auch versucht, OrderType() immer zu verwenden, anstatt eine Variable zu deklarieren, aber es gibt das gleiche Problem.

Ich habe auch versucht, OrderSelect(...) kurz vor dem Ändern der Bestellung aufzurufen, aber keine Änderung.

 
Testen Sie dies im Backtester oder in einem Demo-Account?
 
ubzen:
Testen Sie dies im Backtesting oder mit einem Demo-Konto?

Ich teste live. Ich setze den EA auf einen Chart und schaue, was er macht, und ich verwende das Kontrollkästchen "Nach Bestätigung fragen".
 

Fügen Sie einige Print()-Anweisungen ein, damit Sie sehen können, was schief läuft, z. B.

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

. . . dann sehen Sie sich die Registerkarte Experten an.

 
Ist es möglich, dass das Problem auf die Verwendung der manuellen Bestätigung der Gehälter zurückzuführen ist?