bitte helfen Sie mir [gelöst]

 

Ich bin neu in mql4 und dieser Code öffnet mehrere Aufträge, wie kann ich es vermeiden? es sollte nur 1 Auftrag öffnen, bis es schließt,

Wie kann ich das tun?

Danke

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);
    }
    
  }
 
Vielen Dank, Sir, Sie haben es auf den Punkt gebracht und mich nicht im Kreis laufen lassen.
 

Es ist eine Lösung, aber es ist nicht die beste Lösung, wie Sie erfahren werden, wenn Sie fortfahren.

Aber es kann Ihnen zum jetzigen Zeitpunkt helfen.

 
Marco vd Heijden:

Das ist eine Lösung, aber es ist nicht die beste Lösung, wie Sie erfahren werden, wenn Sie fortfahren.

Aber es kann Ihnen zu diesem Zeitpunkt helfen.

ja, es hat das Problem im Thema gelöst, aber wenn es schließt, erstellt es auch einen neuen Auftrag, wenn es noch über der Wolke ist. Könnten Sie mir helfen, dieses neue Problem zu lösen?

Wie kann ich alle neuen Aufträge blockieren, nachdem ich den ersten erfolgreich abgeschlossen habe?

 

Nun, Sie können ein Kennzeichen erstellen.

bool order=0;


Dann können Sie den Wert auf eins setzen, wenn die Bestellung aufgegeben wird.

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

Aber es wird Ihnen die Warnung geben, dass Sie den Rückgabewert der Funktion ordersend überprüfen müssen.

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

Warum wird das Flag nicht gesetzt, je nachdem, ob die Bestellung erfolgreich aufgegeben wurde oder nicht?

In diesem Fall, wenn Ihre Bestellung fehlschlägt, wird es weiter versucht.

 
mrluck1:

ja, es hat das Problem im Thema gelöst, aber wenn es schließt, erstellt es auch einen neuen Auftrag, wenn es noch über der Wolke ist. Könnten Sie mir helfen, dieses neue Problem zu lösen?

Wie blockiere ich alle neuen Aufträge, nachdem ich den ersten erfolgreich geschlossen habe?

Wie Marco bereits angedeutet hat, werden Sie wahrscheinlich auf weitere Probleme stoßen.

Was ist, wenn es einen offenen Auftrag für ein anderes Symbol gibt?

Was ist, wenn es Aufträge gibt, die von einem anderen EA gesteuert werden?

Was ist, wenn es schwebende Aufträge gibt?

Was ist, wenn der Trigger noch aktiv ist, wenn Sie den ersten schließen?

Um die letzte Frage zu beantworten, könnten Sie ein Flag verwenden, wie Marco vorgeschlagen hat. Denken Sie nur daran, dass Sie entscheiden müssen, wann Sie die Flagge zurücksetzen, da der EA sonst nie wieder einen anderen Handel tätigt.

Alternativ könnten Sie auf eine Kreuzung/einen Zustandswechsel von unterhalb/in der Wolke zu oberhalb der Wolke prüfen.

 

Ich habe Ihren Code eingegeben und er sagt, dass das Ticket nicht deklariert ist, also habe ich es deklariert, aber jetzt öffnet der Code mehrere Bestellungen, genau wie vorher. Wie soll ich jetzt vorgehen?

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


Und um ehrlich zu sein Knave: In diesem Beispiel ist es ein Skript, so dass nur 1 Handel ist ok
 
mrluck1:

Ich habe Ihren Code eingegeben und er sagt, dass das Ticket nicht deklariert ist, also habe ich es deklariert, aber jetzt öffnet der Code mehrere Aufträge, genau wie vorher. Wie kann ich jetzt vorgehen?

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


Es würde Ihnen wahrscheinlich helfen, wenn Sie etwas über den Anwendungsbereich von Variablen lesen würden.

Was passiert mit dem Wert der Bestellung jeden Tick?

 

Sie deklarieren das Ticket also mit dem booleschen Flag.

bool order=0;
int ticket;

Und dann

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

Sie können sie nicht in OnTick() deklarieren, da ihr Wert natürlich bei jedem Tick zurückgesetzt wird.

Beachten Sie auch, dass OrderSend entweder die Ticketnummer zurückgibt, oder -1 minus eins, wenn es fehlschlägt.

 

Ich habe

bool Bestellung und

int ticket

auf globale Variablen und den Rest des Codes auf OnTick gesetzt, aber es wird immer noch kein Eintrag gemacht