![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Bitte verwenden Sie die Schaltfläche </>, um Ihren Code einzufügen.
Meine Entschuldigung... Hier ist es im richtigen Format...
OrdersTotal() nicht korrekt...
Ich war überrascht, dass eine Schleifencode-Sequenz, die OrdersTotal() verwendet, keine korrekten Ergebnisse liefert (beobachtet bei zwei verschiedenen Brokern).
Ich verwende MT4 Version 1090 auf einem Linux Ubuntu-MATE 16.04 Desktop, auf dem WINE 3.0 läuft.
Hier ist, was ich verwendet habe...
Hier ist es:
Ich habe bei zwei verschiedenen Brokern festgestellt, dass der Wert von OrdersTotal() nicht immer mit dem übereinstimmt, was auf der Registerkarte 'Trade' des MT4-Brokers angezeigt wird. Zunächst dachte ich, dass es am Broker liegt, dass OrdersTotal() nicht richtig funktioniert. Als ich es beim zweiten Broker bemerkte, begann ich mich zu fragen, ob MT4 ein internes 'Problem' hat, oder ob mein Code falsch ist ODER ob dies ein Problem mit der korrekten Synchronisierung von MT4 mit dem Server.... ist?
Nachdem ich diesen Forumsthread gelesen habe, frage ich mich, ob ich bessere Ergebnisse erzielen würde, wenn ich die for..-Schleife so ändern würde, dass sie lautet:
ODER gibt es ein Flag oder eine Codezeile, die sicherstellt, dass OrdersTotal() während eines OnTick()-Ereignisses korrekt synchronisiert wird?Jede Klärung in Bezug auf diese wäre sehr hilfreich und würde sehr geschätzt werden!
Dies ist einer der häufigsten Fehler, die ich sehe, wahrscheinlich zum Teil auf die wie Müll wie Expert Advisor Builder. So dachte ich, es war Zeit für einen Thread zu diesem Thema gewidmet, so dass es für zukünftige Referenz verlinkt werden kann.
Das Problem
Nehmen wir ein einfaches Beispiel; wir wollen eine Funktion, um alle offenen Aufträge für unsere EA zu schließen, gibt es viele Beispiele, aber lassen Sie uns eine von Grund auf neu erstellen.
Wir brauchen eine Schleife, weil wir alle unsere Aufträge für einen bestimmten EA schließen wollen. Innerhalb dieser Schleife haben wir Code, um den Auftrag auszuwählen, Code, um zu prüfen, ob es das richtige Symbol und die richtige magische Zahl ist, und schließlich Code, um den Auftrag zu schließen:
Dieser Code ist schlecht . . . VERWENDEN SIE IHN NICHT. . . Ich werde im nächsten Abschnitt erklären, warum...
Die Erläuterung
Gehen wir den obigen Code durch, Zeile für Zeile, Auftrag für Auftrag...
Nehmen wir an, wir haben die folgenden Aufträge, die wir schließen wollen. Sie haben alle die gleiche magische Zahl und das gleiche Symbol wie unser EA, also soll unser Code sie alle schließen:
Erster Durchlauf durch die Schleife:
Der Anfangswert von PositionIndex ist 0, so dass der Auftrag an Position 0 ausgewählt wird, Ticketnummer 111, dieser Auftrag wird erfolgreich gelöscht und die verbleibenden Aufträge ändern ihre Position wie folgt:
Zweiter Durchlauf durch die Schleife:
Der Wert von PositionIndex ist jetzt 1, so dass der Auftrag an Position 1 ausgewählt wird, Ticketnummer 333, dieser Auftrag wird erfolgreich gelöscht und die verbleibenden Aufträge ändern ihre Position wie folgt:
3. Durchlauf durch die Schleife:
Jetzt istder Wert von PositionIndex 2, so dass der Auftrag an Position 2 ausgewählt wird, Ticketnummer 555, dieser Auftrag wird erfolgreich gelöscht und die verbleibenden Aufträge ändern ihre Position wie folgt:
4. Durchlauf durch die Schleife:
jetzt ist der Wert von PositionIndex 3 OrderSelect() versucht, die Order an Position 3 auszuwählen und scheitert, der continue nimmt die Ausführung des Codes zum nächsten Wert in der Schleife . .
5. und letzter Durchlauf durch die Schleife:
jetzt ist der Wert von PositionIndex gleich 4 OrderSelect() versucht, die Order an Position 4 auszuwählen und schlägt fehl, der Continue führt den Code zum nächsten Wert in der Schleife aus . . . die Schleife ist beendet.
Wir haben jetzt noch 2 Aufträge, die Tickets 222 und 444, die eigentlich hätten abgeschlossen werden müssen, es aber nicht wurden ... und nun die Frage, wie man dieses Problem lösen kann.
Die Lösung
Der folgende Code ist die korrekte Vorgehensweise, wenn offene Aufträge geschlossen oder schwebende Aufträge gelöscht werden sollen.
Der wesentliche Unterschied besteht darin, dass die Schleife von ( TotalNumberOfOrders - 1 ) auf 0 dekrementiert
Gehen wir noch einmal den obigen Code durch - Zeile für Zeile, Auftrag für Auftrag.
Wir haben die gleichen Aufträge wie zuvor:
1. Durchlauf durch die Schleife:
Der Anfangswert von PositionIndex ist TotalNumberOfOrders - 1, was gleich 5 - 1 = 4 ist, also wird der Auftrag an Position 4 ausgewählt, Ticketnummer 555, dieser Auftrag wird erfolgreich gelöscht und die verbleibenden Aufträge ändern ihre Position wie folgt:
Zweiter Durchlauf durch die Schleife:
Der Wert von PositionIndex ist jetzt 3, also wird die Bestellung an Position 3 ausgewählt, Ticketnummer 444, diese Bestellung wird erfolgreich gelöscht und die verbleibenden Bestellungen ändern ihre Position wie folgt:
3. Durchlauf durch die Schleife:
Der Wert von PositionIndex istjetzt 2, so dass der Auftrag an Position 2 ausgewählt wird, Ticketnummer 333, dieser Auftrag wird erfolgreich gelöscht und die verbleibenden Aufträge ändern ihre Position wie folgt:
4. Durchlauf durch die Schleife:
Der Wert von PositionIndex istjetzt 1 , so dass der Auftrag an Position 1 ausgewählt wird, Ticketnummer 222, dieser Auftrag wird erfolgreich gelöscht und die verbleibenden Aufträge ändern ihre Position wie folgt:
5. und letzter Durchlauf durch die Schleife:
jetzt ist der Wert von PositionIndex 0 also wird der Auftrag an Position 0 ausgewählt, Ticketnummer 111, dieser Auftrag wird erfolgreich gelöscht, Wert 0 ist der letzte gültige Wert für die Schleife ... die Schleife ist beendet.
Wir haben alle übereinstimmenden Aufträge erfolgreich gelöscht...
Link zu diesem Thema: Schleifen und Schließen oder Löschen von Aufträgen
Ich habe mir diesen Thread durchgelesen, in dem es um die Auftragsauswahl geht. Ich habe tatsächlich einen Code, bei dem ich glaube, alles richtig gemacht zu haben, aber die Auswahl funktioniert bei mir nicht, da ich den OpenPrice desausgewählten Auftragsnicht lesen kann. Alles andere funktioniert gut, nur dieser Teil des Codes nicht. Ich bin mir nicht sicher, warum.
Der gesamte Code hat 4 Abschnitte, in denen ich den OrderOpenPrice aufrufen muss, nachdem die Bestellung gesendet wurde... OrderSend funktioniert gut, OrderSelect liefert mir nicht die gewünschten Ergebnisse. Verweisen Sie auf 1 Abschnitt des Codes, wenn Sie helfen können.
Vielen Dank!
Vielen Dank, lieberSimon Gniadkowski,
Ihr Beitrag hat mir wirklich Zeit erspart.
Dies ist der Code, den ich für das Schließen von Marktaufträgen vorschlage
Und ich schlage vor, dass dies der korrekte Weg ist, wenn eine Forward-for-Schleife verwendet wird (um den FIFO-Regeln der US-Broker zu entsprechen)
In der Vorwärtsschleife,
Schleifen und Schließen oder Löschen von Orders - MQL4 Programmierforum
Für FIFO (US-Broker)und wenn Sie (möglicherweise) mehrere Orders pro Symbol verarbeiten, müssen Sie die früheste Order finden, sie schließen und bei einer erfolgreichen Operation alle verbleibenden Positionen erneut verarbeiten.
CloseOrders durch FIFO Regeln - Strategy Tester - MQL4 Programmierforum - Seite 2 #16
Was sind die Rückgabewerte der Funktion ? Wie verwende ich sie? - MQL4-Programmierforum
Häufige Fehler in MQL4-Programmen und wie man sie vermeidet - MQL4 Artikel
Sie werden wissen, wie sehr mir das geholfen hat. Nicht nur mit dem Code, an dem ich gearbeitet habe, sondern mit meinem gesamten Verständnis. Es funktioniert jetzt perfekt und ich habe das Verständnis, um es auf verschiedene Weise zu implementieren.
Ich bin wirklich sehr dankbar für diese Informationen.