Cycle Operator 'für' Fragen

 

Hallo MQL4-Gemeinschaft,


Erste Referenz: https://book.mql4.com/operators/for

Laut der ersten Referenz wird ein Formatbeispiel für den 'for'-Operator so geschrieben:

  for (Expression_1; Condition; Expression_2)         // Cycle operator header
      One operator, cycle body                     // Cycle body is one operator


Zweite Referenz: https://docs.mql4.com/basis/operators/for

In der zweiten Referenz wird das Beispiel für den "for"-Operator wie folgt beschrieben:

for (Expression1; Expression2; Expression3)
   operator;


Warum enthältdieses erste Beispiel eine "Bedingung" als zweiten Parameter, während das zweite Beispiel "Ausdruck2" als zweiten Parameter enthält ?

Was ist die Bedeutung dieses Widerspruchs?

Ist er überhaupt von Bedeutung?

Wenn ich den Zyklusoperator "for" verwenden soll, muss ich meines Erachtens alle seine Parameter genau kennen.

Ich danke Ihnen.

 

Vielleicht können Sie eine for-Schleife besser verstehen, wenn Sie zuerst eine while-Schleife verstehen ... eine for-Schleife ist einfach eine while-Schleife mit eingebauter Anfangsbedingung und Inkrement.

In der Dokumentation zufor heißt es...

"Der for-Operator ist äquivalent zu der folgenden Abfolge von Operatoren:"

Expression1;
while(Expression2)
  {
   operator;
   Expression3;
  };


Speziell zu Ihrer Frage:"Warumenthältdas erste Beispieleine "Bedingung" als zweiten Parameter, während das zweite Beispiel "Ausdruck2"als zweiten Parameterenthält?"Ein Ausdruck kann eine Bedingung sein, eine Bedingung ergibt einen wahren oder falschen Wert, zum Beispiel (a > b) oder (c || d) oder (OrdersTotal() >= 0), auch die Dokumentation sagt. ."Ausdruck2 ist der Bedingungstest für den Zyklusabschluss."

 

Simon,

ein Ausdruck kann eine Bedingung sein

Also kann der zweite Parameter in einem "for"-Operator-Kopf ein Ausdruck ODER eine Bedingung sein? Ich nehme an, dass Expression_1 und Expression_3 Ausdrücke bleiben müssen und nicht zu Bedingungen werden dürfen, richtig? Ich wüsste nicht, warum Ausdruck 1 und 3 nicht auch Bedingungen sein könnten. Die beiden Ausdrücke 1 und 3 sind lediglich Parameter, die gefüllt werden müssen. (eine Bedingung zu sein, KÖNNTE alternativ Parameter zwei sein, auch bekannt als der Zweck von Ausdruck_2)

Bitte bestätigen Sie Ihre Gedanken.

Ausdrücke können arithmetische Operationen (2+2=4), Zuweisungen, usw. sein. (alle im MetaEditor Dictionary aufgeführt).

Bedingung ist wahr || falsch (Beispiele: a>b, a>=b, a==b, etc.).

Operationen sind ebenfalls im MetaEditor-Wörterbuch enthalten (Beispiele: Break, Continue, Return, while, for, usw.).

Dankeschön

 
WhooDoo22:

Simon,

ein Ausdruck kann eine Bedingung sein

Also kann der zweite Parameter in einem "for"-Operator-Kopf ein Ausdruck ODER eine Bedingung sein? Ich nehme an, dass Expression_1 und Expression_3 Ausdrücke bleiben müssen und nicht zu Bedingungen werden dürfen, richtig? Ich wüsste nicht, warum Ausdruck 1 und 3 nicht auch Bedingungen sein könnten. Die beiden Ausdrücke 1 und 3 sind lediglich Parameter, die gefüllt werden müssen. (eine Bedingung zu sein, KÖNNTE alternativ auch Parameter zwei sein, auch bekannt als der Zweck von Expression_2)

Lernen Sie, while richtig zu verwenden ... eine for-Schleife ist eine while-Schleife, nur ästhetisch ansprechender gestaltet. Dann macht die Sache mit den Ausdrücken und Bedingungen Sinn . ... tun Sie sich selbst einen Gefallen und reduzieren Sie die Möglichkeiten für Kopfschmerzen ... studieren Siewhile

Dokumentation - while

Buch - while
 
WhooDoo22: Der zweite Parameter in der Kopfzeile eines "for"-Operators kann also ein Ausdruck oder eine Bedingung sein?
Jeder Ausdruck ergibt eine Zahl. Die Zahl, umgewandelt in einen Booleschen Wert, ist eine Bedingung. Das ist dasselbe. Du sagst tuh-mey-toh, und ich sage tuh-mah-toh
 

Simon, ich werde die Verwendung der while-Operation im Code üben. tun Sie sich einen Gefallen... Ich mag den Klang davon! :) Ich danke Ihnen.

William, die Zahl, umgewandelt in einen Booleschen Wert, ist eine Bedingung. .. (1=wahr, 0=falsch). Vielen Dank.

Ich danke Ihnen.

 

Simon,

Ich habe einen EA geschrieben, der ;) in der Lage sein sollte, das von Ihnen gewünschte Ergebnis zu erzielen.

Ich zeige eine Kombination aus diesem EA und einem Schnappschuss des Ergebnisses auf der Registerkarte "Experts" im Terminal.


Der EA scheint in der Lage zu sein, die USDJPY-Order auszuwählen und ihre Informationen auf der Registerkarte "Experts" zu drucken. Warum schließt der EA den Auftrag nicht und druckt die Auftragsdaten nicht aus?

vielen Dank!

 
WhooDoo22:

Simon,

Ich habe einen EA geschrieben, der ;) in der Lage sein sollte, das von Ihnen gewünschte Ergebnis zu erzielen.

Ich zeige eine Kombination aus diesem EA und einem Schnappschuss des Ergebnisses auf der Registerkarte "Experts" im Terminal.


Der EA scheint in der Lage zu sein, die USDJPY-Order auszuwählen und ihre Informationen auf der Registerkarte "Experts" zu drucken. Warum schließt der EA den Auftrag nicht und druckt die Auftragsdaten nicht aus?

vielen Dank!

Sie sagten, Sie hätten die Klammern verstanden?https://www.mql5.com/en/forum/142732


Bitte erläutern Sie Ihren Code und was er bewirken soll ... insbesondere erklären Sie mir bitte das while.
 

Simon,

Bitte erläutern Sie Ihren Code und was er bewirken soll ... insbesondere erklären Sie mir bitte die Zeit.

Ich werde mein Bestes tun, um den Code und seinen Zweck zu erklären.


Zweck des Codes:

1. Wählen Sie einen USDJPY-Auftrag aus einem Pool von drei Aufträgen aus.

2. Ändern Sie TP und SL der USDJPY-Order.

3. Führen Sie die Funktion OrderPrint() aus.

4. Schließen Sie die USDJPY-Order.


Code-Erläuterung:

Zunächst werden die Variablen deklariert.

   int i;
   double bid_ask;

Zweitens wird die 'while'-Schleife ausgeführt.

while"-Schleifenlogik:

DieFunktion OrderSelect() verwendet die Variable 'i' als Ersatz für eine Zahl 1,2,3,usw.. (behalten Sie dies bitte im Hinterkopf)

Wenn die Variable i in der OrderSelect()-Funktion und der OrderSymbol()-Funktion NICHT USDJPY lautet, wird die Variable i um 1 erhöht. ( i++; )

   while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

         i++;

Die 'while'-Schleife erhöht die 'i'-Variable, bis die OrderSelect()-Funktion das richtige Order-Ticket auswählt UND die OrderSymbol()-Funktion eine USDJPY-Order auswählt. Wenn beide Ziele erreicht sind, wird die while-Schleife falsch und die Kontrolle wird unterhalb von i++; (dem Körper der while-Schleife) übergeben.

Drittens: Die Funktion OrderModify() wird ausgeführt.

OrderModify(i,OrderOpenPrice(),50*Point,50*Point,0,CLR_NONE);

Viertens: Die Funktion OrderPrint() wird ausgeführt.

OrderPrint();

Fünftens sind Parameter enthalten, um zu erkennen, ob es sich bei dem zu schließenden Auftrag um einen Kauf- oder Verkaufsauftrag handelt.

         if(OrderType()==OP_BUY){bid_ask=Bid;}
         if(OrderType()==OP_SELL){bid_ask=Ask;}

Sechstens: Sobald das Programm unterscheidet, ob es sich um einen Kauf- oder Verkaufsauftrag handelt, wird die Funktion OrderClose() ausgeführt.

OrderClose(i,OrderLots(),bid_ask,3,CLR_NONE);

Siebtens (und letztens) enthält das Programm einen Kommentar, der die Variable 'i' anzeigt, um zu bestätigen, dass die Ticketnummer tatsächlich das Ticket auf USDJPY während des visuellen Tests im Strategietester ist.

Comment("i = " ,i);

Vielen Dank für Ihre Hilfe.

 
WhooDoo22:

Simon,


'while'-Schleifenlogik:

Die Funktion OrderSelect() verwendet die Variable 'i' als Ersatz für eine Zahl 1,2,3,usw.. (behalten Sie das bitte im Hinterkopf)

Wenn also die Variable i in der OrderSelect()-Funktion und der OrderSymbol()-Funktion NICHT USDJPY ist, erhöhen Sie die Variable i um 1. ( i++; )

Die 'while'-Schleife erhöht die Variable 'i', bis die Funktion OrderSelect() das richtige Orderticket auswählt UND die Funktion OrderSymbol() eine USDJPY-Order auswählt. Wenn beide Ziele erreicht sind, wird die while-Schleife falsch und die Kontrolle wird unterhalb von i++; (dem Körper der while-Schleife) übergeben.

Entschuldigung, ich habe Ihren Code falsch gelesen. Das Problem, das Sie haben, ist sehr einfach ... sehen Sie sich die Fehlermeldung in dem von Ihnen geposteten Screenshot an ... sehen Sie sich an, was OrderPrint() erzeugt, einschließlich der Auftragsnummer, und sehen Sie sich dann den Fehler an.

Hätten Sie die Überprüfung der Rückgabewerte und die Fehlermeldung einbezogen, hätten Sie Ihr Problem wahrscheinlich selbst erkannt.
 

Simon,

Ich weiß nicht, was Sie sehen, aber ;) Ich werde umgehend die Funktion GetLastOrder() einfügen, um dieses Problem zu erhellen. Bitte entschuldigen Sie, dass ich eine Frage gestellt habe, ohne vorher die Funktion GetLastOrder() in den Code einzufügen.

Ich danke Ihnen.

Grund der Beschwerde: