Ea está creando múltiples órdenes pendientes/limitadas [Ayuda] - página 2

 
GumRai:

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

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

Gracias GumRai por su pronta respuesta. Mi programa tiene muchas condiciones como las siguientes. He comprobado hasta P12. Es como un pivote. Si las condiciones satisfacen, entonces se abre límite de operaciones en los niveles P1, P2, ....as su número es 12. No quería escribir un código de compra/venta en cada caso. Por eso hice funciones separadas de buycall/sellcall. Abajo mi viejo código para vender.

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

Este es el ejemplo. El mismo comercio colocando en cada garrapata. Necesito colocar esto en cada hora. Como es un pivote por hora.

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

Cuando abres un límite de venta, pones BuyTicket a 0.

A continuación comprueba si BuyTicket==0, por supuesto que sí, lo acaba de establecer.

Luego pones SellTicket a 0.

El siguiente tick, Sellticket==0 así que abres un límite de venta y pones BuyTicket a 0 de nuevo.

y así sucesivamente ............

 
GumRai:

Cuando abres un límite de venta, pones BuyTicket a 0.

A continuación comprueba si BuyTicket==0, por supuesto que sí, lo acaba de establecer.

Luego pones SellTicket a 0.

El siguiente tick, Sellticket==0 así que abres un límite de venta y pones BuyTicket a 0 de nuevo.

y así sucesivamente ............

Entonces debería quitar esas dos líneas que resaltó. Lo he hecho. Ahora muestra solo el resultado de una hora para 2 meses de pruebas de datos.

Otra cosa que noto, en mi sellcall, tengo un comercio inverso en la compra. Si el comercio de venta se detiene entonces el comercio de compra se abrirá. Ahora para la función sellcall devuelve (Selltickets) así que ¿está bien?

Gracias

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

Ahora entiendo en este código, primero comprueba sellticket == 0 sí obvio, entonces colocó la orden de venta, siguiente buyticket == 0 sí, siguiente coloca la orden de compra ... pero cuando el retorno ... de nuevo comprobar sellticket == 0 , no su ahora ... así que es por eso Ea detuvo después de tomar un conjunto. Pero como eliminar este problema. En mi EA las órdenes pendientes inactivas se eliminan cada 59 minutos desde la hora de inicio. Lo he configurado así.

 

Ahora he cambiado el código de la siguiente manera, que la lectura de todo el apoyo y la resistencia.

Tengo un máximo de 6 soportes y 6 resistencias para una hora. Entre esos 6 que cumplen las condiciones, entonces abre órdenes de límite en esos 6. Si 1 cumple entonces abre órdenes de límite para ese. Este es el algo.

Así que he establecido el código de la siguiente manera para la llamada de la función.

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
    
   }   
return(0);
}

int SellCall(double SC)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);
  
   } 
   return(0);
}

Ahora se ejecuta durante una hora y comprueba 6 niveles para cada compra/venta. Pero sólo se ejecuta durante una hora. Que hacer aquí para que se ejecute perfectamente para todo el conjunto de datos.

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

Esto sólo funcionará en el probador de estrategias y no hará nada más una vez que se abran las primeras 6 órdenes.

No se puede utilizar un número de entrada para una prueba de esta manera

 
GumRai:

Esto sólo funcionará en el probador de estrategias y no hará nada más una vez que se abran las primeras 6 órdenes.

No se puede utilizar un número de entrada para una prueba de esta manera

Gracias por su respuesta.

Entonces que debo hacer. Si quito el BuyTicket =>0 o cualquier condición de BuyTicket. Entonces el EA está tomando muchas operaciones iguales con cada tick.....Dándome error de fin de orden de 148.

 
cashcube: Entonces, ¿qué debo hacer?
Anteriormente contestado.
 
cashcube:

Gracias por su respuesta.

Entonces, ¿qué debo hacer? Si quito el BuyTicket =>0 o cualquier condición BuyTicket. Entonces EA está tomando muchos mismos oficios con cada tick.....Giving me ordersend error de 148.

No sabemos lo que está tratando de hacer

Si sólo quiere una operación abierta a la vez, compruebe que no hay órdenes abiertas antes de enviar una nueva.

Si sólo quiere una operación por barra, compruebe sólo una vez por barra

Si quiere una combinación de condiciones, pruebe la combinación.