EA mezcla órdenes de COMPRA y VENTA

 
Hola,

Estoy tratando de codificar un EA y en algún lugar de mi código tengo que actualizar el stoploss de las órdenes abiertas y pendientes. Estoy mostrando una alerta con la información sobre la orden.

Cuando lo ejecuto, recibo un mensaje como: "Count: 2 Stoploss 1.44705 para orden de compra: 46450421 orderType: 1".

orderType: 1 significa que la orden 46450421 es una orden OP_SELL, que lo es, pero ¿por qué se activa la prueba "if ((orderType == OP_BUY || orderType == OP_BUYSTOP))" en lugar 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


Por favor, ayuda :-)

Daniel
 

 
ubzen:


He actualizado el post.
 

Para empezar, prueba a utilizar las representaciones de los números enteros y vuelve a realizar la prueba. A ver si eso resuelve tu problema y luego lo comentamos un poco más. Edición: Creo que esto tiene que ver con el hecho de que ordertype comenzará en 0. Y orderselect mantendrá el último orden seleccionado en su lugar.

 
ubzen:

Para empezar, prueba a utilizar las representaciones de los números enteros y vuelve a realizar la prueba. A ver si así se soluciona tu problema y luego hablamos un poco más de ello.

No ha cambiado nada. Lo que no entiendo es que en el mensaje de alerta, OrderType() es igual a 1, lo que significa que es una orden de venta. y realmente es una orden de venta, pero se ejecuta el código de la orden de compra. Estoy realmente perdido. He intentado hacer un bucle hasta que OrderSelect(...) devuelva true, como aparece en el código anterior. Pensé que quizás no podía seleccionar la orden. Pero con o sin ella hace exactamente lo mismo.
 
ubzen:

Edición: Creo que esto tiene algo que ver con el hecho de que ordertype comenzará en 0. Y orderselect mantendrá la última orden seleccionada en su lugar.

Podría ser...

Prueba a declarar orderType como algo que no puede ser. . . por ejemplo

int orderType = 10;

. . . y vea lo que sucede, si no recibe mensajes entonces su selección de órdenes no está funcionando.

 
RaptorUK:

Podría ser...

Intente declarar orderType como algo que no puede ser. . . por ejemplo

. . y luego vea lo que sucede, si no recibe ningún mensaje entonces su selección de orden no está funcionando.


Funciona exactamente igual si primero declaro: int orderType = 10;

También he probado a usar siempre OrderType() en lugar de declarar una variable, pero hay el mismo problema.

También he probado a llamar a OrderSelect(...) justo antes de modificar el pedido, pero no hay cambios.

 
¿Lo estás probando en el back-tester o en una cuenta de demostración?
 
ubzen:
¿Estás probando esto en el back-tester o en una cuenta de demostración?

Estoy probando en vivo. Pongo el EA en un gráfico y veo lo que hace y estoy usando la casilla "Pedir confirmación".
 

Añade algunas sentencias Print(); para que puedas ver lo que va mal. . . por ejemplo

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

. . luego eche un vistazo en la pestaña de Expertos.

 
¿Es posible que el problema provenga del uso de la confirmación manual de salaires?
Razón de la queja: