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
if (err==146)
{
while (IsTradeContextBusy())
{
if (IsTradeAllowed()) break;
else
Sleep(1000*1,1);
}}
Ich denke, das ist eine schnellere Lösung. Bitte teilen Sie uns Ihre Kommentare mit.
Ich danke Ihnen.
Was würden Sie von dieser Variante halten?
Dies scheint mir eine schnellere Lösung zu sein, denn ich arbeite auf diese Weise. Kommentar.
Ich danke Ihnen.
Ich werde damit zurechtkommen. Mit Verständnis. Die Pause ist kürzer, es funktioniert schneller... Aber es gibt einige ungerechtfertigte Redundanzen in Ihrer Version.
Die Funktion IsTradeContextBusy gibt das Flag der Belegung des Handels-Threads zurück. Vor dem 195. Baujahr gab es eine solche Funktion nicht. Daher haben wir die Funktion IsTradeAllowed verwendet, die ein Zeichen dafür liefert, dass der EA handeln darf und der Handelsfluss frei ist.
Wir erlauben dem EA den Handel, indem wir im Dialogfeld der EA-Eigenschaften (Taste F7) das Kästchen "EA zum Handel zulassen" aktivieren.
Die Fehlermeldung 146 (Trade Stream is busy) hat nichts damit zu tun, dass der Expert Advisor den Handel zulässt. Schauen wir uns also die Eigenschaften der Funktion IsTradeAllowed an, soweit sie sich nur auf den Handelsfaden beziehen.
Der Handelsfaden ist also frei und die Funktion IsTradeAllowed gibt True zurück. Der Handels-Thread ist beschäftigt, die Funktion IsTradeAllowed gibt False zurück. Werfen wir nun einen Blick auf die Werte, die von der Funktion IsTradeContextBusy zurückgegeben werden. Der Handelsfaden ist frei, die Funktion IsTradeContextBusy gibt False zurück. Der Handels-Thread ist beschäftigt, die Funktion IsTradeContextBusy gibt True zurück. Es ist zu erkennen, dass die Werte der Funktionen IsTradeAllowed und IsTradeContextBusy für dieselben Handelsströme entgegengesetzt sind. Außerdem duplizieren sich diese Funktionen gegenseitig, anstatt sich in Bezug auf die Handelsströme zu ergänzen. Daher kann einer von ihnen ausgeschlossen werden. Welcher ist es? Die IsTradeAllowed Funktion, wie ich bereits oben erwähnt habe, gibt neben dem Trade Flow State Flag auch das Flag zurück, das dem EA den Handel erlaubt, was in dieser Situation, d.h. bei der Behandlung des Fehlers 146 (Trade Flow is busy), für uns nicht notwendig ist. Daher ist es notwendig und ausreichend, nur eine Funktion IsTradeContextBusy zu verwenden. Wenn Sie die oben genannten Abkürzungen ausführen, wird Ihr Code auf meinen reduziert:
Der einzige Unterschied ist die Größe der Pause. Aber das ist eine Frage des Geschmacks, der persönlichen Vorlieben, des Handelsstils usw. Sie könnten eine Pause von 0,1 Sekunden einfügen. Es ist keine große Sache... Ich bevorzuge einfach 11 Sekunden.In der Funktion SetOrder wurden zwei Fehler gefunden:
Achtung! Der Beitrag mit der SetOrder-Funktion für den Online-Handel wurde korrigiert. Die Funktion ist etwas länger. Er passte nicht in den ganzen Pfosten, also musste er in den Anhänger verlegt werden.
In diesem Beitrag habe ich beschlossen, die wichtigsten Punkte zu erläutern, wie die Funktion SetOrder funktioniert. Ich selbst arbeite nicht mit Aufträgen, d. h. ich befinde mich hier auf dem Gebiet eines anderen. Vielleicht kann jemand, der weiß, wie die SetOrder-Funktion funktioniert, Verbesserungen vorschlagen oder Fehler finden.
1. In den ersten Zeilen des Codes werden lokale Variablen deklariert und einige von ihnen initialisiert. In lsComm werden zum Beispiel der Name des EA und der Name des von der Funktion GetNameTF zurückgegebenen Zeitrahmens geschrieben. Übrigens werde ich nicht auf Funktionen wie GetNameOP, GetNameTF, Message usw. eingehen, nur wenn jemand Fragen dazu hat.
2. Überprüfung der empfangenen Parameter. Wenn sy leer ist, wird es mit dem Namen des aktuellen Werkzeugs initialisiert. Die Variable für die Farbe des Symbols im Diagramm wird durch die Art der Operation initialisiert. Wenn die Verfallszeit des Auftrags, die nicht Null ist, kleiner als die aktuelle Zeit ist, wird sie auf Null zurückgesetzt.
3. der Körper des Zyklus der Handelsversuche, deren Anzahl durch den Wert der globalen Variablen NumberOfTry begrenzt wird. Es folgen die Operationen, die innerhalb der Hauptschleife der Funktion SetOrder ausgeführt werden.
4. Wenn die Funktion SetOrder im Tester nicht ausgeführt wird, haben wir die Möglichkeit, ihre Ausführung zu beenden. Hier wird auf den Freigabezyklus des Handelsstroms gewartet. Die Variablen der Marktumgebung werden aktualisiert und die aktuelle Zeit wird erfasst.
5. Senden einer Anfrage an einen Handelsserver. Wenn das Ticket positiv ist, wird die Funktion SetOrder beendet.
6. Wenn das Ticket negativ ist, wird die Bearbeitung von Ausführungsfehlern durchgeführt.
7. Bei den Fehlern 128 (Wartezeit für die Geschäftsausführung ist abgelaufen), 142 (Auftrag steht in der Warteschlange) und 143 (Auftrag wird vom Händler zur Ausführung angenommen) wird eine Pause von 66 Sekunden eingelegt. Nach der Pause prüfen wir mit der Funktion ExistOrders (die wir später beschreiben werden), ob die Bestellung in der Zeit zwischen der Anfrage des Servers und dem aktuellen Moment bereits eingestellt wurde. Wenn die Reihenfolge festgelegt wurde, beenden Sie die Funktion.
8. Die Positionsgröße sowie der Geld- und Briefkurs werden in den lokalen Variablen gespeichert.
9. Im Falle des Fehlers 130 (Falsche Stops) werden die Preisniveaus der Order, des Stops und des Take-Outs nach Möglichkeit korrigiert.
10. Die Informationen, die zur Lösung des Problems oder zur späteren Fehlersuche beitragen können, werden im Bericht angezeigt.
Am Ende bearbeiten wir weitere Fehler. Einige von ihnen zeigen eine lange Pause (5 Minuten), andere blockieren den Expert Advisor, wieder andere erlauben weitere Handelsversuche, usw.
Das war's! Ende der Beschreibung!
Die Funktion ExistOrders().
Gibt ein Kennzeichen für das Vorhandensein eines Auftrags zurück. Beantwortet die Frage, ob der Auftrag eingestellt ist oder nicht. Mit dieser Funktion können Sie jede beliebige Bestellung, aber auch spezifischere Bestellungen anfordern. Der Anfragefilter wird über die Funktionsparameter konfiguriert:
Beispiele für die Verwendung der Funktion ExistOrders().
1. Verfügbarkeit einer Bestellung prüfen
2. Prüfen Sie die Verfügbarkeit eines beliebigen Auftrags für ein beliebiges Instrument auf dem aktuellen Chart
3. Prüfen Sie das Vorhandensein eines BuyLimit-Auftrags für ein beliebiges Instrument
4. Prüfen Sie, ob eine SellStop-Order mit der magischen Nummer 123456 auf EURUSD vorliegt.
5. Prüfen Sie die Verfügbarkeit von Aufträgen mit einer Rüstzeit von 2 Stunden oder weniger
Im Trailer befindet sich ein Skript zum Testen der Funktion ExistOrders. Die ersten 4 Beispiele im Skript sind auskommentiert.Warnung! Im Beitrag vom 12.03.2008 07:24 habe ich den Anhang SetOrder.mq4 ersetzt