ayúdenme por favor [resuelto]

 

Soy nuevo en mql4 y este código abre múltiples órdenes, ¿cómo puedo evitarlo? debería abrir sólo 1 orden hasta que se cierre,

¿Cómo puedo hacer esto?

Gracias

void OnTick()
  {

  
  double up= iIchimoku (NULL, 5,9,26,52,3,0);
  double down= iIchimoku (NULL,5,9,26,52,4,0);

  
  if (MathMin (up,down) < Bid )
  

  OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
    
    
  }
  
 
void OnTick()
  {

  if(OrdersTotal()==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
    }
    
  }
 
muchas gracias señor, ha sido estricto con el punto, no me ha enviado a los círculos
 

Es una solución, pero no es la mejor solución, como aprenderás si continúas.

Pero puede ayudarte en este momento.

 
Marco vd Heijden:

Es una solución, pero no es la mejor solución como usted aprenderá si usted procede.

Pero puede ayudarte en este momento.

si, solucionó el problema en el tema, pero cuando se cierra también crea una nueva orden, si todavía está por encima de la nube. ¿Podría ayudarme a resolver este nuevo problema?

¿Cómo bloquear todas las nuevas órdenes después de cerrar con éxito la primera?

 

Bueno, puedes crear una bandera.

bool order=0;


Entonces puede establecer el valor a uno cuando la orden es colocada.

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
     order=1;
    }
    
  }

Pero le dará la advertencia de que necesita comprobar el valor de retorno de la función ordersend así que

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMin (up,down) < Bid )

     int ticket=OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if(ticket!=-1)
        {
         order=1;
        }
      }
    }
  }

¿Por qué no establecer la bandera dependiendo de si la orden fue colocada con éxito o no?

En ese caso si tu orden falla seguirá intentándolo.

 
mrluck1:

si, solucionó el problema en el tema, pero cuando se cierra también crea una nueva orden, si todavía está por encima de la nube. ¿Podría ayudarme a resolver este nuevo problema?

¿Cómo bloquear todas las nuevas órdenes después de cerrar con éxito la primera?

Como ya ha aludido Marco, probablemente te encontrarás con otros problemas.

¿Qué pasa si hay una orden abierta en otro símbolo?

¿Qué pasa si hay órdenes controladas por otro EA?

¿Y si hay órdenes pendientes?

¿Y si el trigger sigue activo cuando cierras el primero?

En respuesta a esto último, podría utilizar una bandera como Marco ha sugerido. Sólo recuerda que tienes que decidir cuándo restablecer la bandera o el EA no volverá a tomar otra operación.

Alternativamente, usted podría comprobar para un cruce / cambio de estado de abajo / en la nube a por encima de la nube.

 

Puse tu código y dice que el ticket está sin declarar, así que lo declaré, pero ahora el código abre múltiples órdenes, igual que antes, ¿cómo proceder ahora?

void OnTick()
  {

bool order= 0;
int ticket;

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    int ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket!=1)
        {
         order=1;
        }
      }
    }
  }


Y para ser honesto knave: En este ejemplo, es una secuencia de comandos, por lo que sólo 1 comercio está bien
 
mrluck1:

Puse tu código y dice que el ticket está sin declarar, así que lo declaré, pero ahora el código abre múltiples órdenes, igual que antes, ¿cómo proceder ahora?

void OnTick()
  {

bool order= 0;
int ticket;

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    int ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket!=1)
        {
         order=1;
        }
      }
    }
  }


Probablemente te ayudaría leer sobre el alcance de las variables.

¿Qué ocurre con el valor de la orden en cada tick?

 

Bien, entonces declaras la entrada con la bandera booleana.

bool order=0;
int ticket;

Y entonces

void OnTick()
  {

  if(order==0)
    {
     double up= iIchimoku (NULL, 5,9,26,52,3,0);
     double down= iIchimoku (NULL,5,9,26,52,4,0);

     if (MathMax (up,down) < Bid )

    ticket= OrderSend (NULL,0,0.01,Ask,3, Bid-150*Point, Bid+100*Point);
      {
       if( ticket>0)
        {
         order=1;
        }
      }
    }
  }

No puedes declararlos en OnTick() porque su valor se restablecerá en cada tick por supuesto.

También tenga en cuenta que el OrderSend devuelve el número de ticket , o -1 menos uno si falla.

 

Pongo

bool order y

int ticket

en variables globales, y el resto del código en OnTick, pero sigue sin hacer ninguna entrada ahora