aiutatemi per favore [risolto]

 

Sono nuovo in mql4 e questo codice apre ordini multipli, come posso evitarlo? Dovrebbe aprire solo 1 ordine fino alla chiusura,

come posso farlo?

Grazie

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);
    }
    
  }
 
grazie mille signore, lei è stato rigoroso al punto, non mi ha mandato in tondo
 

È una soluzione, ma non è la soluzione migliore, come imparerete se procedete.

Ma può aiutarvi in questo momento.

 
Marco vd Heijden:

È una soluzione, ma non è la migliore, come imparerai se procederai.

Ma può aiutarti in questo momento.

sì, ha risolto il problema nel topic, ma quando si chiude crea anche un nuovo ordine, se è ancora sopra la nuvola. Potreste aiutarmi a risolvere questo nuovo problema?

Come bloccare tutti i nuovi ordini dopo aver chiuso con successo il primo?

 

Beh, potete creare una bandiera.

bool order=0;


Poi puoi impostare il valore su uno quando l'ordine viene effettuato.

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;
    }
    
  }

Ma ti darà l'avviso che devi controllare il valore di ritorno della funzione ordersend quindi

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;
        }
      }
    }
  }

Perché non impostare il flag a seconda che l'ordine sia stato piazzato con successo o meno?

In questo caso se l'ordine fallisce continuerà a provare.

 
mrluck1:

sì, ha risolto il problema nel topic, ma quando si chiude crea anche un nuovo ordine, se è ancora sopra la nuvola. Potreste aiutarmi a risolvere questo nuovo problema?

Come bloccare tutti i nuovi ordini dopo aver chiuso con successo il primo?

Come ha già accennato Marco, probabilmente incontrerai altri problemi.

Cosa succede se c'è un ordine aperto su un altro simbolo?

E se ci sono ordini controllati da un altro EA?

E se ci sono ordini pendenti?

E se il trigger è ancora attivo quando si chiude il primo?

In risposta a quest'ultimo, potresti usare un flag come suggerito da Marco. Ricorda solo che devi decidere quando resettare la bandiera o l'EA non farà mai più un altro trade.

In alternativa, potresti controllare un cross/cambio di stato da sotto/in nuvola a sopra la nuvola.

 

ho messo il tuo codice e dice che il biglietto non è dichiarato, così l'ho dichiarato, ma ora il codice apre più ordini, proprio come prima, come procedere ora?

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;
        }
      }
    }
  }


E per essere onesto fante: In questo esempio, è uno script, quindi solo 1 trade va bene
 
mrluck1:

ho messo il tuo codice e dice che il biglietto non è dichiarato, così l'ho dichiarato, ma ora il codice apre più ordini, proprio come prima, come procedere ora?

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;
        }
      }
    }
  }


Probabilmente ti aiuterebbe leggere l'ambito delle variabili.

Cosa succede al valore dell'ordine ogni tick?

 

Ok, quindi dichiarate il biglietto con il flag booleano.

bool order=0;
int ticket;

E poi

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;
        }
      }
    }
  }

Non potete dichiararli in OnTick() perché il loro valore sarà resettato ad ogni tick ovviamente.

Nota anche che OrderSend restituisce o il numero del ticket, o -1 meno uno se fallisce.

 

Ho messo

bool order e

int ticket

su variabili globali, e il resto del codice su OnTick, ma ancora non fa alcuna voce ora