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
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)
Dokumentation - while
Buch - while
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!
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!
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.
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.
Hätten Sie die Überprüfung der Rückgabewerte und die Fehlermeldung einbezogen, hätten Sie Ihr Problem wahrscheinlich selbst erkannt.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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:
Zweite Referenz: https://docs.mql4.com/basis/operators/for
In der zweiten Referenz wird das Beispiel für den "for"-Operator wie folgt beschrieben:
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.