EA mescola ordini BUY e SELL

 
Salve,

Sto cercando di codificare un EA e in qualche punto del mio codice devo aggiornare lo stoploss degli ordini aperti e pendenti. Sto visualizzando un avviso con le informazioni sull'ordine.

Quando lo eseguo, ricevo un messaggio del tipo: "Count: 2 Stoploss 1.44705 per ordine di acquisto: 46450421 orderType: 1".

orderType: 1 significa che l'ordine 46450421 è un ordine OP_SELL, e lo è, ma perché scatta il test "if ((orderType == OP_BUY || orderType == OP_BUYSTOP))" invece di "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


Per favore aiutatemi :-)

Daniel
 

 
ubzen:


Ho aggiornato il post.
 

Per cominciare, prova a usare le rappresentazioni integrali ed esegui di nuovo il test. Vedi se questo risolve il tuo problema e poi ne riparliamo. Edit: Penso che questo abbia qualcosa a che fare con il fatto che ordertype inizierà da 0. E orderselect manterrà l'ultimo ordine selezionato al suo posto.

 
ubzen:

Per cominciare, prova a usare le rappresentazioni integrali ed esegui di nuovo il test. Vedi se questo risolve il tuo problema e poi ne riparliamo.

Non è cambiato nulla. Quello che non capisco è che nel messaggio di avviso, OrderType() è uguale a 1, il che significa che è un ordine di vendita. ed è davvero un ordine di vendita, ma il codice dell'ordine di acquisto viene eseguito. Sono davvero perso. Ho provato a fare un ciclo fino a quando OrderSelect(...) ritorna true, come appare nel codice sopra. Ho pensato che forse non poteva selezionare l'ordine. Ma con o senza di esso fa esattamente lo stesso.
 
ubzen:

Edit: Penso che questo abbia qualcosa a che fare con il fatto che ordertype inizierà da 0. E orderselect manterrà l'ultimo ordine selezionato.

Potrebbe essere . . .

Prova a dichiarare orderType come qualcosa che non può essere . . . ad es.

int orderType = 10;

. . . poi vedi cosa succede, se non ottieni nessun messaggio allora la selezione dell'ordine non funziona.

 
RaptorUK:

Potrebbe essere . . .

Prova a dichiarare orderType come qualcosa che non può essere. . . ad es.

. . . poi vedi cosa succede, se non ottieni nessun messaggio allora la tua selezione dell'ordine non funziona.


Funziona esattamente allo stesso modo se prima dichiaro: int orderType = 10;

Ho anche provato a usare OrderType() sempre invece di dichiarare una variabile, ma c'è lo stesso problema.

Ho anche provato a chiamare OrderSelect(...) appena prima di modificare l'ordine, ma nessun cambiamento.

 
Lo stai testando nel back-tester o in un account demo?
 
ubzen:
Lo stai testando nel back-tester o in un account demo?

Sto testando dal vivo. Ho messo l'EA su un grafico per vedere cosa fa e sto usando la casella di controllo "Chiedi conferma".
 

Aggiungete qualche istruzione Print(); in modo da poter vedere cosa sta andando storto. . . ad es.

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

. . . poi date un'occhiata nella scheda Esperti.

 
È possibile che il problema derivi dall'uso della conferma manuale dei salari?