Ea está creando múltiples órdenes pendientes/limitadas [Ayuda]

 

Hola, he hecho un Ea, pero cuando hago el backtesting está creando muchas órdenes pendientes iguales en cada tick. Como detener eso. Sólo necesito una orden a la vez, no necesito su copia.

Si ejecuto este EA en un gráfico horario con"precio abierto solamente" entonces no crea copia.

Además, mi EA tiene la opción de invertir el comercio si el límite de compra falla, entonces se abre el comercio de venta. Por favor, también me hizo saber que he configurado correctamente o no. Cualquier ayuda será apreciada.

Gracias por su tiempo.

// Main function//
if(condition)
   {
     if( condition )
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( condition)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
   if ( BuyTicket == 0)
   {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;

   // reverse trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
     }    
   }
      
return(BuyTicket);
}
 
cashcube: Cómo evitarlo.
¿Cómo lo crees? Se comprueba si ya se ha salido antes de abrir una nueva.
 
WHRoeder:
cashcube : Cómo detener eso.
¿Cómo crees? Se comprueba si ya se ha salido antes de abrir uno nuevo.

Entonces, ¿qué hacer? ¿Quitar el código buyticket == 0 & sellticket == 0?
 
Los EA deben estar codificados para recuperarse. Si la energía falla, el sistema operativo se bloquea, el terminal o el gráfico se cierra accidentalmente, en el siguiente tick, cualquier variable de entrada estática/global se habrá perdido. Tendrás una orden abierta pero no lo sabes, por lo que el EA nunca intentará cerrarla, rastrear el SL, etc. ¿Cómo se va a recuperar? Utilice un bucleOrderSelect para recuperar, o un almacenamiento persistente (GV/archivo) de los números de ticket necesarios.
 
WHRoeder:
Los EAs deben estar codificados para recuperarse. Si la energía falla, el sistema operativo se bloquea, el terminal o el gráfico se cierra accidentalmente, en el siguiente tick, cualquier variable estática/global del ticket se habrá perdido. Tendrás una orden abierta pero no lo sabes, por lo que el EA nunca intentará cerrarla, rastrear el SL, etc. ¿Cómo se va a recuperar? Utilice un bucleOrderSelect para recuperar, o un almacenamiento persistente (GV/archivo) de los números de ticket necesarios.

Hola, he añadido que cambiar el código de la siguiente manera.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

Sigue tomando las mismas órdenes múltiples veces con cada garrapata.

Además si quito el signo "!", entonces no toma ninguna operación.

Por último, ¿tengo que eliminar la comprobación de buyticket y sellticket de mi función principal?

Gracias

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. No pegues el código
    Reproducir vídeo
    Por favor, edite su mensaje.
    Para grandes cantidades de código, adjúntalo.

  2. Nunca escribirías if( (2+2 == 4) == true) ¿verdad? if(2+2 == 4) es suficiente. Así que no escribas if(bool == true), sólo usa if(bool) o if(! bool). El código se vuelve autodocumentado cuando usas nombres de variables con sentido, como bool isLongEnabled. Entrada_larga suena como un precio de activación o un número de billete y "si entrada larga" es una frase incompleta.
  3. ¿Dónde se comprueba si BuyTicket se ha cerrado? La selección por ticket siempre será verdadera (dado un número de ticket válido), la orden podría ser cualquiera de las pendientes, abiertas, cerradas o eliminadas.
  4. Has ignorado completamente mi sugerencia de un bucle OrderSelect.
 

Hola WHReder gracias por su respuesta.

Sí, he añadido esos en el código SRC. Pero no se mostró cuando edité.

He eliminado los términos == true como has sugerido.

Por favor, no me malinterpretes, tengo un punto débil en la comprensión de este bucle orderselect. No lo he ignorado. Intenté añadirlo, pero es demasiado complejo, al ejecutarlo muestra 16 errores y 2 advertencias. ¿En ese código qué es MN.Count?

// extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

Sobre la comprobación del ticket de compra cerrado. No lo comprobé porque, comprobé si el precio actual está por debajo del buystoploss entonces la operación de compra se cerró.

 Bid < BuyStopLoss 

Saludos

 

He arreglado el código de alguna manera como esta... Pero muestra 2 errores ahora... "Myselect" y "MyOrdersTotal" puede ser decleared sólo en el ámbito global.

int BuyCall( double BC)
{  
//-----------code
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
   if(!OrderSelect(iWhat, eSelect, ePool) )  return (false);
   int      mn = OrderMagicNumber();
   if(mn < MNB1              )  return (false);
   if(mn > MNB2               )  return (false);
   if(OrderSymbol()      != Pair   )  return (false);
   if(ePool != MODE_HISTORY               )  return (true);
   return(OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){   #define  OP_ALL -1
   if(ePool == MODE_TRADES)            iPos = OrdersTotal()        - 1;
   else                                iPos = OrdersHistoryTotal() - 1;
   for(nOrders=0; iPos >= 0; iPos--) if(
      MySelect(iPos, SELECT_BY_POS, ePool)) if(
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return(nOrders);
}

  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }
      
return(BuyTicket);
}
 
No se puede declarar una función dentro de otra función
 
GumRai:
No se puede declarar una función dentro de otra función

Entonces como puedo hacer esto. Quiero decir que tengo muchas condiciones que comprobar individualmente para abrir una orden de compra/venta.

Es por eso que hice una función buycall/sellcall para hacer el código más fácil.

Es que el EA está tomando muchas operaciones iguales. No sé cómo detener eso.

 
GumRai:
No puedes declarar una función dentro de otra función

cashcube:

Entonces como puedo hacer esto. Quiero decir que tengo muchas condiciones que comprobar individualmente para abrir una orden de compra/venta.

Es por eso que hice una función buycall/sellcall para hacer el código más fácil.

Es sólo que el EA está tomando muchas operaciones iguales. No sé cómo detener eso.

En primer lugar, no trate de declarar una función dentro de otra función.

No puedo entender lo que está tratando de hacer mirando el código que ha publicado. Así que no puedo ayudarte.