Problema con la cantidad total de órdenes abiertas - página 3

 
Tienes que mostrar todo tu código modificado.
 
Imprima sus variables antes y dentro de las sentencias if y descubra por qué.
 
WHRoeder:
Imprime tus variables antes y dentro de las sentencias if y averigua por qué.

Ok gracias, lo haré e investigaré más sobre esto. También encontré este trozo de código que me intriga porque el SL y el TP están separados del OrderSend. Miraré esto también

ticket = OrderSend( Symbol(), OP_SELL, getPositionSize(), Bid, 3, 0, 0, "Basic CCI EA", magic, 0 , Red );
         OrderModify( ticket, OrderOpenPrice(), Bid + SL, Bid - TP, 0 );
 

Hola a todos

He solucionado la mayoría de mis problemas y el EA funciona bien en el tester, pero sigo teniendo problemas con OrdersTotal. En el modo Demo a veces abre las dos órdenes pendientes de Stop, pero la mayoría de las veces sólo la de compra o la de venta. Quiero que las dos órdenes pendientes se abran al mismo tiempo (en unos pocos segundos), pero sólo si no hay otras órdenes u órdenes pendientes abiertas. Creo que lo que ocurre es que a veces abre las dos órdenes pendientes antes de tener la oportunidad de calcular el número de órdenes, y otras veces se da cuenta de que una orden pendiente fue enviada, y no abre la otra. Pensaba que si ponía las órdenes pendientes entre corchetes ejecutaría ambas cuando se cumpliera la condición if... Ahora también sé que seguirá abriendo las órdenes pendientes cuando las elimine mientras se forme la última vela, es decir, mientras la variable Time coincida con la vela Time[0], los ticks son irrelevantes.

Aquí está ese trozo de código:

extern datetime StartTime1 = D'2016.03.15 15:05';
int start(){
int buy_ticket=0, sell_ticket=0, buystop_ticket=0, sellstop_ticket=0, total=0;
   for(int i= OrdersTotal()-1; i>= 0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==magic && OrderSymbol()==Symbol())
        {
         total++;
         if(OrderType()==OP_BUYSTOP) buystop_ticket=OrderTicket();
         if(OrderType()==OP_SELLSTOP) sellstop_ticket=OrderTicket();
         if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
         if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
        }

   if(total==0 && Time[0]==StartTime1)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
     }

¿Hay alguna forma mejor o más fácil de hacer esto? Gracias

 
Trader3000:

Hola a todos

He solucionado la mayoría de mis problemas y el EA funciona bien en el tester, pero sigo teniendo problemas con OrdersTotal. En el modo Demo a veces abre las dos órdenes pendientes de Stop, pero la mayoría de las veces sólo la de compra o la de venta. Quiero que las dos órdenes pendientes se abran al mismo tiempo (en unos pocos segundos), pero sólo si no hay otras órdenes u órdenes pendientes abiertas. Creo que lo que ocurre es que a veces abre las dos órdenes pendientes antes de tener la oportunidad de calcular el número de órdenes, y otras veces se da cuenta de que una orden pendiente fue enviada, y no abre la otra. Pensaba que si ponía las órdenes pendientes entre corchetes ejecutaría ambas cuando se cumpliera la condición if... Ahora también sé que seguirá abriendo las órdenes pendientes cuando las elimine mientras se forme la última vela, es decir, mientras la variable Time coincida con la vela Time[0], los ticks son irrelevantes.

Aquí está ese trozo de código:

¿Hay alguna forma mejor o más fácil de hacer esto? Gracias

¿Estás comprobando el valor de buystop_ticket y sellstop_ticket? Si sólo hay 1 abierto, el segundo nunca estará abierto (a menos que elimines el primero manualmente).
 
Trader3000 También encontré este trozo de código que me intriga porque el SL y el TP están separados del OrderSend.
ticket = OrderSend( Symbol(), OP_SELL, getPositionSize(), Bid, 3, 0, 0, "Basic CCI EA", magic, 0 , Red );
         OrderModify( ticket, OrderOpenPrice(), Bid + SL, Bid - TP, 0 );
Cuando los brokers ECN empezaron, el OrderSend fallaba con el SL/TP establecido. La mayoría ha arreglado esto desde la versión 600.
 
zirkoner:
¿Estás comprobando el valor de buystop_ticket y sellstop_ticket? Si sólo hay 1 abierto, el segundo nunca estará abierto (a menos que elimine el primero manualmente).

Gracias por la respuesta. En realidad, tanto las órdenes de buystop como de sellstop se abren aproximadamente el 50% de las veces. El otro 50% de las veces se envía la orden de compra o la de venta. Pero he descubierto algo. Pregunté por el último error y en los casos en los que ambos se envían, no hay errores, pero cuando sólo uno se abre, me da el error 130 en el que no se abrió. Así que parece que mis paradas no son válidas, pero no sé por qué. Aquí está el código para SL:

extern int StopLossOriginal=11;

int start(){
int stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
   if(StopLossOriginal<=stoplevel) StopLossOriginal=stoplevel;

double point=Point*10,
       Price=Pipmove*point,
       SL=(StopLossOriginal-Pipmove)*point;

 if(total==0 && (Time[0]==time1)
     {
      buystop_ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Price,30,Ask-SL,0,"Pending",magic,0,Lime);
      Print("Buystop ticket =",buystop_ticket);
      sellstop_ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-Price,30,Bid+SL,0,"Pending",magic,0,Red);
      Print("Sellstop ticket =",sellstop_ticket);
     }

También añadí la función de impresión. ¿Es eso lo que querías decir con "Está comprobando el valor de buystop_ticket y sellstop_ticket? "? Devuelve dos valores a saber:

2016.03.24 17:11:22.532 News_v10 GBPUSD,M1: Buystop ticket =-1

2016.03.24 17:11:23.227 News_v10 GBPUSD,M1: Buystop ticket =49644335



 
WHRoeder:
Cuando los brokers ECN empezaron, el OrderSend fallaba con el SL/TP establecido. La mayoría ha solucionado esto desde la build 600. Gracias por tu respuesta.
Gracias por su respuesta, yo también probé esto pero no hizo ninguna diferencia, estoy en la build 950
 
Trader3000:

Gracias por la respuesta. En realidad, tanto las órdenes de buystop como de sellstop se abren aproximadamente el 50% de las veces. El otro 50% de las veces se envía la orden de compra o la de venta. Pero he descubierto algo. Pregunté por el último error y en los casos en los que ambos se envían, no hay errores, pero cuando sólo uno se abre, me da el error 130 en el que no se abrió. Así que parece que mis paradas no son válidas, pero no sé por qué. Aquí está el código para SL:

También añadí la función de impresión. ¿Es eso lo que querías decir con "Está comprobando el valor de buystop_ticket y sellstop_ticket? "? Devuelve dos valores a saber:

2016.03.24 17:11:22.532 News_v10 GBPUSD,M1: Buystop ticket =-1

2016.03.24 17:11:23.227 News_v10 GBPUSD,M1: Buystop ticket =49644335



Necesitas añadir RefreshRates() entre tus 2 OrderSend().
 
zirkoner:
Tienes que añadir RefreshRates() entre tus 2 OrderSend().
Whoot Whoot! Eso funcionó. Muchas gracias