Mql4 Schließen Pending Order In Forex


Ich schrieb diesen Code, um einen ausstehenden Auftrag zu schließen. Wenn ich die EA laufen die Aufträge nicht geschlossen sind. Kann mir jemand eine Hilfe geben Was habe ich falsch gemacht Hier ist der Code (Teil meines Programms) für (cnt0cntlttotalcnt) OrderSelect (cnt, SELECTBYPOS, MODETRADES) if (OrderType () ltOPSELL ampamp check für die geöffnete position OrderSymbol () (OrderType () OPBUYSTOP) if (OrderOpenPrice () lt Ask-StopLossPoint) OrderDelete (OrderTicket ()) return (0) Ich schrieb diesen Code, um einen ausstehenden Auftrag zu schließen. Wenn ich die EA laufen die Aufträge nicht geschlossen sind. Kann jemand mir irgendeine Hilfe geben, was ich falsch gemacht habe Hier ist der Code (Teil meines Programms) Nun, für den Anfang gibt es arent genug, um für (cnttotal-1cntgt0cnt--) zu passen OrderSelect (cnt, SELECTBYPOS, MODETRADES) if (OrderSymbol (OrderType ()), wenn OrderType () OPSELLLIMIT OrderType () OPSELLSTOP () (falls die OrderType () nicht auf der Liste steht ) Check to sell stopslimits if (OrderOpenPrice () lt Bid-StopLossPoint) OrderDelete (OrderTicket ()) Dies sollte es tun. Es wäre auch eine gute Idee, magische Zahlen dort einzufügen, damit Ihr EA wissen kann, welche Reihenfolge es platziert hat. Schließen und Löschen von Aufträgen Handelswünsche zum Schließen von Marktaufträgen werden mit der Funktion OrderClose () gebildet. Function OrderClose () Es ist eine Funktion zum Schließen einer Marktordnung. Die Funktion gibt TRUE zurück, wenn der Trade erfolgreich ausgeführt wird. Er gibt FALSE zurück, wenn der Trade fehlschlägt. Ticket - die eindeutige Nummer des Auftrags. Lose - die Menge der zu schließenden Lose. Es ist erlaubt, einen Wert anzugeben, der kleiner ist als die verfügbare Menge der Partien in der Bestellung. In diesem Fall wird die Bestellung, wenn die Trade-Anfrage erfolgreich ausgeführt wird, teilweise geschlossen. Preis - enger Preis. Dieser Parameter wird entsprechend den Anforderungen und Einschränkungen festgelegt, die für die Durchführung von Trades akzeptiert werden (siehe Order Characteristics and Rules for Making Trades und Anhang 3). Liegt kein Preis für den Abschluss der Marktorder im Preisverlauf vor oder ist er veraltet, so wird diese Handelsanfrage abgelehnt, wenn der Preis veraltet, aber im Preisverlauf und gleichzeitig auch in seiner Abweichung liegt Aus den aktuellen Preisspannen innerhalb des Wertes des Schlupfes, wird die Handelsanfrage vom Client-Terminal akzeptiert und an den Handelsserver gesendet. Schlupf - die maximal zulässige Abweichung des angeforderten Preises für den Abschluss des Auftrags vom Marktpreis (in Punkten). Farbe - die Farbe des Schlusspfeils in einem Diagramm. Wenn dieser Parameter nicht verfügbar ist oder sein Wert gleich dem von CLRNONE ist, wird der Pfeil im Diagramm nicht angezeigt. Wenn das Programm Informationen über den Typ des zu schließenden Auftrags, über seine eindeutige Nummer sowie über die Menge der zu schließenden Lose enthält, ist es sehr einfach, den Auftrag zu schließen. Dazu sollten Sie im Programmcode den OrderClose () - Funktionsaufruf mit voreingestellten Parametern verwenden. Wenn zum Beispiel die eindeutige Nummer der Bestellung Kaufen 12345 ist und Sie 0,5 Lose schließen möchten, kann der Aufruf der Funktion, die den Auftrag schließt, wie folgt aussehen: Um zu entscheiden, welche Aufträge und in welcher Reihenfolge geschlossen werden sollen, Müssen Sie die Daten aller Aufträge in der aktuellen Situation geöffnet haben. In MQL4, gibt es eine Reihe von Funktionen, die verwendet werden, um verschiedene Daten, die jede Ordnung charakterisieren können verwendet werden. Beispielsweise gibt die Funktion OrderOpenPrice () den Wert des offenen Orderpreises (oder des angeforderten Preises für ausstehende Aufträge) zurück, die Funktion OrderLots () gibt die Menge der Chargen zurück, die Funktion OrderType () liefert den Typ des Auftrags, Etc. Alle Funktionen, die die Werte eines Auftragsmerkmalaufrufs bei ihrer Ausführung an die von der Funktion OrderSelect () selektierte Reihenfolge zurückgeben. Funktion OrderSelect () Um die Parameter eines beliebigen Ihrer Aufträge (egal Markt - oder ausstehend, geschlossen oder gelöscht) zu erhalten, sollten Sie es zuerst mit der Funktion OrderSelect () auswählen. OrderSelect ist eine Funktion, die einen Auftrag für weitere Vorgänge auswählt. Er gibt TRUE zurück, wenn die Funktion erfolgreich ausgeführt wird. Ansonsten gibt es FALSE zurück. Index - die Auftragsposition oder - nummer, hängt vom zweiten Parameter ab. Select - das Flag der Auswahlmethode. Die Parameterauswahl kann einen von zwei möglichen Werten annehmen: SELECTBYPOS - im Parameterindex wird die Bestellnummer in der Liste zurückgegeben (die Nummerierung beginnt bei 0), SELECTBYTICKET - im Parameterindex die Ticketnummer (die eindeutige Bestellnummer) ist zurückgekommen. Pool - die Datenquelle zur Auswahl. Der Parameterpool wird verwendet, wenn die Parameterauswahl gleich dem Wert von SELECTBYPOS ist. Der Parameterpool wird ignoriert, wenn der Auftrag über die Ticketnummer (SELECTBYTICKET) ausgewählt wird. Der Parameterpool kann zwei mögliche Werte annehmen: MODETRADES (standardmäßig) - Der Auftrag wird in offenen und ausstehenden Aufträgen ausgewählt, dh unter den im Register "Tradequot" im Fenster "Terminalquot" MODEHISTORY angezeigten Aufträgen wird der Auftrag geschlossen und gelöscht Aufträge, dh unter den Aufträgen, die auf der Registerkarte "Kontoquartierquotent" im Fenster "Terminalquot" angezeigt werden. In diesem Fall ist die vom Benutzer für die Anzeige von geschlossenen und gelöschten Ordnungen angegebene Historienschleife wichtig. Um die Methode der Verwendung von Handelsfunktionen zum Schließen von Marktaufträgen darzustellen, können wir ein Problem lösen: Problem 28. Schreiben Sie ein Skript, das eine der auf dem Konto verfügbaren Marktaufträge schließt. Die Skriptausführung muss zum Schließen der Reihenfolge führen, die dem Ort des Skripts am nächsten liegt, der dem Symbolfenster mit der Maus beigefügt ist. Angenommen, es sind drei Marktaufträge im Terminal für das Symbol EurUsd und eine offene Order für UsdChf geöffnet: 90. Anzeigen mehrerer Aufträge für verschiedene Symbole im Terminalfenster. Wir sollten ein solches Skript schreiben, das mit der Maus aus dem Fenster "Navigatorquot" in das Symbolfenster gezogen werden kann, was zum Schließen einer der Marktordnungen führen sollte, nämlich der Reihenfolge, die dem Cursor am nächsten kommt (ab dem Moment, in dem der Benutzer Die Maustaste freigegeben). In Fig. 91, können Sie die Alternative sehen, bei der der Cursor am nächsten ist, um zu verkaufen 4372889. Es ist diese Reihenfolge, die als Ergebnis der Skriptausführung geschlossen werden muss. Um das Problem zu lösen, sollten wir (unter Verwendung der Funktion OrderSymbol ()) unter allen Aufträgen nur diejenigen auswählen, die für das Symbol geöffnet sind, in dem Fenster das Skript gelöscht wird. Dann sollten wir die offenen Preise aller ausgewählten Marktordnungen finden (d. H. Die Funktion OrderOpenPrice () aufeinanderfolgend für jede Bestellung ausführen). Mit der Kenntnis der Bestellung offenen Preisen, können wir leicht wählen Sie eine von ihnen, die mit der Aussage des Problems entspricht. Um die richtigen Werte von Parametern in der Funktion OrderClose () festzulegen, müssen wir auch einige andere Daten über die gewählte Reihenfolge kennen: die Menge der Chargen (bestimmt durch die Funktion OrderLots ()) und die eindeutige Bestellnummer Funktion OrderTicket ()). Um einen oder einen anderen Preis für ein Zwei-Wege-Angebot zu finden, müssen wir den Typ der Bestellung (bestimmt durch die Funktion OrderType ()) kennen. Ermöglicht, welche Parameter in der Funktion OrderSelect () angegeben werden müssen, um die obigen Bestellmerkmale zu erhalten. Zunächst ist es notwendig, die Reihenfolge Auswahl Methode zu wählen. In unserem Problem wird die Auswahlmethode durch die Problemanweisung selbst bestimmt: Die Daten über Auftragsnummern sollen im Programm ab dem Zeitpunkt des Startes des Skripts zur Ausführung nicht verfügbar sein, dh das Programm wird als einen Block enthalten, der wäre Bestimmen. Das bedeutet, dass wir alle Aufträge nacheinander in der Tabelle "Terminalquot" (Abb. 64.1) überprüfen müssen, so dass wir den Parameter SELECTBYPOS verwenden müssen. Die Quelle für die Auswahl der Aufträge ist ebenso offensichtlich. Um das Problem zu lösen, besteht keine Notwendigkeit, geschlossene und gelöschte Bestellungen zu analysieren. In diesem Fall interessieren wir uns nur für Marktaufträge, deshalb suchen wir sie mit dem Parameter MODETRADES in der Funktion OrderSelect (). Für den Parameterpool wird der Vorgabewert von MODETRADES im Funktionsheader angegeben, so dass er übersprungen werden kann. Im Folgenden wird gezeigt, wie ein Block für die Analyse von Markt - und ausstehenden Aufträgen aufgebaut werden kann: In der Überschrift des Zyklusoperators wird der Anfangswert als i1 angegeben, während die Bedingung zum Beenden des Zyklus der Ausdruck iltOrdersTotal () ist. Function OrdersTotal () gibt den Gesamtbetrag des Marktes und der ausstehenden Aufträge zurück, d. h. die Aufträge, die auf der Registerkarte "Tradequot" im Fenster "Terminalquot" angezeigt werden. Aus diesem Grund wird es so viele Iterationen im Zyklus geben, wie viele Aufträge am Handel teilnehmen. Bei jeder Iteration wird die Bedingung im Operator berechnet, wenn die Funktion OrderSelect (i-1, SELECTBYPOS) ausgeführt wird. Hierbei ist folgende wichtige Angelegenheit zu beachten: Die Numerierung der Aufträge in der Marktliste und anstehenden Aufträgen beginnt mit Null. Dies bedeutet, daß die erste Ordnung in der Liste (90) in Nullstellung gebracht wird, die Position zweiter Ordnung mit 1, die dritte mit 2, usw. nummeriert ist Rufen Sie OrderSelect () auf, der Indexwert wird als i-1 angegeben. Somit ist dieser Index für alle ausgewählten Aufträge immer 1 kleiner als der Wert der Variablen i (der mit der Nummer der nächsten Iteration übereinstimmt). Die Funktion OrderSelect () gibt true zurück, wenn die Reihenfolge erfolgreich ausgewählt wurde. Das bedeutet, dass eine Auftragsauswahl fehlschlagen kann. Dies kann passieren, wenn sich die Menge der Aufträge während der Verarbeitung geändert hat. Bei der Programmierung in MQL4 sollten Sie sich gut daran erinnern, dass ein Anwendungsprogramm im Echtzeitmodus arbeitet und dass während der Verarbeitung einiger Parameter die Werte dieser Parameter geändert werden können. Beispielsweise kann sich die Menge der Marktaufträge sowohl durch die Eröff - nung der Aufträge als auch durch die Modifizierung der noch ausstehenden Aufträge in den Markt ändern. Deshalb sollten Sie bei der Programmierung der Auftragsbearbeitung folgende Regelungen befolgen: Aufträge müssen so schnell wie möglich bearbeitet werden, während der für diese Verarbeitung verantwortliche Programmbaustein möglichst keine redundanten Programmzeilen enthält. Gemäß dem in Fig. 64.3 in der Kopfzeile des Operators, wenn das Programm analysiert, ob die nächste Bestellung in der Auftragsliste zum Zeitpunkt der Auswahl verfügbar ist. Wenn die nächste Bestellung verfügbar ist, wird die Steuerung in den Körper des Bedieners übergeben, wenn die Auftragsparameter verarbeitet werden sollen. Es ist anzumerken, dass eine derartige Konstruktion bei möglichen Konflikten nicht viel hilft, da die Reihenfolge bei der Verarbeitung ihrer Parameter verloren gehen (geschlossen) werden kann. Diese Lösung erweist sich jedoch als am effizientesten, wenn die Bestellung ab dem Zeitpunkt ihrer Auswahl nicht mehr verfügbar ist. Im Körper des Operators, wenn die Parameter der ausgewählten Ordnung analysiert werden. Wenn die Funktionen OrderOpenPrice (), OrderTicket (), OrderType () und andere der Art ausgeführt werden, gibt jeder von ihnen den Wert eines bestimmten Merkmals der Reihenfolge zurück, die als Ergebnis der Ausführung der Funktion OrderSelect () ausgewählt wurde. Alle oben genannten Begründungen wurden in dem Programm verwendet, das Problem 28 lösen würde. Ein Beispiel für ein einfaches Skript, das zum Schließen einer Marktordnung bestimmt ist, deren offener Preis näher am Ort des Skript-Anhangs liegt als die offenen Preise anderer Bestellungen (Closeorder. mq4). Der gesamte Code des Programms closeorder. mq4 ist in der speziellen Funktion start () konzentriert. In Block 1-2 werden einige Variablen initialisiert. Die Variable Dist ist der Abstand von dem Ort, an dem das Skript auf die nächstgelegene Reihenfolge abgesunken ist. Die Variable RealOrder ist ein Merker, der die Verfügbarkeit mindestens einer Marktordnung im Client-Terminal anzeigt (nichtnegativer Wert). Die Variable WinPrice ist der Preis, zu dem der Benutzer das Skript an das Symbolfenster angehängt hat. In Block 2-6 wird der Auftrag analysiert: Einer der bestellten Aufträge ist zugewiesen. Block 6-10 ist der Block, der die Reihenfolge schließt und die Fehler bearbeitet, die während der Durchführung des Handels auftreten können. Ausgehend von dem Moment, in dem der Benutzer das Skript an das Symbolfenster angehängt hat, werden die Werte der Variablen in Block 1-2 berechnet, wobei die Variable WinPrice den Wert des Preises übernimmt, auf dessen Ebene der Benutzer das Skript angehängt hat. Es ist jetzt notwendig, die Ordnung (mit ihren Merkmalen) zu finden, die dieser Stelle am nächsten kommt. Im Zyklus für (Block 2-6) werden die Aufträge durchsucht. In Block 2-3 prüft das Programm, ob es in der nächsten Zeile des Terminalquot einen Auftrag gibt. Wenn ein Auftrag gefunden wird, wird die Kontrolle an den Körper des Betreibers weitergegeben, wenn er die Merkmale dieses Auftrages erhält und analysiert. In Block 3-4 werden die Aufträge für falsche Symbole (nicht das Symbol, für das das Programm ausgeführt wird) ausgefiltert. In unserem Fall ist es bestellt 4372930 für UsdChf geöffnet. Funktion OrderSymbol () gibt den Symbolnamen der ausgewählten Reihenfolge zurück. Wenn dieser Symbolname nicht derjenige ist, für den das Programm ausgeführt wird, wird die aktuelle Iteration unterbrochen, wodurch verhindert wird, dass die Bestellung für ein anderes Symbol verarbeitet wird. Wenn der zu analysierende Auftrag für das Quotierungssymbol geöffnet wird, wird eine weitere Überprüfung durchgeführt. Die Auftragsart wird über die Funktion OrderType () ermittelt (siehe Handelsarten). Wenn die Auftragsart mehr als 1 beträgt, bedeutet dies, dass die Bestellung noch aussteht. In diesem Fall wird auch die aktuelle Iteration unterbrochen, weil wir an anstehenden Aufträgen nicht interessiert sind. In unserem Beispiel haben wir eine solche Ordnung, aber es ist für ein anderes Symbol geöffnet, so dass es bereits gefiltert wurde. Alle Aufträge, die Block 3-4 erfolgreich durchführen, sind marktfähige. Der Block 4-5 dient dazu, nur einen Auftrag aller Marktaufträge auszuwählen, die den vorangehenden Block erfolgreich bestanden haben. Diese Reihenfolge muss am nächsten zum vordefinierten Preis stehen (der Wert der Variablen WinPrice). Der Benutzer ist nicht verpflichtet, quotpinpointquot der Auftragslinie mit seinem Mauszeiger. Die Reihenfolge, die dem Cursor zum Zeitpunkt des Startens des Skripts zur Ausführung näher liegt als alle anderen Befehle, wird ausgewählt. Der offene Preis der bearbeiteten Bestellung wird mit der Funktion OrderOpenPrice () ermittelt. Ist der Absolutwert des Abstands zwischen dem Preis der laufenden Bestellung und dem Quotientenpreisquot kleiner als der gleiche Abstand für die vorhergehende Reihenfolge, so wird die aktuelle Reihenfolge ausgewählt (der absolute Wert der Distanz ist zum Ausschluss des Einflusses von Die Cursorposition - unter oder über der Auftragslinie). In diesem Fall wird diese Reihenfolge bei der laufenden Iteration des Zyklus als Vorläufer gespeichert, um geschlossen zu werden. Für diese Bestellung werden am Ende des Blocks 4-5 die Ticketnummer (die individuelle Bestellnummer) und die Losmenge berechnet. In diesem Beispiel (Abb. 90) ist die Gesamtmenge der Aufträge vier (drei marktfähige und eine ausstehende Order), so dass im Zyklus vier Iterationen durchgeführt werden, die dazu führen, dass alle notwendigen Daten zum Schließen von einem gefunden werden Ausgewählt. Dann wird die Steuerung in dem Ausführungsprogramm an den Zyklusoperator übergeben (Block 6-10). In Block 6-7 werden die gefundenen Marktaufträge auf Verfügbarkeit überprüft. Wenn im Block 2-4 keine Marktaufträge gefunden werden (es ist durchaus möglich, im allgemeinen), bleibt der Wert des Flags RealOrder gleich -1, was bedeutet, daß die Marktbestellungen nicht verfügbar sind. Wenn die Prüfung in Block 6-7 keine Marktaufträge erkennt, wird die Ausführung des Zyklus, während er unterbrochen wird, das Programm beendet seine Operationen. Wenn der Wert der Variablen RealOrder gleich 0 oder 1 ist, bedeutet dies, dass ein Markt für den Abschluss vordefiniert ist und geschlossen werden muss. In Block 7-8 wird entsprechend der Auftragsart der enge Auftragswert berechnet. Es ist der Wert der Bid for Buy-Aufträge und der Wert der Ask for Sell-Aufträge (siehe Anforderungen und Einschränkungen in Making Trades). In Block 7-8 werden die Werte der Hilfsvariablen Text berechnet. Die Handelsaufforderung zum Abschluss des Auftrags wird in der Funktion OrderClose () in der unten stehenden Zeile gebildet: Handelsfunktion OrderClose () gibt true zurück, wenn der Trade erfolgreich durchgeführt wird, andernfalls false. Wenn die Handelsanforderung erfolgreich auf dem Server ausgeführt wird, wird der Variable Ans (Antwort) der Wert true zugewiesen. Wenn in diesem Fall Block 8-9 ausgeführt wird, informiert das Programm den Benutzer über einen erfolgreichen Befehlsabschluss. Danach wird die Ausführung des Zyklus-Operators gestoppt, und das Programm beendet seine Operationen. Andernfalls wird die Steuerung an Block 9-10 weitergegeben, um den vom Client-Terminal an das Programm zurückgegebenen Fehler zu analysieren. Am Anfang von Block 9-10 wird der Fehlercode berechnet. Danach werden entsprechend dem Fehlercode entweder Programmausgang oder wiederholter Vorgang ausgeführt. Bei dem ersten Operatorschalter verarbeitet das Programm die Fehler, die implizit überwindbar sind, d. h. die Fehler können als vorübergehende Schwierigkeiten bei der Durchführung des Handels angesehen werden. Für jeden dieser Fehler werden alle notwendigen Aktionen durchgeführt, dann wird die aktuelle Iteration gestoppt und die Ausführung des Zyklus während des Neustarts ausgeführt. (Bitte beachten Sie, dass wir in diesem Beispiel für die Fehlerbehandlung des Operatorschalters, der als Folge der Benutzung des Bedieners verlassen wird, verwendet werden, der als solcher nicht für das Übergeben der Steuerung außerhalb des Bedienschalters vorgesehen ist Nur weil der Operatorschalter ein Teil des Inhalts des externen Zyklusoperators ist und der Operator die laufende Iteration unterbrochen, indem er die Steuerung an den Header des Operators während weiterleitet). Wird der Fehlercode nicht im ersten Operator verarbeitet, gilt dieser Fehler als kritisch. In diesem Fall wird die Steuerung an den zweiten Operatorschalter übergeben, der ausgeführt wird, um dem Benutzer mitzuteilen, dass ein oder ein anderer kritischer Fehler aufgetreten ist. Ferner verwendet das Programm den Operatorbruch, der die Ausführung des Zyklus unterbricht, während. Verlassen des Zyklus, während aus irgendeinem Grund das Übergeben der Steuerung zu Block 9-10 führt, der eine Nachricht über das Ende der Programmoperationen erzeugt. Die Operatorrückkehr stoppt die Ausführung der Sonderfunktion start (), und das Programm beendet seine Operationen. Das praktische Ergebnis, das nach dem Start des Skripts unter den angegebenen Bedingungen (siehe Fig. 90 und 91) erhalten wurde, ist nachfolgend gezeigt. Der Handel erfolgte erfolgreich auf dem Server. Durch den Abschluss eines Auftrags sind zwei Aufträge im Fenster von EurUsd verbleiben. Der Auftragsabschluss wurde auch im Fenster "Terminalquot" angezeigt: Abb. 94. Nach Ausführung des Skriptes closorder. mq4. Zwei Market Orders werden im Fenster "Terminalquot" angezeigt. Später werden die beiden anderen Aufträge auch mit diesem Skript geschlossen. Ausstehende Aufträge löschen Handelsaufträge zum Löschen von ausstehenden Aufträgen werden mit der Funktion OrderDelete () erstellt. Function OrderDelete () Die Funktion löscht den zuvor platzierten ausstehenden Auftrag. Er gibt TRUE zurück, wenn es erfolgreich gearbeitet hat. Ansonsten gibt es FALSE zurück. Ticket - die eindeutige Nummer eines Auftrags. Arrowcolor - die Farbe eines Pfeils in einem Diagramm. Wenn dieser Parameter nicht verfügbar ist oder sein Wert gleich dem von CLRNONE ist, wird der Pfeil im Diagramm nicht angezeigt. Es ist leicht zu sehen, dass die Funktion OrderDelete () keine Spezifikation des Volumens und des Schlusskurses des zu löschenden Auftrags enthält. Der Auftrag wird unabhängig von den Marktpreisen gelöscht. Auch die teilweise Streichung einer Bestellung ist unmöglich. Sie können die Menge der Lose in einem ausstehenden Auftrag in zwei Stufen verringern: Löschen Sie den vorhandenen Auftrag und legen Sie einen neuen ausstehenden Auftrag mit der verringerten (beliebigen) Menge der Lose. Der Algorithmus des Programms, der einen ausstehenden Auftrag löscht, kann ziemlich identisch mit dem des Marktauftrags schließen. Ein kleiner Unterschied besteht darin, dass kein enger Preis erforderlich ist, um einen ausstehenden Auftrag zu löschen, so dass das Programm unten nicht den Block enthält, der die Marktpreise aktualisiert. Ein Beispiel für ein einfaches Skript zum Löschen eines ausstehenden Auftrags, dessen angeforderter Preis näher am Ort des Skript-Anhangs liegt als die Preise anderer ausstehender Aufträge (deleteorder. mq4). Der Fehlerverarbeitungsblock wurde ebenfalls geringfügig geändert. Sie sollten die Möglichkeit von Fehlern im Zusammenhang mit Preisänderungen (Fehler 135 und 136) beim Schließen von Marktaufträgen berücksichtigen, aber solche Fehler treten nicht beim Löschen ausstehender Aufträge auf. Aus dem gleichen Grund wird die Funktion Refresh - rates () nicht im Programm verwendet. Die Verarbeitung solcher Fehler wie Fehler 4 und Fehler 137 (siehe Fehlercodes) kann ein bisschen schwierig sein. Zum Beispiel, wenn Fehler 137 erhalten, kann das Programm berücksichtigen, dass quotbroker busyquot ist. Allerdings stellt sich eine natürliche Frage: Wann ist der Broker frei, für den Benutzer, seine oder ihre Handel fortzusetzen Error 137 keine solche Informationen. Aus diesem Grund muss sich der Programmierer selbst entscheiden, wie er das Programm so verarbeitet, dass er solche Fehler richtig verarbeitet. In einem einfachen Fall kann die Anfrage nach einer gewissen Pause (in unserem Beispiel in 3 Sekunden) wiederholt werden. Andererseits kann der Server nach einer Reihe von nicht erfolgreichen Versuchen, einen Auftrag zu löschen (oder in einem gemeinsamen Fall zu schließen, zu öffnen oder zu modifizieren), einen Fehler 141 zurückgeben - zu viele Anfragen. Dieser Fehler führt dazu, dass das Skript deleteorder. mq4 nicht mehr funktioniert. Im Allgemeinen sind solche Konflikte nicht die Fragen der Programmierung. In solchen Fällen sollten Sie sich an den Kundendienst wenden und die Gründe für die Ablehnung zur Ausführung der Handelsanfrage klären. Der Fehler 145 kann auftreten, wenn ein ausstehender Auftrag (in einem üblichen Fall ein Stoppauftrag einer Marktorder) zu nahe am Marktpreis liegt. Dieser Fehler tritt nicht auf, wenn Sie ständig auf einem ruhigen Markt handeln. Wenn die Preise schnell ändern, kann Ihr Broker entscheiden, dass eine bestimmte Bestellung wird bald eröffnet werden, so dass der Broker nicht zulassen, zu löschen oder zu ändern. Dieser Fehler wird im Skript als kritisch betrachtet und führt zur Beendigung des Programms (es macht keinen Sinn, den Broker mit Handelsanfragen zu belästigen). Wenn sich der Preis nach einer Weile ändert, können Sie versuchen, den Auftrag zu löschen, indem Sie das Skript zur Ausführung erneut starten. Im allgemeinen kann das Auftreten des Fehlers 145 verhindert werden, wenn man die vom Geberzentrum festgelegte Einfrierstufe berücksichtigt. Der Gefrierpegel ist ein Wert, der das Preisband bestimmt, innerhalb dessen der Auftrag als eingefroren betrachtet wird, d. h. es kann verboten sein, ihn zu löschen. Wenn zum Beispiel ein ausstehender Auftrag bei 1,2500 liegt und der Einfrierwert gleich 10 Punkte ist, bedeutet dies, dass, wenn der Preis im Bereich von 1.2490 bis 1.2510 liegt, die Streichung der anhängigen Bestellung verboten ist. Sie können den Einfrierpegelwert erhalten, der die Funktion MarketInfo () mit der Anforderungskennung von MODEFREEZELEVEL ausgeführt hat. Gegenüberstellung von Gegenständen Gegenüber (Gegen-) Bestellung wird eine Marktordnung in die Richtung entgegengesetzt der Richtung einer anderen für das gleiche Symbol geöffneten Marktordnung geöffnet. Wenn Sie zwei entgegengesetzte Ordnungen für ein bestimmtes Symbol haben, können Sie sie nacheinander mit der Funktion OrderCloseBy () schließen. Wenn Sie eine solche Operation durchführen, speichern Sie eine Spalte. Function OrderCloseBy () Die Funktion schließt eine Marktordnung durch eine andere Marktordnung, die für das gleiche Symbol in die entgegengesetzte Richtung geöffnet ist. Die Funktion gibt TRUE zurück, wenn sie erfolgreich abgeschlossen wurde, und FALSE, wenn nicht. Ticket - die eindeutige Nummer des zu schließenden Auftrags. Gegenüber - die eindeutige Zahl der umgekehrten Reihenfolge. Farbe - die Farbe des Schlusspfeils in einem Diagramm. Wenn dieser Parameter nicht verfügbar ist oder sein Wert gleich dem von CLRNONE ist, wird der Pfeil im Diagramm nicht angezeigt. Es ist nicht notwendig, dass entgegengesetzte Ordnungen das gleiche Volumen haben. Wenn Sie einen Auftrag durch eine entgegengesetzte Reihenfolge schließen, wird der Handel in dem Volumen des Auftrags ausgeführt, der das kleinere Volumen hat. Betrachten wir ein Beispiel. Es sollen zwei Marktaufträge desselben Volumens im Client-Terminal, ein Buy und ein Sell sein. Wenn wir diese jeweils einzeln mit der Funktion OrderClose () schließen, ergibt sich unsere wirtschaftliche Leistung aus der Summe der Gewinne, die bei jeder Bestellung erzielt wurden. 95. Ergebnis eines gesonderten Abschlusses von Aufträgen mit der Funktion OrderClose (). Wenn wir jedoch in dieser Situation die Funktion OrderCloseBy () verwenden, die für die gegenseitige Schließung von Aufträgen vorgesehen ist, wird die wirtschaftliche Leistung im Vergleich zur vorherigen Alternative besser sein als der Betrag, der proportional zu den Kosten eines Auftragsspreads ist. 96. Ergebnis der Abschlußaufträge durch andere Aufträge über die Funktion OrderCloseBy (). Es ist offensichtlich, dass es, wenn es entgegengesetzte Aufträge im Terminal zu schließen gibt, wirtschaftlich gesund wäre, die Funktion OrderCloseBy (), nicht OrderClose () zu verwenden. Was das Sparen einer Ausbreitung beim Schließen entgegengesetzter Ordnungen betrifft, so sollten wir einige allgemeine Erklärungen geben. Tatsächlich ist die Eröffnung eines Auftrages (z. B. ein Kaufauftrag) implizit ein Handel, der entgegen der Eröffnung eines Auftrages in der entgegengesetzten Richtung (dh eines Verkaufsauftrags) in demselben Ausmaß ist, wie das Schließen des Auftrages (Kauf Auftrag). Mit anderen Worten, es ist ökonomisch das gleiche, welches von den Alternativen zu verwenden: nur um eine Marktordnung zu schließen oder eine entgegengesetzte Reihenfolge des gleichen Volumens zu öffnen (und dann beide Aufträge beide zu schließen). Der Unterschied zwischen diesen beiden Alternativen kann nur in verschiedenen Methoden bestehen, die in verschiedenen Handelszentren verwendet werden, um das Geld zu berechnen, das zur Unterstützung von Marktordnungen abgezweigt werden soll (siehe Abb. 85 und Abb. 88). Es ist auch leicht zu sehen, dass der enge Preis nicht in der Funktion OrderCloseBy () für das Schließen von entgegengesetzten Aufträgen angegeben werden muss. Es ist unnötig, weil der Gewinn und der Verlust von zwei entgegengesetzten Aufträgen sich gegenseitig bezahlt, so dass die gesamtwirtschaftliche Produktion nicht vom Marktpreis abhängt. Natürlich ist diese Regel nur für Aufträge desselben Datenträgers wirksam. Wenn wir zum Beispiel zwei Aufträge für ein Symbol haben: einen Kaufauftrag von 1 Los und einen Verkaufsauftrag von 0,7 Lot, so hängt dieser Handel nur vom Marktpreis ab, der mit dem Kaufauftragsteil von 0,3 Lot zusammenhängt, während 0,7 Lot Beide Aufträge hängen nicht vom Symbolpreis ab. Gegenläufige Aufträge haben keinen Einfluss auf die gesamten Handelsergebnisse. Aus diesem Grund haben die Handelstaktiken, die auf der Öffnung der entgegengesetzten Aufträge basieren, keinen informellen Inhalt (aus diesem Grund schließen einige Handelspartner zwangsläufig alle entgegengesetzten Aufträge innerhalb der übereinstimmenden Mengen von Losen ab). Der einzige (negative) Einfluss dieser Taktik kann darin bestehen, dass Geld in Übereinstimmung mit den Regeln, die in einigen Handelszentren akzeptiert werden, umgeleitet wird. Außerdem bietet die Verfügbarkeit von mehreren entgegengesetzten Aufträgen mehr Schwierigkeiten im Rahmen des programmierten Handels, als eine Bestellung. Betrachten wir verschiedene Provisionen und Swaps (für jede Market Order separat), wird die Notwendigkeit, gegenläufige Aufträge zu schließen, offensichtlich. Ein Beispiel für ein einfaches Skript, das alle entgegengesetzten Befehle für ein Symbol schließt (closeby. mq4). Der Algorithmus des obigen Skripts ist ein wenig anders als die vorhergehenden. Dieser Unterschied besteht darin, dass der gleiche Code mehrere Male ausgeführt werden muss, um mehrere Aufträge (die Anzahl der zu schließenden Aufträge in nicht begrenzt) erfolgreich zu schließen. Das Skript wurde auf einer zufälligen Reihe von Marktaufträgen getestet. In Fig. 5 sind 5 Ordnungen unterschiedlicher Volumina dargestellt. 97 weiter unten. Um die vorhandenen entgegengesetzten Aufträge zu schließen, sollten wir die Auswahlkriterien vordefinieren. Dieses Kriterium im gegebenen Algorithmus ist die Auftragsgröße - die Aufträge größerer Volumina werden zuerst geschlossen, dann werden die Aufträge kleinerer Volumina geschlossen. Nachdem die entgegengesetzten Ordnungen verschiedener Volumina geschlossen wurden, bleiben die Ordnungen der ruhenden Volumina erhalten. Zum Beispiel wird das Schließen von entgegengesetzten Aufträgen Kaufen (1 Los) und Verkauf (0,8 Los) in dieser Bestellung führen Kauf (0,2 Los) bleibt geöffnet. Aus diesem Grund muss das Programm nach jedem erfolgreichen Schließen auf die aktualisierte Liste der Aufträge verweisen, um in dieser aktualisierten Liste zwei andere größere entgegengesetzte Aufträge zu finden. Die obigen Berechnungen werden in einem (bedingt) kontinuierlichen Zyklus realisiert, während in den Blöcken 2-10. Der Beginn des Zyklus, bei jeder Iteration das Programm setzt voraus, dass es keine Aufträge von einer bestimmten Art mehr. Hierzu wird den Variablen HedgBuy und HedgSell der Wert -1 zugewiesen. Der Algorithmus des Auftragsbearbeitungsblocks wird im allgemeinen konserviert (siehe den Code von closeby. mq4). Im Auftragssuchzyklus für, nämlich im Block 3-4, werden, wie bei den vorangehenden Programmen, ausgegebene Wrongquot-Aufträge herausgefiltert. In diesem Fall handelt es sich um Aufträge, die für ein anderes Symbol und anstehende Aufträge geöffnet wurden. In Block 4-5 wird das in Block 3-4 geprüfte Volumen jeder Bestellung berechnet. Wenn sich während der Berechnungen herausstellt, dass der aktuell verarbeitete Auftrag unter allen ausgegebenen Aufträgen der größte Volumen ist, wird sein Ticket gespeichert. Dies bedeutet, dass die Bestellung mit diesem Ticket in diesem Stadium der Berechnungen ein Kandidat für das Schließen von entgegengesetzten Ordnungen ist. Zu dem Zeitpunkt, zu dem die letzte Iteration des Zyklus für die Endbearbeitung stattgefunden hat, sind die Karten von Aufträgen mit einer maximalen Menge von Losen, die in entgegengesetzten Richtungen geöffnet sind, bereits bekannt. Diese Aufträge werden vom Programm ausgewählt. Wenn zu diesem Zeitpunkt bereits Aufträge beliebiger Art nicht verfügbar sind, beendet Block 5-6 das Programm. Block 6-10 repräsentiert die Fehlerverarbeitung. Es ist völlig das Gleiche wie die oben (in diesem und vorhergehenden Abschnitten). Die Handelsaufforderung zum Schließen von entgegengesetzten Aufträgen wird in Block 7-8 mit der Funktion OrderCloseBy () gebildet. Wenn es nach dem Fehlercode fehlschlägt, übergibt das Programm das Steuerelement, um die Ausführung des Handels (für dieselben Tickets) oder die Rückkehr des Operators, die die Programmoperationen beendet, erneut zu versuchen. Wenn ein Trade erfolgreich ausgeführt wird, beendet das Programm den Fehlerverarbeitungsblock und die aktuelle Iteration des am meisten externen Zyklus, während er endet. Die nächste Iteration dieses Zyklus, werden alle Berechnungen wiederholt: Suchen in den verfügbaren Aufträgen, Auswählen von Marktaufträgen, Auswählen eines, das für jeden der Auftragstypen angekreuzt ist, eine Handelsanfrage für das entgegengesetzte Schließen und eine anschließende Fehleranalyse bilden. Dieser Zyklus wird so lange ausgeführt, bis in dem Terminal keine verfügbaren Aufträge eines bestimmten Typs (oder im Einzelfall beider Typen) vorhanden sind. Dieses Ereignis wird in Block 5-6 berechnet, dann beendet das Programm seine Operationen. Die folgenden Meldungen wurden bei der Ausführung des Skripts closeby. mq4 empfangen, der zum Schließen der in Fig. 97: Auf der Registerkarte Kontingenthistoriequot im Fenster "Terminalquot" können Sie sehen, dass einige Aufträge mit einem Gewinn von Null abgeschlossen sind. Das ist es, was wir retten, wenn wir gegenüberstehen. Sie können die wirtschaftlichen Ergebnisse in Abb. 97 und Fig. 99: Auf der Registerkarte "Journalquot" im Fenster "Terminalquot" können Sie den Verlauf des Auftragsabschlusses verfolgen (die letzten Ereignisse sind oben): die Ausführung des Skripts, nach dem Algorithmus werden die Aufträge der momentan verfügbaren maximalen Lautstärke sein abgeschlossen. Trotz der Tatsache, dass die Aufträge in einer zufälligen Reihenfolge geöffnet wurden (Abb. 97), waren die ersten zu schließenden Aufträge Kauf 778594 und Verkauf 778595 mit einem Volumen von 1 Los und 0,8 Los (die unteren Linien in Abb . 100). Da diese Aufträge unterschiedliche Volumina haben, führte die gegenteilige Schließung zu einem neuen Auftrag, Buy 778597, mit dem Ruhevolumen von 0,2 Lot. Then the program selected orders Buy 778592 and Sell 778593, 0.5 lot each, to be closed as opposite orders. These orders were closed without opening a resting order. By the moment the third iteration started, two orders had remained in the symbol window in the external cycle: initial order Sell 778596 of 0.3 lot and the order opened as a result of the execution of the script, Buy 778597 of 0.2 lot. In the upper lines of Fig. 100, you can see that those orders are also closed as opposite orders. The volumes of those orders were different, so the last trade resulted in that one market order of 0.1 lot remained in the symbol window (please note the economic results): It is convenient to use the script closeby. mq4 in manual trading, especially in cases of many differently-directed market orders available in the symbol window.

Comments