A EA mistura pedidos de compra e venda

 
Hi,

Estou tentando codificar um EA e em algum lugar do meu código tenho que atualizar o arquivamento de pedidos abertos e pendentes. Estou exibindo um alerta com as informações sobre o pedido.

Quando o executo, recebo uma mensagem como: "Conte": 2 Stoploss 1.44705 para pedido de compra: 46450421 tipo de pedido: 1".

orderType: 1 significa que o pedido 46450421 é um pedido OP_SELL, que é, mas por que ele aciona o teste "if ((orderType == OP_BUY || orderType == OP_BUYSTOP)" ao invés de "if ((orderType == OP_SELLL || 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


Por favor, ajude :-)

Daniel
 

 
ubzen:


Atualizei o posto.
 

Para começar, tente usar as representações do Integer e faça o teste novamente. Veja se isso resolve seu problema e então falaremos um pouco mais sobre isso. Editar: acho que isto tem algo a ver com o fato de que o tipo de pedido começará em 0. E o orderselect manterá o último pedido selecionado no lugar.

 
ubzen:

Para começar, tente usar as representações do Integer e faça o teste novamente. Veja se isso resolve seu problema e então falaremos um pouco mais sobre isso.

Não mudou nada. O que eu não entendo é que na mensagem de alerta, OrderType() é igual a 1, o que significa que é uma ordem de venda. e é realmente uma ordem de venda, mas o código da ordem de compra é executado. Eu estou realmente perdido. Tentei fazer um loop até que OrderSelect(...) retorne verdadeiro, como aparece no código acima. Pensei que talvez ele não pudesse selecionar a ordem. Mas com ela ou sem ela, faz exatamente o mesmo.
 
ubzen:

Editar: acho que isto tem algo a ver com o fato de que o tipo de pedido começará em 0. E o orderselect manterá o último pedido selecionado no lugar.

Poderia ser . . .

Tente declarar OrderType como algo que não pode ser . . . por exemplo

int orderType = 10;

. . então veja o que acontece, se você não receber nenhuma mensagem então sua seleção de pedido não está funcionando.

 
RaptorUK:

Poderia ser . . .

Tente declarar a ordemType como algo que não pode ser . . . por exemplo

. . então veja o que acontece, se você não receber nenhuma mensagem então a seleção do seu pedido não está funcionando.


Funciona exatamente o mesmo se eu declarar primeiro: int orderType = 10;

Também tentei usar OrderType() sempre ao invés de declarar uma variável, mas há o mesmo problema.

Eu também tentei chamar OrderSelect(...) pouco antes de modificar a ordem, mas sem mudanças.

 
Você está testando isso no testador ou em uma conta demo?
 
ubzen:
Você está testando isso no contra-teste ou em uma conta demo?

Estou testando ao vivo. Coloco o EA em um gráfico e vejo o que ele faz e estou usando a caixa de seleção "Pedir confirmação".
 

Acrescente em algumas Print(); declarações para que você possa ver o que está dando errado . . . por exemplo

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

. . então dê uma olhada na guia Especialistas.

 
É possível que o problema venha do uso de confirmação manual de salarias?