Es gibt Zeiten, wenn mit der schnellen Möglichkeit, Doppelklick auf ein Skript zu schließen, alle gewinnbringende Trades auf einem Konto oder auf eine gegebene magische Zahl kommt praktisch. Ob Sie einen großen oder kleinen Gewinn zu nehmen, die CloseAllAllSymbolsProfit MQL4 Skript für Metatrader gehört in jedem Forex Trader Arsenal von Tools. Doppelklicken Sie einfach das Skript aus dem Navigatorfenster, nachdem Sie es in den richtigen Ordner kopiert haben, und alle offenen profitable Trades (offene Aufträge) sollten für die gewählte Magic-Nummer geschlossen sein. Der Standardwert ist, alle Trades für alle Magic-Nummern zu schließen (MagicNumber -1). CloseAllAllSymbolsProfit MQL4 ist ein Metatrader 4-Skript, das ein Konto durchsucht und alle offenen Trades schließt, die mit der ausgewählten Magic-Nummer übereinstimmen. Standardmäßig sind alle gewinnbringenden Geschäfte geschlossen, so dass dies eine praktische Möglichkeit, den Markt zu beenden und nehmen Sie den Gewinn in einem Blitz. Das Skript enthält Standardwerte, die ausgeführt werden, wenn Sie den Code nicht innerhalb des MetaEditors manuell bearbeiten. Wenn MagicNumber -1, dann schließen Sie alle magischen Zahlen extern int MagicNumber -1 Pips des Schlupfes, um extern int Slippage zu erlauben 7 Wenn Sie den maximalen Wert für Schlupf ändern möchten, müssen Sie den Wert im Code ändern, bevor Sie das Skript in Ihrem Diagramm ausführen . Klicken Sie mit der rechten Maustaste auf das Navigationsfenster, während Sie den Namen der Scripts auswählen, und wählen Sie Ändern. Dies sollte den MetaEditor öffnen und das Script in den Speicher laden. Ändern Sie den Wert wie gewünscht, und klicken Sie dann auf die Schaltfläche Compile oben im MetaEditor. So verwenden Sie CloseAllAllSymbols. mq4 Laden Sie die Datei herunter und kopieren Sie sie in Ihren Ordner ..expertsscripts. Nach dem Neustart von Metatrader 4, so dass es eine Chance zu kompilieren und finden Sie das Skript und legen Sie es in der Navigator-Fenster. Sie sollten das Skript CloseAllAllSymbolsProfit unter Scripts aufgelistet sehen, wenn Sie die Datei an den richtigen Speicherort kopiert und den Metatrader neu gestartet haben. Seien Sie vorsichtig, denn wenn Sie doppelklicken Sie auf das MT4-Skript alle gewinnbringende Trades auf allen ausgewählten Diagrammen sollten sofort schließen Sie können dieses MT4-Skript auf andere Websites, aber wenn Sie dies tun, müssen Sie einen Link zu dieser Seite direkt und Sie können es nicht verkaufen Oder den Quellcode. Sie sind ansonsten frei, dieses MQL4-Skript für den nicht kommerziellen Gebrauch zu kopieren, zu verwenden und zu verbreiten. Hinweis: aktualisiert 11112011, um einen kleinen Fehler zu beseitigen, der verhindert, dass das Skript ordnungsgemäß entladen wurde, und überarbeitete die for-Schleifenrichtung, um alle Füllungsmöglichkeiten zu berücksichtigen. Schliessen und Löschen von Aufträgen Handelsaufträge zum Schließen von Marktaufträgen werden mit der Funktion OrderClose () . 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 Handel fehlschlägt. Ticket - die eindeutige Nummer des Auftrags. - die Menge der zu schließenden Partien. 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 gemäß 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 ist, aber im Preisverlauf und gleichzeitig auch in seiner Abweichung festgestellt wird 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 schließenden 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. 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. Zum Beispiel, wenn die eindeutige Nummer der Bestellung kaufen 12345 ist und wenn Sie 0,5 Los 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 können, um verschiedene Daten, die eine beliebige Reihenfolge zu charakterisieren. Beispielsweise gibt die Funktion OrderOpenPrice () den Wert des offenen Orderpreises (oder des angeforderten Preises für ausstehende Bestellungen) zurück, die Funktion OrderLots () gibt die Menge der Chargen zurück, die Funktion OrderType () gibt den Auftragstyp, Etc. Alle Funktionen, die die Werte eines Auftragsmerkmalaufrufs bei ihrer Ausführung an den Auftrag zurückgeben, der von der Funktion OrderSelect () ausgewählt wurde. 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. Parameterauswahl kann einen von zwei möglichen Werten annehmen: SELECTBYPOS - im Parameterindex wird die Auftragsnummer 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 der Parameter select 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 (voreingestellt) - der Auftrag wird in offenen und ausstehenden Aufträgen selektiert, dh unter den im Register "Tradequot" im "Terminalquot" - Fenster 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 zu demonstrieren, 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 ist (ab dem Zeitpunkt, zu dem der Benutzer Die Maustaste freigegeben). In Fig. 91, können Sie die Alternative sehen, bei der der Cursor am nächsten kommt. 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). Wir wissen, die 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 ()). Außerdem müssen wir, um einen oder einen anderen Preis eines Zweisatzes zu finden, den Typ des Auftrags kennen (bestimmt durch die Funktion OrderType ()). Ermöglicht, welche Parameter in der Funktion OrderSelect () angegeben werden müssen, um die obigen Order-Merkmale 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. Dies 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 Aufträge 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 Zyklus-Operators wird der Anfangswert als i1 angegeben, während die Bedingung zum Beenden des Zyklus der Ausdruck iltOrdersTotal () ist. Function OrdersTotal () gibt den Gesamtbetrag von marktüblichen und ausstehenden Aufträgen zurück, d. h. die Aufträge, die im Register "Tradequot" im Fenster "Terminalquot" angezeigt werden. Deshalb gibt es so viele Iterationen im Zyklus, 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. Hier ist die folgende wichtige Angelegenheit zu beachten: Die Nummerierung der Aufträge in der Marktliste und anstehenden Aufträgen beginnt mit Null. Das bedeutet, daß die erste Ordnung in der Liste (Fig. 90) auf Null gestellt ist, die Position zweiter Ordnung mit 1, die dritte Zahl mit 2, usw. numeriert 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 der Auftrag 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. So kann sich zum Beispiel die Menge der Marktaufträge sowohl durch den Eröffnungsabschluss von Aufträgen als auch durch die Modifizierung der ausstehenden Aufträge in den Markt ändern. Deshalb sollten Sie bei der Programmierung der Auftragsbearbeitung folgende Regelungen beibehalten: 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 dem Header 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 zu beachten, dass eine solche 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 der Auftrag ab dem Zeitpunkt seiner 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 Flag, das 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 geschlossen. Block 6-10 ist der Block des Schließens der Reihenfolge und der Verarbeitung der Fehler, die während der Durchführung des Handels auftreten können. Ab dem Moment, in dem der Benutzer das Skript an das Symbolfenster anhängt, 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 am nächsten zu dieser Stelle ist. 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 der QuoteTerminalquot 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 Bestellung 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 vorhergehenden 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 über die Funktion OrderOpenPrice () ermittelt. Wenn der Absolutwert des Abstands zwischen dem Preis der laufenden Bestellung und dem Quotientenpreisquot kleiner als der gleiche Abstand für die vorhergehende Reihenfolge ist, 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 zum Schließen gespeichert. 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 Markt-und eine ausstehende Bestellung), so dass es vier Iterationen im Zyklus gibt, die dazu führen werden, 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, dass die Marktanforderungen nicht verfügbar sind. Wenn die Prüfung in Block 6-7 keine Marktaufträge erkennt, wird die Ausführung des Zyklus während des Vorgangs unterbrochen, das Programm beendet dann 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 Schlusskurs der Bestellung berechnet. Es ist der Wert von Bid for Buy-Aufträgen und der Wert von Ask for Sell-Aufträgen (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 folgenden Zeile gebildet: Trade-Funktion 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. In diesem Fall wird, wenn der Block 8-9 ausgeführt wird, das Programm den Benutzer über einen erfolgreichen Befehlsabschluß informieren. 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. In 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. Alle notwendigen Aktionen werden für jeden dieser Fehler ausgeführt, dann wird die aktuelle Iteration gestoppt und die Ausführung des Zyklus während des Neustarts. (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 Zyklus-Operators ist, während der Operator die laufende Iteration unterbricht, 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 unten gezeigt. Der Handel wurde erfolgreich auf dem Server durchgeführt. Durch das Schließen 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 Marktaufträge werden im Fenster "Terminalquot" angezeigt. Später werden die beiden anderen Aufträge auch mit diesem Skript geschlossen. Löschen ausstehender Aufträge 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 einer ausstehenden Reihenfolge 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, das einen ausstehenden Auftrag löscht, kann ziemlich identisch mit dem des Marktauftrags schließen. Ein leichter Unterschied besteht darin, dass kein enger Preis erforderlich ist, um einen ausstehenden Auftrag zu löschen, so dass das folgende Programm 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 leicht 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 demselben Grund wird die Funktion Refresh - rates () im Programm nicht 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, seinen Handel fortzusetzen Error 137 keine solche Informationen. Aus diesem Grund muss sich der Programmierer selbst entscheiden, wie das Programm, das solche Fehler richtig verarbeitet, zu erstellen ist. In einem einfachen Fall kann die Anforderung 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) dem Marktpreis zu nahe liegt. Dieser Fehler tritt nicht auf, wenn Sie ständig auf einem ruhigen Markt handeln. Wenn sich die Preise schnell ändern, kann Ihr Broker entscheiden, dass eine bestimmte Bestellung bald eröffnet wird, damit der Broker es nicht zulässt, sie 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 eine ausstehende Bestellung bei 1,2500 liegt und die Einfrierstufe gleich 10 Punkte ist, bedeutet dies, dass, wenn der Preis zwischen 1.2490 und 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. Closing Opposite Orders Gegenüberstellung (Counter) Order ist eine Marktordnung, die in die Richtung entgegengesetzt der Richtung einer anderen Marktordnung geöffnet wird, die für dasselbe Symbol geöffnet ist. Wenn Sie zwei entgegengesetzte Ordnungen für ein bestimmtes Symbol haben, können Sie sie nacheinander mit der Funktion OrderCloseBy () schließen. Wenn Sie einen solchen Vorgang durchführen, wird ein Spread gespeichert. 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 der zu schließenden Bestellung. Gegenteil - die eindeutige Zahl der umgekehrten Reihenfolge. Farbe - die Farbe des schließenden 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 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 () einsetzen, die für die gegenseitige Schließung von Aufträgen vorgesehen ist, wird die wirtschaftliche Leistung im Vergleich zur vorherigen Alternative besser als der Betrag sein, 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, wenn es entgegengesetzte Aufträge im Terminal zu schließen, wäre es wirtschaftlich gesund, 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 Auftrags (z. B. ein Kaufauftrag) implizit ein Handel, der entgegen der Eröffnung eines Auftrags in der entgegengesetzten Richtung (dh eines Verkaufsauftrags) in dem Maße ist, wie die Bestellung abgeschlossen ist (der Kauf Auftrag). Mit anderen Worten, es ist ökonomisch das gleiche, was von den Alternativen zu verwenden: nur um eine Marktordnung zu schließen oder eine entgegengesetzte Reihenfolge des gleichen Volumens zu öffnen (und dann beide Bestellungen miteinander 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 Schlusspreis nicht in der Funktion OrderCloseBy () zum Schließen von entgegengesetzten Aufträgen angegeben werden muss. Es ist unnötig, weil der Gewinn und der Verlust von zwei entgegengesetzten Aufträgen gegenseitig bezahlt werden, so dass die gesamtwirtschaftliche Produktion nicht vom Marktpreis abhängt. Natürlich ist diese Regel nur für Aufträge desselben Volumens wirksam. Wenn wir z. B. zwei Aufträge für ein Symbol haben: einen Kauf von 1 Los und einen Verkaufsauftrag von 0,7 Lot, so hängt dieser Handel nur von dem Marktpreis ab, der mit dem Kaufteil von 0,3 Los verbunden ist, 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, keine informellen Inhalte (aus diesem Grund schließen einige Handelszentren zwangsweise alle entgegengesetzten Aufträge innerhalb der übereinstimmenden Mengen von Losen). Der einzige (negative) Einfluss solcher Taktiken kann darin bestehen, dass Geld in Übereinstimmung mit den Regeln, die in einigen Handelsplattformen 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. Wenn wir verschiedene Provisionen und Swaps betrachten (für jede Marktordnung separat), wird die Notwendigkeit, entgegengesetzte 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 der entgegengesetzten Aufträge 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 erhalten (siehe den Code von closeby. mq4). Im Auftragssuchzyklus für, nämlich im Block 3-4, werden, wie bei den vorangegangenen Programmen, wongwrongquot-Befehle herausgefiltert. In diesem Fall handelt es sich um Aufträge für ein anderes Symbol und ausstehende Aufträge. 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 bearbeitete Auftrag unter allen ausgegebenen Aufträgen der größte 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. In dem Augenblick, in dem die letzte Iteration des Zyklus für Beendigungen durchgeführt worden ist, sind die Karten von Aufträgen mit einer maximalen Menge von Losen, die in entgegengesetzten Richtungen geöffnet wurden, 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 dasselbe wie oben (in diesem und in den 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, bilden eine Handelsanfrage für die entgegengesetzte Schließung und nachfolgende Fehleranalyse. This cycle is executed until there are no available orders of a certain type (or, in a particular case, of both types) in the terminal. This event will be calculated in block 5-6, then the program ends its operations. The following messages were received at the execution of the script closeby. mq4 intended for closing of market orders shown in Fig. 97: On the quotAccount Historyquot tab of the quotTerminalquot window, you can see that some orders are closed with a zero profit. This is what we save when closing opposite orders. You can compare economic results in Fig. 97 and Fig. 99: On the quotJournalquot tab in the quotTerminalquot window, you can track the history of order closing (the latest events are on top): the execution of the script, according to the algorithm, the orders of maximum volume available at the moment will be closed. In spite of the fact that the orders were opened in a random sequence (Fig. 97), the first orders to be closed were Buy 778594 and Sell 778595, with the volumes of 1 lot and 0.8 lot, respectively (the lower lines in Fig. 100). Since these orders have different volumes, the opposite closing produced a new order, Buy 778597, with the resting volume of 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.
No comments:
Post a Comment