aidez-moi s'il vous plaît [résolu]

 

Je suis nouveau dans mql4 et ce code ouvre des ordres multiples, comment puis-je l'éviter ? il devrait juste ouvrir 1 ordre jusqu'à ce qu'il se ferme,

Comment puis-je faire cela ?

Merci

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);
    }
    
  }
 
Merci beaucoup monsieur, vous avez été strict et précis, sans me faire tourner en rond.
 

C'est une solution mais ce n'est pas la meilleure solution comme vous l'apprendrez si vous continuez.

Mais elle peut vous aider pour le moment.

 
Marco vd Heijden:

C'est une solution mais ce n'est pas la meilleure solution comme vous l'apprendrez si vous continuez.

Mais elle peut vous aider à ce stade.

oui il a résolu le problème dans le sujet, mais quand il se ferme il crée aussi un nouvel ordre, s'il est toujours au-dessus du nuage. Pouvez-vous m'aider à résoudre ce nouveau problème ?

Comment bloquer tous les nouveaux ordres après avoir réussi à fermer le premier ?

 

Vous pouvez créer un indicateur.

bool order=0;


Puis vous pouvez mettre la valeur à un lorsque la commande est passée.

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

Mais vous serez averti que vous devez vérifier la valeur de retour de la fonction ordersend.

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

Pourquoi ne pas définir le drapeau en fonction de la réussite ou de l'échec de la commande ?

Dans ce cas, si votre ordre échoue, il continuera à essayer.

 
mrluck1:

oui il a résolu le problème dans le sujet, mais quand il se ferme il crée aussi un nouvel ordre, s'il est toujours au-dessus du nuage. Pouvez-vous m'aider à résoudre ce nouveau problème ?

Comment bloquer tous les nouveaux ordres après avoir réussi à fermer le premier ?

Comme Marco y a déjà fait allusion, vous rencontrerez probablement d'autres problèmes.

Que faire s'il y a un ordre ouvert sur un autre symbole ?

Et s'il y a des ordres contrôlés par un autre EA ?

Et s'il y a des ordres en attente?

Et si le déclencheur est toujours actif lorsque vous fermez le premier ?

En réponse à cette dernière question, vous pourriez utiliser un drapeau comme l'a suggéré Marco. N'oubliez pas que vous devez décider quand réinitialiser le drapeau, sinon l'EA ne prendra plus jamais de position.

Vous pouvez aussi vérifier s'il y a un croisement ou un changement d'état entre le dessous/le nuage et le dessus du nuage.

 

j'ai mis votre code et dit que le ticket n'est pas déclaré, donc je l'ai déclaré, mais maintenant le code ouvre plusieurs commandes, comme avant, comment procéder maintenant ?

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


Et pour l'honnête knave : Dans cet exemple, il s'agit d'un script, donc une seule transaction est acceptable.
 
mrluck1:

j'ai mis votre code et dit que le ticket n'est pas déclaré, donc je l'ai déclaré, mais maintenant le code ouvre plusieurs commandes, comme avant, comment procéder maintenant ?

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


Cela vous aiderait probablement de lire sur la portée des variables.

Qu'arrive-t-il à la valeur de l'ordre à chaque tick ?

 

Ok, donc vous déclarez le ticket avec le drapeau booléen.

bool order=0;
int ticket;

Et ensuite

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

Vous ne pouvez pas les déclarer dans OnTick() car leur valeur sera réinitialisée à chaque tick bien sûr.

Notez également que l'OrderSend renvoie soit le numéro du ticket, soit -1 moins un s'il échoue.

 

Je mets

bool order et

int ticket

sur des variables globales, et le reste du code sur OnTick, mais il n'y a toujours pas d'entrée maintenant.