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

 
GumRai:

No sabemos qué está intentando 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, pruebe sólo una vez por barra

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

Lo explico aquí:

Tengo un máximo de 6 soportes y 6 resistencias para cada hora. Pueden ser 2 soportes y 2 resistencias o cualquier cosa, pero un máximo de 6 soportes y 6 resistencias para cada hora.

Quiero abrir una orden limitada en esos niveles S/R al comienzo de cada hora.

He creado una función de compra y una función de venta... para no tener que escribir el mismo código de compra/venta para un total de 12 niveles S/R.

Ahora, cuando usé el siguiente código:

int SellCall(double SC)
{
   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);
}

Crea múltiples órdenes iguales:

He utilizado el códigoWHRoeder también. En una función separada. Como no puedo declarar la función dentro de una función.

 

Tu problema no es la función que has puesto, tu problema está en el código que llama a la función.

Obviamente no hay ninguna comprobación para ver si los pedidos ya han sido realizados

 
GumRai:

Tu problema no es la función que has puesto, tu problema está en el código que llama a la función.

Obviamente, no hay ninguna comprobación para ver si los pedidos ya se han realizado

código de llamada a la función (snapshot)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

¿Cómo se comprueba que los pedidos ya se han realizado o no? ¿Con condiciones de buyticket > 0?

 
cashcube:

código para llamar a la función (snapshot)

¿Cómo comprobar que los pedidos ya se han realizado o no? ¿Con condiciones buyticket > 0?

Es difícil dar un consejo ya que no sé lo que está haciendo al final de la hora con las órdenes no activadas y cómo está gestionando las órdenes activadas.

Podría crear un array (o 2) declarado globalmente y almacenar los números de ticket de las órdenes abiertas. Antes de abrir una nueva orden, compruebe si el elemento del array que corresponde al nivel tiene un valor >0.

Por supuesto, también tendrá que comprobar los números de ticket y si elimina las órdenes no activadas, poner el elemento del array a 0. También puede necesitar comprobar si la orden se ha cerrado y, dependiendo de su lógica, volver a ponerlo a 0

 
GumRai:

Es difícil dar un consejo ya que no sé lo que estás haciendo al final de la hora con las órdenes no activadas y cómo estás gestionando las órdenes activadas.

Podrías crear un array (o 2) declarado globalmente y almacenar los números de ticket de las órdenes abiertas. Antes de abrir una nueva orden, compruebe que el elemento del array que corresponde al nivel tiene un valor >0.

Por supuesto, también tendrás que comprobar los números de ticket y si eliminas las órdenes no activadas, poner el elemento del array a 0. También puede que tengas que comprobar si la orden se ha cerrado y, dependiendo de tu lógica, volver a ponerlo a 0

Cuando establezco los niveles de expiración de las órdenes no activadas, éstas expiran a las 0:59 o al minuto 59. Para las ordenes activadas se establecen SL y TP.

Anteriormente diseñé Ea que toma una orden de compra o venta en cada hora... no hay problema el código era simple. Pero aquí parece muy difícil.

Ok, voy a tratar de código como usted dijo. Si el problema surge voy a publicar aquí. Además será bueno si usted puede compartir cualquier ejemplo de código simple para contar el número de billete.

Gracias por su sugerencia.

 

Resolví mi problema temporalmente con el siguiente código y ejecutándolo en el gráfico horario. Simple

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
Las barras no son fiables (un refresco/recuperación puede cambiar el número de barras en el gráfico) el volumen no es fiable (se pierden los ticks) Usa siempre el tiempo. Nueva vela - Foro MQL4
 
WHRoeder:
Las barras no son fiables (un refresh/reconnect puede cambiar el número de barras en el gráfico) el volumen no es fiable (se pierden los ticks) Siempre uso el tiempo. Nueva vela - Foro MQL4

Gracias por el código. Lo añadí en la función Tick. Pero ahora mi EA no está tomando ninguna operación. Como uso la función buycall/sell call para colocar órdenes pendientes. No pude añadir esta función dentro de la función.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              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)
{ 
   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);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

¿Alguna idea?

 

Además, la operación inversa en órdenes detenidas tampoco funciona.

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

¿Algo que destacar sobre el código inverso? ¿Por qué no funciona?

Gracias.