Cycle Operator 'für' Fragen - Seite 4

 

Simon,

Ok, lassen Sie mich versuchen, das Stop-Level dem EA ebenfalls hinzuzufügen, nur um sicherzugehen.

Aha! Freeze Level für USDJPY ist 0 und Stop Level ist 30.

Ich nehme an, dass 30 für 3 steht, weil der Broker 5-stellig ist. Ich habe versucht, den MODE_SPREAD zu verwenden und erhielt 20. Offensichtlich ist der Spread auf USDJPY nicht 20, sondern ;) 2.0. Man könnte auch sagen, dass 2 Pips 20 Punkten entsprechen.

Ich danke Ihnen.

 

Ein Hinweis für Sie . . . .

 

Simon,

Dies scheint wieder einmal ein Problem mit der Auswahl von Aufträgen zu sein.

Die Funktion OrderClose() versucht, eine Order zu schließen (nicht die USDJPY-Order). Sie versucht, die Order auf dem EURUSD-Chart zu schließen.

Die Funktion OrderPrint() ist vor ihrer Ausführung ausgewählt worden und entspricht eindeutig ihrem Zweck.

Die rote Farbe, die den ungültigen Preis einkreist, muss FALSCH anzeigen.

Die grüne Farbe, die den USDJPY einkreist, muss RICHTIG anzeigen.

Wenn also alles richtig ist, muss ich mich auf den roten Kreis konzentrieren und die Order vor der Ausführung der Funktion OrderClose() auswählen.

Ich danke Ihnen.

 
WhooDoo22:


Was ist Bid und Ask?

Ask ist der letzte bekannte Verkäuferpreis (Briefkurs) für das aktuelle Symbol.

Bid ist der letzte bekannte Käuferpreis (Angebotspreis, Geldkurs) des aktuellen Symbols.

Sie kennen den Grund für den fehlgeschlagenen Abschluss bereits... Denken Sie einen Moment lang nach.


Schauen Sie sich Ihren Code an. Welchen Preis verwenden Sie, um den Auftrag zu schließen?

 

Simon,

Ask/Bid ist der letzte bekannte Verkäufer-/Käuferkurs für das aktuelle Symbol.

Der Preis, zu dem der EA die Order schließen möchte, ist der Preis des EURUSD-Symbols.

Warum ist der EA davon abhängig, dass er auf einem USDJPY-Chart platziert wird, um seine Order zu schließen? Die OrderSelect()-Funktion sollte die Ticketnummer auswählen, und sobald die Ticketnummer ausgewählt wurde, könnte der EA dann

Offensichtlich muss sich der EA auf dem USDJPY-Symbolchart befinden, um Aufträge auf diesem zu schließen.


Streichen Sie alles, was ich gerade gesagt habe.

Dies ist die Lösung. Der Fehler liegt im dritten Parameter. Ich erwäge, das Symbol zu spezifizieren und DANN die Ask/Bid-Variable in ihrem Parameter zu platzieren (Position des dritten Parameters der OrderClose()-Funktion). Dies sollte alle Unklarheiten aus dem Denken entfernen.

Vielen Dank für Ihre Hilfe.

 
WhooDoo22:.

Dies ist die Lösung. Der Fehler liegt im dritten Parameter. Ich erwäge, das Symbol zu spezifizieren und DANN die Ask/Bid-Variable in ihrem Parameter zu platzieren (Position des 3. Parameters der Funktion OrderClose()). Dies sollte alle Unklarheiten aus dem Denken entfernen.

Ich danke Ihnen.

Bid und Ask sind vordefinierte Variablen und beziehen sich NUR auf den aktuellen Chart, auf dem sich der EA befindet. Wenn Sie Bid oder Ask für ein anderes Symbol als den Chart, auf dem sich der EA befindet, benötigen, können Sie die vordefinierten Variablen Bid und Ask nicht verwenden. Sie können jedoch MarketInfo() verwenden ;-)
 

Simon,

Der Fehler liegt im dritten Parameter der Funktion OrderClose(), denn ;) Ask/Bid ist der letzte bekannte Verkäufer-/Käuferkurs für das aktuelle Symbol. Wenn mit "für das aktuelle Symbol" der aktuelle Chart gemeint ist, auf dem der EA platziert ist, dann kann das ein bisschen verwirrend sein. Ich sollte mich daran erinnern, dass MQL4 schon eine Weile im Umlauf ist und seine eigenen Methoden der Darstellung und Illustration hat.

Die Lösung besteht darin, die vordefinierten Variablen Ask/Bid durch eine Alternative wie... zu ersetzen.

// solution 1.

MarketInfo("USDJPY",MODE_BID);

// solution 2.

MarketInfo("USDJPY",MODE_ASK);

Was sagen Sie dazu?


Ich habe eine Version dieses EA hinzugefügt, die in der Lage ist, Informationen über die USDJPY-Order auszudrucken und sie zu schließen, unabhängig davon, auf welchem Chart sie platziert ist. Ich habe noch nicht bestätigt, ob er den SL und TP der USDJPY-Order geändert hat, werde dies aber nach der Überprüfung bestätigen. Der EA produziert einen letzten Fehler, der nicht schwer zu beheben sein sollte. Ich arbeite derzeit daran. Hier ist ein Schnappschuss der Fehleranzeige:

Fehler bei ungültigem Ticket

Vielen Dank!

 
WhooDoo22:

Simon,

Der Fehler liegt im dritten Parameter der OrderClose() Funktion, weil ;) Ask/Bid ist der letzte bekannte Verkäufer-/Käuferkurs für das aktuelle Symbol. Wenn mit "für das aktuelle Symbol" der aktuelle Chart gemeint ist, auf dem der EA platziert ist, dann kann das ein bisschen verwirrend sein. Ich sollte daran denken, dass es MQL4 schon eine Weile gibt und dass es seine eigenen Methoden der Darstellung hat.

Die Lösung besteht darin, die vordefinierten Variablen Ask/Bid durch eine Alternative wie... zu ersetzen.

Was sagen Sie dazu?


Ich habe eine Version dieses EA hinzugefügt, die in der Lage ist, Informationen über die USDJPY-Order auszudrucken und sie zu schließen, unabhängig davon, auf welchem Chart sie platziert ist. Ich habe noch nicht bestätigt, ob er den SL und TP der USDJPY-Order geändert hat, werde dies aber nach der Überprüfung bestätigen. Der EA produziert einen letzten Fehler, der nicht schwer zu lösen sein sollte. Ich arbeite derzeit daran. Hier ist ein Schnappschuss der Fehleranzeige:


Ich danke Ihnen.

Und jetzt sehen Sie die Grenzen Ihres Codes . . Sie haben keine USDJPY-Order mehr, also findet Ihr while die Order an Position 0 und es ist nicht USDJPY, dann findet es die nächste an 1 und es ist nicht USDJPY, dann sieht es sich Position 2 an und OrderSelect() schlägt fehl, dies beendet das while, aber der Rest des Codes wird dann ausgeführt, dies ergibt eine fehlgeschlagene OrderModify(), eine fehlgeschlagene OrderPrint(), eine fehlgeschlagene OrderType() und eine fehlgeschlagene OrderClose() . Was macht die Funktion GetLastError() dort ganz allein?
 

Simon,

Der Zyklusoperator "while" wird als solcher ausgeführt: Wenn der Ausdruck wahr ist, wird der Operator ausgeführt, bis der Ausdruck falsch wird. Wenn der Ausdruck falsch ist, wird die Kontrolle an den nächsten Operator weitergegeben.

Der Zweck des Codes in der SRC-Box unten ist Folgendes:

Solange die Variable 'i' (die in der Funktion OrderSelect() enthalten ist) NICHT die USDJPY-Ticket-Positionsnummer ist UND das Order-Symbol nicht USDJPY ist,wird die Variable 'i' erhöht, bis die Variable 'i' die USDJPY-Ticket-Positionsnummer ist UND das Order-Symbol USDJPY ist. Sobald der 'while'-Zyklus falsch wird, wird die Kontrolle an die nächste Codezeile weitergegeben.

Zur Veranschaulichung habe ich den 'while'-Kopf und -Körper dargestellt.

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

i++;

Ich glaube, Sie verstehen, wie der 'while'-Zyklus ein Ticket auf dem USDJPY-Währungspaar findet, auch wenn kein Ticket auf dem Währungspaar vorhanden ist, aber ;) Ich fürchte, das tue ich nicht.

Wie kann der 'while'-Zyklus ein Ticket auf dem USDJPY-Chart finden, wenn es keinen Auftrag auf dem USDJPY-Chart zu finden gibt?

Ich glaube, Sie schrieben etwas in der Art, dass die Order an der Position 0 lokalisiert wird. Können Sie dies näher erläutern oder möglicherweise einen Link zum Studium zur Verfügung stellen?

Ich danke Ihnen.

 
WhooDoo22:


Ich glaube, Sie verstehen, wie der 'while'-Zyklus ein Ticket für das Währungspaar USDJPY findet, auch wenn gerade kein Ticket für das Währungspaar vorliegt, aber ;) Ich fürchte, das tue ich nicht.

Wie kann der "while"-Zyklus ein Ticket auf dem USDJPY-Diagramm finden, wenn es keinen Auftrag auf dem USDJPY-Diagramm gibt, der gefunden werden kann?

Ich glaube, Sie haben etwas in der Art geschrieben, dass die Order an der Position 0 gefunden werden soll. Können Sie das näher erläutern oder eventuell einen Link zum Studium zur Verfügung stellen?

Wenn Sie den Code für sich selbst schreiben wollen, dann müssen Sie die Aufgabe von 3 Personen übernehmen, vielleicht sogar von 4. Die Person, die das Anforderungsdokument verfasst, der Software-Ingenieur und der Test-Ingenieur. Es reicht nicht aus, die Syntax rückwärts zu kennen und Code schreiben zu können . . Sie müssen das Problem verstehen, das Sie zu lösen versuchen, und wissen, wie Sie es lösen werden, und Sie müssen auch wissen , wie Sie den Code testen können, um sicherzustellen, dass er die Anforderungen erfüllt.

Auf einer grundlegenden Ebene bedeutet dies, dass Sie Ihren Code Zeile für Zeile durchgehen und sicherstellen, dass er das tut, was Sie wollten, und zwar in der Regel mit einem Wertebereich für jede Variable, der vom Minimalwert über typische Werte bis zum Maximalwert reicht.


Lassen Sie uns das mit Ihrer while-Schleife machen.

Wenn Sie eine int-Variable deklarieren, ohne ihren Wert festzulegen, hat sie einen Anfangswert von 0, wenn Sie also i deklarieren (warum nicht einen Variablennamen verwenden, der aussagekräftiger ist?), hat sie den Wert 0, so dassi beim ersten Durchlauf der while-Schleife den Wert 0 hat, so dass OrderSelect() versucht, die Order an Position 0 auszuwählen. Wenn das funktioniert, gibt Ihr OrderSymbol()-Aufruf den korrekten Symbolnamen für die Order an Position 0 zurück, und wenn es nicht "USDJPY" ist, wird der Ausdruck(OrderSymbol() !="USDJPY") einen wahren Wert, wenn OrderSelect() wahr ist und die Symbolprüfung wahr ist,wahr und wahr =wahr und die nächste Codezeile (innerhalb der while-Schleife) wird ausgeführt.

Jetzt isti gleich 1, OrderSelect() wählt die Order an der Position 1 aus, so dass sie den Wert true ergibt, die Symbolprüfung findet kein Symbolvon USDJPY, also wird true zurückgegeben, wieder true und true = true , also wird i++ wieder ausgeführt

Jetzt isti
2, die OrderSelect() versucht, die Order an Position 2 auszuwählen, schlägt aber fehl. . es sind nur 2 Orders offen, an den Positionen 0 & 1, also gibt OrderSelect() false zurück, was macht OrderSymbol()? es ist keine gültige Order ausgewählt . . . aber selbst wenn sie aus irgendeinem seltsamen Grund true zurückgibt, hat OrderSelect() bereits false,false und true = false zurückgegeben ... die while-Schleife ist beendet undi ist auf 2 gesetzt

Gehen Sie nun den Rest des Codes durch und beachten Sie dabei, dassi den Wert 2 hat...

Grund der Beschwerde: