Wednesday, December 14, 2016

Mql4 Anzahl Der Offenen Bestellungen Und Forex

MetaTrader 4 - Beispiele MagicNumber: quotMagicquot Kennung des Auftrags 1. Präambel In 3 war das Management von offenen Positionen eher zeitaufwendig. Die Händler hatten ein recht begrenztes Werkzeug zur Verfügung, um mit der Liste der offenen und geschlossenen Positionen zu arbeiten. Das Problem der Unterscheidung zwischen eigenen und anderen elses Positionen wurde auf recht komplizierte Weise gelöst. In 4 hat sich die Situation kardinal geändert. Jetzt kann der Händler eine Vielzahl von Funktionen nutzen und alle offenen Positionen verwalten und Bestellungen platzieren und Zugriff auf Informationen über geschlossene Positionen erhalten. Ein spezieller Parameter namens MagicNumber wurde hinzugefügt, um Aufträge zu identifizieren. Dies ist der Parameter, den unser Artikel behandeln wird. 2. Was ist MagicNumber in OrderSend (String-Symbol, int cmd, doppeltes Volumen, doppelter Preis, int slippage, doppelter Stoploss, doppelter Takeprofit, String commentNULL, int magic0 datetime expiration0, Farbe arrowcolorCLRNONE) Magie - Kann als benutzerdefinierter Bezeichner verwendet werden. Wenn eine Bestellung platziert wird (eine Position wird geöffnet), kann man ihr eine eindeutige Nummer zuweisen. Diese Zahl wird daher verwendet, um die obige Reihenfolge von anderen zu unterscheiden. Es gibt keine Verwendung (oder sogar Möglichkeit) Anwendung dieses Merkmals beim Handel manuell, aber es ist wirklich unexpendable beim Handel mit einem Experten (automatisierte Handel). Beispiel 1: Ein Händler und ein Experte handeln gleichzeitig im Client-Terminal. Aufgabe: Der Experte muss nach seinem Algorithmus handeln und darf bei manuell geöffneten Positionen nichts unternehmen. Lösung: Der Experte muss der Position, die geöffnet wird, eine eindeutige, nicht null MagicNumber zuweisen. In Zukunft muss sie nur Positionen verwalten, deren MagicNumber gleich der voreingestellten ist. Beispiel 2: Zwei Experten mit unterschiedlichen Algorithmen handeln im Client-Terminal zur gleichen Zeit. Aufgabe: Der Experte muss nur ihre Befehle verwalten. Lösung: Jeder Experte muss seine einzigartige Nicht-Null-MagicNumber verwenden, wenn er Positionen öffnet. In Zukunft müssen sie nur Positionen verwalten, deren MagicNumber gleich der voreingestellten ist. Beispiel 3: Mehrere Experten, ein menschlicher Händler und ein unterstützender Experte, die einen nicht standardmäßigen Trailing Stop verwirklichen, arbeiten gleichzeitig im Client-Terminal. Aufgabe: Handelsexperten müssen nach ihren Algorithmen arbeiten und dürfen bei manuell geöffneten Positionen nichts unternehmen. Der unterstützende Experte, der Trailing Stop realisiert, kann nur Positionen ändern, die manuell geöffnet werden, aber nicht die, die von anderen Experten geöffnet werden. Lösung: Die Handelsexperten müssen einzigartige MagicNumbers verwenden und nur ihre Positionen verwalten. Der assistierende Experte muss nur diejenigen Positionen modifizieren, die MagicNumber gleich 0 haben. Alle drei Beispiele sind ziemlich realistisch, und die Benutzer könnten wahrscheinlich solche Probleme für sich selbst gesetzt haben. In allen drei Fällen wird die MagicNumber verwendet, um es zu lösen. Dieser Weg ist nicht der Einzige, sondern der Einfachste. 3. Realisierung Lassen Sie uns jetzt die spezifische Aufgabe lösen: Erstellen Sie einen Experten, der nur mit eigenen Positionen arbeiten könnte, ohne auf Positionen zu schauen, die manuell oder von anderen Experten eröffnet wurden. Lassen Sie uns zuerst einen einfachen Experten schreiben, für den das Signal, um eine Position zu öffnen, wenn die MACD-Anzeige Nulllinie ist. Der Experte wird so aussehen: Lassen Sie uns es an die Tabelle und sehen, wie es funktioniert: Alles ist ok, aber es gibt ein Problem hier. Wenn wir während der Expertentätigkeit eine Position eröffnen, wird sie diese Position als eigenständig betrachten und entsprechend handeln. Das ist nicht das, was wir wollen. Wir werden unseren Experten so ändern, dass er nur seine eigenen Positionen verwaltet: Fügen Sie die externe Variable ExpertID hinzu, die zum Ändern der MagicNumber-Werte für Positionen verwendet wird, die vom Experten geöffnet wurden. Nachdem die Position von der OrderSelect () - Funktion ausgewählt wurde, Ob die MagicNumber der gewählten Reihenfolge mit der der ExpertID-Variablen übereinstimmt. Wir schreiben den Wert der ExpertID anstelle von 0 in das MagicNumber-Feld während der Positionsöffnung. In Anbetracht der obigen Änderungen erscheint der Code wie folgt: Der Experte arbeitet, kann der Benutzer Positionen manuell öffnen. Der Experte wird sie nicht berühren. 4. Mehrere identische Experten auf verschiedenen Diagrammen eines Symbols Es gibt Fälle, in denen die gleiche EA auf den Diagrammen des gleichen Symbols handeln muss, aber z. B. mit unterschiedlichen Zeitrahmen. Wenn wir versuchen, unsere Experten auf die Tabelle EURUSD, H1 und auf die EURUSD, M30, gleichzeitig zu bringen, werden sie sich gegenseitig stören: jeder wird die offene Position als seine Position betrachten und sie nach eigenem Ermessen ändern. Dieses Problem kann gelöst werden, indem dem anderen Experten eine andere ExpertID zugewiesen wird. Aber das ist nicht sehr bequem. Wenn es viele Experten verwendet, kann man sich nur unter ihren IDs verstrickt. Wir können dieses Problem mit dem Diagramm Zeitraum als MagicNumber. Wie machen wir das? Wenn wir nur die Chartperiode zur ExpertID hinzufügen, ist es möglich, dass 2 verschiedene Experten auf 2 verschiedenen Charts die gleiche MagicNumber erzeugen. Also werden wir besser multiplizieren ExpertID von 10 und legen Sie die Chart-Periode (seinen Code von 1 bis 9, um genau zu sein) am Ende. Es wird etwa so aussehen: Fügen Sie jetzt diesen Code zu den Experten init () - Funktion und ersetzen Sie ExpertID mit MagicNumber überall. Die endgültige Version des EA sieht so aus: In diesem Aussehen kann der Experte auf mehreren Diagrammen mit unterschiedlichen Perioden verwendet werden. Der Wert der Variablen ExpertID wird sich nur ändern, wenn zwei Experten auf Diagrammen desselben Symbols und Zeitraums (z. B. EURUSD H1 und EURUSD H4) gestartet werden müssen, dies geschieht jedoch äußerst selten. In ähnlicher Weise kann der Benutzer mit Hilfe des obigen Codes seine EAs verbessern und lehren, ihre Positionen von den fremden zu unterscheiden. Achtung: Alle Rechte an diesen Materialien sind von MQL5 Ltd. vorbehalten. Kopieren oder Nachdrucken dieser Materialien ganz oder teilweise ist verboten. OrderExpiration Gibt das Gültigkeitsdatum (falls vorhanden) für die ausgewählte ausstehende oder offene Bestellung zurück. OrderExpiration kann mit der OrderSend-Funktion festgelegt werden. Der voreingestellte Wert ist Null, dh kein Ablauf der eingegebenen Reihenfolge. OrderLots Gibt die Anzahl der Chargen oder die Handelsgröße für den ausgewählten Auftrag zurück. OrderLots wird mit der OrderSend-Funktion auf Auftragserstellung gesetzt. OrderMagicNumber Gibt die Magic-Nummer für den ausgewählten Auftrag zurück. Magic Zahl ist eine Zahl, die verwendet wird, um zwischen Aufträgen für ein gegebenes Symbol und Konto zu unterscheiden. In der Theorie konnten alle Aufträge mit einer separaten Magic-Nummer platziert und mit einer benutzerdefinierten Routine geschlossen werden. In der Praxis können verschiedene Strategien oder unterschiedliche Eingangssignale innerhalb der gleichen Strategie unterschiedliche Magic-Nummern verwenden, um Aufträge für die Berichterstattung oder für Handelsschließungen zu öffnen. OrderOpenPrice Gibt den offenen Preis des aktuell ausgewählten Auftrags zurück. Um den Schlusskurs zu bezeichnen, sehen Sie die OrderClosePrice-Funktion, die den Preis der historischen (geschlossenen) Aufträge zurückgibt. OrderOpenTime Gibt die Öffnungszeit für den ausgewählten Auftrag zurück. OrderPrint Druckt Informationen über den aktuell ausgewählten Auftrag im Expertenprotokoll. Folgende Informationen werden zurückgegeben: OrderTicket, OrderOpenTime, OrderType, OrderLeistung, OrderStopLoss, OrderTakeProfit, OrderCloseTime, OrderClosePrice, OrderCommission, OrderSchap, OrderProfit, OrderComment, OrderMagicNumber, OrderExpiration OrderProfit Gibt den Nettogewinn für die aktuell ausgewählte Order zurück, ausgenommen Swap und Provision. Bei offenen Positionen ist der Rückgabewert das offene Eigenkapital für den ausgewählten Auftrag. Bei geschlossenen Positionen ist der Rückgabewert der geschlossene Reingewinn für den ausgewählten Auftrag. OrderStopLoss Gibt den Stop-Loss-Preis für den aktuell ausgewählten Auftrag zurück. Wenn kein Stop-Loss-Preis gesetzt ist, ist der Rückgabewert Null. Dieser Wert wird in der Regel mit der OrderModify-Funktion für US-Broker festgelegt und kann mit der OrderSend-Funktion für Nicht-U. S.-basierte Broker festgelegt werden. OrderSwap Gibt den Swapbetrag (falls vorhanden) zurück, der dem Konto für den ausgewählten Auftrag belastet oder gutgeschrieben wurde. Swap stellt eine Zinsbelastung für die Durchführung einer Position über Nacht oder eine Zinszahlung für das Halten eines verzinslichen Währungspaares über Nacht dar. Swaps werden durch den Broker festgelegt und sind typischerweise täglich zur gleichen Zeit, zum Beispiel 17:00 Uhr EST, fixiert. OrderSymbol Gibt das in der aktuell ausgewählten Reihenfolge verwendete Symbol zurück. Die OrderSymbol-Funktion und die OrderMagicNumber-Funktion bieten zwei Möglichkeiten, zwischen Aufträgen zu unterscheiden, die auf ein einzelnes Konto gelegt werden, und können bei Schließungsroutinen nützlich sein, wenn nur bestimmte Symbole oder bestimmte Magic-Nummern ausgeschlossen werden sollen. OrderTakeProfit Gibt den Take-Profit-Preis für den aktuell ausgewählten Auftrag zurück. Wenn kein Take Profit Preis gesetzt ist, ist der Rückgabewert Null. Wie bei OrderStopLoss wird der Wert typischerweise mit der OrderModify-Funktion für US-Broker festgelegt und kann mit der OrderSend-Funktion für Nicht-U. S.-basierte Broker festgelegt werden. OrderTicket Gibt die Ticketnummer für den aktuell ausgewählten Auftrag zurück. Die Ticketnummer wird mit der Funktion OrderSend erstellt. OrderType Gibt die derzeit ausgewählte Auftragsart zurück. Es gibt mehrere mögliche Werte: Eröffnung und Platzierung von Aufträgen Mit der Funktion OrderSend () werden Handelsaufträge für die Eröffnung und Platzierung ausstehender Aufträge gebildet. Funktion OrderSend () (Beachten Sie, dass hier und unten, wir verweisen auf Funktions-Header nicht auf ein Beispiel für die Verwendung von Funktionsaufruf in einem Programm). Läßt betrachten in mehr Details, was diese Funktion besteht. OrderSend ist der Funktionsname. Die Funktion gibt die Ticketnummer (Ticket ist die eindeutige Nummer eines Auftrags) zurück, die dem Auftrag vom Handelsserver zugeordnet ist, oder -1, wenn die Handelsanfrage vom Server oder vom Client-Terminal zurückgewiesen wurde. Um Informationen über die Gründe für die Ablehnung der Handelsanfrage zu erhalten, verwenden Sie die Funktion GetLastError () (unten werden wir einige der häufigsten Fehler betrachten). Symbol ist der Name der gehandelten Sicherheit. Jedes Symbol entspricht dem Wert einer Stringvariablen. Zum Beispiel, für das Währungspaar von Euro / US-Dollar, ist dieser Wert ampquotEURUSDampquot. Wenn der Auftrag für ein Vorgängersymbol geöffnet wird, kann dieser Parameter explizit angegeben werden: ampquotEURUSDampquot, ampquotEURGBPampquot usw. Wenn Sie jedoch den Expert Advisor im Fenster eines anderen Symbols verwenden, können Sie die Standardfunktion verwenden Symbol(). Diese Funktion gibt einen Zeichenfolgenwert zurück, der dem Namen des Symbols entspricht, in dem das EA oder Skript ausgeführt wird. Cmd ist die Art der Operation. Die Art der Operation kann als eine vordefinierte Konstante oder deren Wert und je nach Art des Handels angegeben werden. Volumen ist die Menge der Lose. Für Marktaufträge müssen Sie immer das Konto für die Ausreichung überprüfen. Für ausstehende Bestellungen ist die Menge der Lose nicht begrenzt. Preis ist der offene Preis. Sie wird gemäß den Anforderungen und Einschränkungen festgelegt, die für die Durchführung von Geschäften akzeptiert werden (siehe Order Characteristics and Rules for Making Trades). Wenn der Preis für die Eröffnung von Marktaufträgen nicht im Preisfaden gefunden wurde oder wenn er erheblich veraltet ist, wird die Handelsanfrage abgelehnt. Wenn jedoch der Preis veraltet ist, aber in dem Preisfaden vorhanden ist und seine Abweichung von dem aktuellen Preis innerhalb des Wertes des Schlupfes liegt, wird diese Handelsanforderung vom Client-Terminal akzeptiert und an den Handelsserver gesendet. Schlupf ist die maximal zulässige Abweichung des geforderten Auftragspreises vom Marktpreis für Marktaufträge (Punkte). Dieser Parameter wird nicht für die Platzierung ausstehender Aufträge verarbeitet. Stoploss ist der angeforderte Schlusskurs, der den für den jeweiligen Handel zulässigen maximalen Verlust bestimmt. Es wird entsprechend den Anforderungen und Einschränkungen festgelegt, die für die Durchführung von Geschäften akzeptiert werden (siehe Order Characteristics and Rules for Making Trades, Anforderungen und Einschränkungen in Making Trades). Takeprofit ist der angeforderte Schlusskurs, der den maximalen Gewinn für den jeweiligen Handel bestimmt. Es wird entsprechend den Anforderungen und Einschränkungen festgelegt, die für die Durchführung von Geschäften akzeptiert werden (siehe Order Characteristics and Rules for Making Trades, Anforderungen und Einschränkungen in Making Trades). Kommentar ist der Text des Bestellkommentars. Der letzte Teil des Kommentars kann vom Handelsserver geändert werden. Magie ist die magische Zahl der Ordnung. Sie kann als benutzerdefinierte Auftragskennung verwendet werden. In einigen Fällen ist es die einzige Information, die Ihnen hilft, herauszufinden, dass die Reihenfolge zu einem oder einem anderen Programm gehört, das es geöffnet hat. Der Parameter wird vom Anwender gesetzt, sein Wert kann derselbe oder ein anderer Wert sein als der Wert dieses Parameters anderer Aufträge. Das Ablaufdatum ist das Datum, an dem die Bestellung abläuft. Sobald dieser Tag kommt, wird die anstehende Bestellung auf der Serverseite automatisch geschlossen. Auf einigen Handelsservern kann es ein Verbot geben, das Ablaufdatum für ausstehende Aufträge festzulegen. In diesem Fall wird die Anforderung abgelehnt, wenn Sie versuchen, einen Wert ungleich Null des Parameters festzulegen. Arrowcolor ist die Farbe des Öffnungspfeils im Diagramm. Wenn dieser Parameter nicht vorhanden ist oder der Wert CLRNONE ist, wird der Öffnungspfeil nicht in der Tabelle angezeigt. Auf einigen Handelsservern kann es einen Grenzwert für die Gesamtmenge der geöffneten und ausstehenden Aufträge geben. Wenn diese Grenze überschritten wird, wird jede Handelsanforderung, die die Eröffnung einer Marktordnung oder die Erteilung einer anhängigen Bestellung impliziert, vom Handelsserver abgelehnt. Marktaufträge öffnen Die Funktion OrderSend () kann zunächst zu kompliziert erscheinen. Allerdings sind alle betrachteten Parameter ganz einfach, hilfreich und können erfolgreich in Ihrem Trading verwendet werden. Um dies für uns selbst zu sehen, betrachten wir die einfachste Variante, wie die Handelsfunktion OrderSend () für die Eröffnung einer Marktordnung verwendet wird. Zunächst ist zu beachten, dass die Funktion OrderSend () vordefinierte Parameter hat (siehe Funktionsaufruf und Funktionsbeschreibung und Operator return). Dies bedeutet, dass diese Funktion in einem vereinfachten Modus mit dem minimalen erforderlichen Satz von Parametern verwendet werden kann. Diese Parameter sind wie folgt: Symbol ist ein notwendiger Parameter, weil wir wissen müssen, wo die Bestellung zu öffnen. Lassen Sie unser Skript implizieren die Möglichkeit, eine Bestellung in einem Symbol-Fenster zu öffnen. In diesem Fall werden wir die Standardfunktion Symbol () als diesen Parameter cmd ersetzen - zum Beispiel können wir in diesem Fall einen Buy-Auftrag öffnen, wir bestimmen den Parameter OPBUY volume - wir können einen beliebigen Wert angeben, der durch die Regeln erlaubt wird Bestellung, zum Beispiel von 0,1 Los Preis - offenen Preis für die Bestellung Kaufen ist Preis Fragen Schlupf wird in der Regel als 0-3 Punkte angegeben. Hier können 2 Stop-Stop-Stop-Aufträge in einem Abstand platziert werden, der nicht näher als der minimal zulässige Abstand liegt, in der Regel 5 Punkte (siehe Requirements and Limitations in Making Trades) können Aufträge in einem Abstand von 15 Punkten aus dem engen Preis platzieren, Nämlich: Bid - 15Point TakeProfit - können Platzanweisungen in einer Entfernung von 15 Punkten aus dem engen Preis, nämlich: Bid 15Point Unten ist das einfachste Skript, simpleopen. mq4. Die zum Öffnen einer Bestellung vorgesehen ist: Wenn Sie dieses Skript zur Ausführung starten, wird es in den meisten Fällen funktionieren. Das Skript besteht aus einer speziellen Funktion, die die Orderoffnungsfunktion OrderSend () und die Operatorrückkehr enthält. Wir beschreiben den Ausführungsalgorithmus für Programmzeilen und Ereignisse, die damit zusammenhängen. 1. Der Benutzer hat das Skript an das Symbolfenster angehängt, indem er den Skriptnamen mit der Maustaste aus dem Fenster ampquotNavigatorampquot des Client-Terminals in das Fenster des Symbols zieht, für das er einen Marktauftrag Buy of 0.1 eröffnen möchte Und mit Stop-Aufträge, die in einem Abstand von 15 Punkten aus dem Marktpreis sind. 2. Im Moment der Anbindung des Skripts an das Symbolfenster übergibt das Client-Terminal die Steuerung (nur durch das Starten) der Sonderfunktion start () (hier sollten wir kurz darauf hinweisen, dass der start () eines Skripts gestartet wird In dem Moment, in dem das Skript an das Symbolfenster angehängt wird, während der Start () eines EA zu dem Zeitpunkt gestartet wird, zu dem das nächste Tick-Einkommen für das Symbol eintrifft). 3. Im Rahmen der Ausführung der Sonderfunktion start () wird die Steuerung an die Leitung übergeben, die die Auftragsöffnungsfunktion aufruft: Vor der Ausführung dieser Funktion berechnet das Programm die Werte aller Formalparameter: 3.1. Wir haben das Skript an das Fenster von Eur / USd angehängt. In diesem Fall gibt die Standardfunktion Symbol () den Stringwert EURUSD zurück. 3.2. Lassen Sie Fragen 1.2852 und Bid 1.2850 ab dem Zeitpunkt des Aufrufs dieser Funktion. 3.3. Der Wert von StopLoss beträgt in diesem Fall: 1.2850-150.0001 1.2835, während TakeProfit 1.2865. 4.Ausführung der Funktion OrderSend (): 4.1. Die Funktion bildete eine Handelsaufforderung zum Öffnen einer Bestellung und übergab diese Anforderung an das Client-Terminal. 4.2. Die Funktion übergab die Steuerung dem Client-Terminal gleichzeitig mit der Weitergabe der Handelsanfrage, so dass die Programmausführung gestoppt wurde. 4.3. Das Client-Terminal überprüfte die empfangene Handelsanfrage. Es erkannte keine falschen Parameter, also schickte es die Anfrage an den Server. 4.4. Der Server empfing die Handelsanforderung, überprüfte sie, erkannte keine falschen Parameter und entschied sich, die Anforderung auszuführen. 4.5. Der Server führte die Anforderung durch, indem er eine Transaktion in seiner Datenbank durchführte und die Information über diese ausgeführte Anforderung an das Client-Terminal sendet. 4.6. Das Client-Terminal empfing die Informationen darüber, dass die letzte Handelsanforderung ausgeführt worden war, zeigte dieses Ereignis im Terminalfenster und im Symbolfenster an und gab das Steuerelement an das Programm zurück. 4.7. Nach dem Empfang der Steuerung fuhr das Programm fort, von dem Ort aus zu arbeiten, von dem die Steuerung zuvor an das Client-Endgerät übergeben worden war (und zu dem es später zurückgegeben worden war). Bitte beachten Sie, dass im Programm ab Schritt 4.2 bis Schritt 4.7 keine Aktionen durchgeführt wurden - das Programm war im Modus des Wartens auf die Serverantwort. 5. Die Steuerung im Programm wird an den nächsten Operator übergeben - der Operator kehrt zurück. 6. Die Ausführung der Operatorrückgabe führt zum Verlassen der Funktion start () und damit zur Beendigung der Programmausführung (es sollte daran erinnert werden, dass Skripte ihre Arbeit nach deren Ausführung abschließen) - die Steuerung wird an den Client zurückgegeben Terminal. Damit hat das Skript seinen beabsichtigten Zweck erfüllt: Die Bestellung mit den voreingestellten Parametern wird geöffnet. Die Verwendung von Scripts ist sehr bequem, wenn Sie eine kleine einmalige Operation in diesem Fall durchführen müssen, ist die Verwendung eines Skripts durchaus sinnvoll. Gemäß Schritt 4.6. Kann der Händler die Reihenfolge auf dem Bildschirm sehen. Die Ereignisse werden nicht immer wie oben gezeigt geordnet. Es ist möglich, dass die Handelsanfrage vom Client-Terminal oder vom Server zurückgewiesen wird. Lets versuchen, einige Experimente, zum Beispiel, ändern Sie den Symbol-Namen: geben Sie ampquotGBPUSDampquot explizit (dies ist recht zulässig). Wir erhalten ein Programm mit dem begrenzten Einsatzbereich: Lasst das Skript im selben Fenster mit dem Symbol Eur / Usd starten. Das Skript sollte einen Befehl im Fenster von Gbp / Usd öffnen. Nachdem er jedoch am Fenster von Eur / Usd angebracht worden war, wurde im Fenster von Gbp / Usd kein Befehl eröffnet. Ein Nachteil solcher Programme ist ihre funktionale Begrenzung. In diesem Fall wartet der Benutzer, nachdem er das Skript an das Symbolfenster angehängt hat, nur auf die Auftragsöffnung. Die Bestellung wird jedoch nicht geöffnet. Dem Benutzer ist nicht bekannt, warum er so ist: Entweder wird er durch einen algorithmischen Fehler im Programmcode verursacht oder ist die Handelsanforderung ampquotlostampquot durch den Weg zum Server oder die Handelsanforderung wurde vom Client-Terminal lang abgelehnt (Dachte der Benutzer wartet immer noch), oder es gibt einen anderen Grund. Um dem Benutzer (und, was auch sehr wichtig ist, das Programm) mit den Informationen über die mit der Ausführung der Handelsanfrage zusammenhängenden Ereignisse zu versehen, ist es notwendig, die Fehler zu verarbeiten. Fehlerbehandlung Eine sehr wichtige Eigenschaft des Client-Endgeräts ist, dass, wenn ein Fehler während der Ausführung einer Anwendung auftritt, das Client-Terminal die Ausführung des Programms nicht beendet. Fehler werden in der Regel durch die Unvollkommenheit des in der Anwendung verwendeten Algorithmus verursacht. In einigen Fällen werden Fehler durch einige externe (wie im Zusammenhang mit dem Programm) Faktoren verursacht. Die internen Fehlerursachen sind etwaige Verstöße gegen die MQL4-Anforderungen oder Handelsregeln, zum Beispiel mit ungültigen Preisen. Die externen Ursachen sind solche, die nicht mit dem Anwendungsprogramm verknüpft sind, z. B. eine unterbrochene Verbindung. Wenn ein Fehler bei der Ausführung eines Programms auftritt, läuft das Programm weiter, während das Client-Terminal den Fehlercodewert erzeugt, der dem Programm über die Funktion GetLastError () zur Verfügung steht. Funktion GetLastError () Die Funktion gibt den Code des neu aufgetretenen Fehlers zurück, dann wird der Wert des speziellen variablen Lasterfehlers, der den Code des letzten Fehlers speichert, auf Null gesetzt. Der folgende Aufruf von GetLastError () wird 0 zurückgeben. Im folgenden werden wir alle auftretenden Fehler durch diesen Code identifizieren. Während der Ausführung einer Programmfunktion können mehrere Fehler auftreten. GetLastError () erlaubt es uns, den Codewert für nur einen von ihnen, den letzten Fehler, zu erhalten. Deshalb wird jedes Mal, wenn wir diese Informationen benötigen, die Funktion GetLastError ( ) Unmittelbar nach den Programmzeilen, in denen der Fehler auftreten kann. Fehler 130. Ungültige Stopp-Aufträge Das zuletzt betrachtete Skript analysiert keine Fehler, so dass der Benutzer über die Ergebnisse der Ausführung der Auftragsöffnungsfunktion unwissend bleibt. In der einfachen Variante der Verwendung der Funktion GetLastError () kann das Programm einen Fehler analysieren und den Benutzer darüber informieren. Wenn Sie das Skript confined. mq4 für die Ausführung im Fenster von Eur / Usd starten, tritt ein Fehler auf. Wir haben nur eine, aber sehr informative Zeile in dieses Skript hinzugefügt: Funktion GetLastError () gibt den Code des letzten Fehlers zurück, während Alert () verwendet wird, um diesen Wert auf dem Bildschirm anzuzeigen. Nachdem das Skript confined. mq4 dem Fenster des Symbols Eur / Usd beigefügt wurde, wird das Skript ausgeführt, was dazu führt, dass der Benutzer die folgende Meldung sehen wird: Sie finden in den Anhängen Fehlercodes, die bei der Ausführung auftreten können Eines Programms. In diesem Fall trat Fehler 130 (ungültige Stopp-Aufträge) auf. Dies bedeutet, dass die Werte der formalen Parameter, die in der Funktion OrderSend () verwendet werden, nicht den Einschränkungen entsprechen, die in Requirements and Limitations in Making Trades angegeben sind. Bei näherer Betrachtung sehen wir den Grund, der den Fehler verursacht hat: Die aktuellen Werte der Marktpreise Bid und Ask werden aus dem Symbolfenster genommen, an das das Skript angehängt ist, nämlich aus dem Fenster von Eur / Usd. Diese Werte werden jedoch verwendet, um eine Handelsanforderung für Gbp / Usd zu bilden. Als Ergebnis ergibt sich zum aktuellen Preis von Gbp / Usd, Ask 1.9655, der Wert von TakeProfit für die neu eröffnete Marktordnung gleich (bei Eur / Usd Bid 1.2930) 1.2930150.00011. 2945, der beträchtlich niedriger als der minimal zulässige Wert ist, d. H. Er ist ungültig. In diesem Fall trat ein algorithmischer Fehler auf. Um diese zu korrigieren, sollten Sie die korrekten Werte der Symbolpreise verwenden. Diese Werte erhalten Sie über die Funktion MarketInfo (). Das Skript better. mq4, das Aufträge für Gbp / Usd öffnet, kann in jedem Symbolfenster gestartet werden: Der oben genannte Fehler tritt nicht bei der Ausführung dieses Skripts auf, so daß seine Ausführung zur Anzeige der entsprechenden Meldung führt: 0 (null). Dies bedeutet, daß die Funktion GetLastError () den Wert 0 zurücklief, d. h. es wurden keine Fehler bei der Ausführung der Handelsanforderung durch das Client-Endgerät festgestellt. Wir können auch einige andere häufige Fehler. Hierzu kehren wir zu der Idee zurück, eine Bestellung mit einem Skript im selben Fenster zu öffnen, an das das Skript angehängt ist. Fehler 129. Ungültiger Preis In einigen Fällen tritt ein einfacher Fehler auf - der falsche Wert des zweiseitigen Angebots wird als der offene Preis angegeben. Market Orders Buy sind bekannt (siehe Requirements and Limitations in Making Trades), die zum Ask-Preis geöffnet werden. Im Folgenden wird gezeigt, was passiert, wenn wir versehentlich den Bid-Preis im Skript mistaken. mq4 angeben: Vor dem Senden der Trade-Anfrage an den Server analysiert das Client-Terminal, ob die angeforderten Werte für Preis - und Stop-Aufträge den zulässigen Werten entsprechen. Während dieser Überprüfung wird der angeforderte Open-Order-Preis als ungültig erkannt, sodass das Client-Terminal die Handelsanforderung nicht an den Server zur Ausführung sendet und die Funktion GetLastError () den Wert 129 zurückgibt (siehe Fehlercodes). Die Ausführung des Skripts führt zum Auftreten der entsprechenden Fehlermeldung: Fehler 134. Nicht genug Geld für die Herstellung eines Handels Ein ähnliches Ergebnis (Fehler 134) wird erhalten, wenn nicht genügend freies Geld auf dem Konto vorhanden ist, um einen Auftrag zu eröffnen . Sie können wissen, über die Menge an freiem Geld erforderlich, um 1 Lot für den Kauf eines jeden Symbols mit der Funktion MarketInfo (Symbolname, MODEMARGINREQUIRED) öffnen. Die Größe eines Standard-Loses für dasselbe Symbol kann in verschiedenen Handelszentren variieren. Die erforderliche Menge an freien Vermögenswerten zum Öffnen einer Ein-Los-Bestellung ist umgekehrt proportional zum Betrag der bereitgestellten Hebelwirkung. Zur gleichen Zeit beziehen sich die Kosten von 1 Punkt in der Einlagenwährung für ein Symbol nicht auf die bereitgestellte Hebelwirkung. Tabelle 3. Mögliche Kombinationen von 1-Los-Kosten und 1-Punkt-Kosten (Depotwährung ist US-Dollar). Handelszentrum 1 Die Preise verstehen sich ab 16.12.2007. Lets kurz betrachten einige gemeinsame Methoden zur Berechnung der Kosten von 1 Los und von 1 Punkt. Dealing Center 1 (am häufigsten) Für die Symbole, die USD reziprok haben, sind die Kosten für 1 Los gleich dem aktuellen Preis des entsprechenden Zwei-Wege-Zitats multipliziert mit 1000, während die Kosten für 1 Punkt gleich 10. Für die Symbole, die USD als Zähler haben, sind die Kosten für 1 Los gleich 1000.00, während die Kosten für 1 Punkt umgekehrt proportional zum aktuellen Angebot und gleich 1 / (Bid) sind. Zum Beispiel für USD / CHF, bei Bid 1.2466, sind die Kosten für 1 Punkt 1/1. 2466 8.02. Bei Kreuzkursen werden die Kosten für eine Partie genauso berechnet wie für die Zählerwährung, während die Kosten für 1 Punkt auf die gleiche Weise berechnet werden wie für die Nennerwährung. Beispielsweise beträgt für EUR / CHF die Kosten für eine Partie 129,40 (für EUR / USD), während die Kosten für eine Partie 8,02 (für USD / CHF) betragen. Dealing Center 2 In einigen Handelsplattformen können die Werte der Kosten unter Berücksichtigung derselben Regel für die Berechnung der Kosten für einige Symbole unterschiedlich sein. Zum Beispiel können die Kosten von 1 Los und die Kosten von 1 Punkt proportional erhöht oder verringert werden. Beispielsweise kann dieser Faktor 0,75 für GBP / USD betragen, während er für AUD / USD 2,0 beträgt. Eine derartige Darstellung von Kostenwerten führt in solchen Fällen nicht zu wirtschaftlichen Veränderungen, Sie müssen diese Besonderheit nur bei der Berechnung der Kosten Ihrer Aufträge berücksichtigen. Sie sollten auch darauf achten, dass die 1-Los-Kosten für den Kauf und Verkauf von Vermögenswerten mit Kreuzzinsen die gleichen sind. Dealing Center 3 gibt es auch Handelszentren, die die Kosten von 1 Los als 1000,00 für jedes Symbol setzen. Gleichzeitig bleiben die Kosten von 1 Punkt proportional zu den aktuellen Preisen. Dies bedeutet, dass für jedes Symbol eine spezielle Hebelwirkung eingestellt wird. 1-Punkt-Kosten aller Symbole, die nicht in Bezug auf USD angegeben sind, ändern sich proportional zu den Kosten des Symbols, die reziprok angegeben werden. Grundsätzlich gibt es noch andere Prinzipien für den Aufbau von Kostenwerten. Es ist unnötig zu sagen, dass vor dem eigentlichen echten Handel sollten Sie sich über die Berechnungsmethode für ein bestimmtes Handelszentrum und diese Methode in Ihrer Codierung. Bei der Kodierung ist es sehr wichtig, das Prinzip der Bildung von freien Vermögenswerten zu betrachten. Free Margin (Vermögenswerte) ist die Menge an Geld, das für die Herstellung von Geschäften zur Verfügung steht. Betrachten wir ein Beispiel. Lassen Sie Balance 5000.00 sein, es gibt keine offenen Aufträge im Terminal. Ermöglicht eine Bestellbestellung von 1 Los im Handelscenter 3. Im Handelscenter 3 wird folgende Regel angegeben: Werden für ein Symbol unterschiedlich geordnete Marktaufträge geöffnet, so werden die kleineren integrierten Kosten der Einwegaufträge zum Handel freigegeben und erhöht Betrag der freien Vermögenswerte (diese Regel gilt nicht für alle Handelsplätze). Im Terminalfenster werden die Informationen über die geöffnete Reihenfolge angezeigt. Bitte beachten Sie, dass die Marge 1000,00, ist der Auftragserfolg -30,00, daher die Höhe der freien Vermögenswerte (freie Marge) macht 5000-1000-303970.00: Nachdem eine Verkaufsauftrag des gleichen Wertes eröffnet wurde, wird die freie Marge erhöht. Die kleineren integrierten Kosten der Ein-Richtung Marktaufträge macht 1000,00, so dass die freie Marge um 1000,00 erhöhen wird. In Fig. 85 sehen Sie die Situation, in der die unterschiedlich gerichteten Aufträge denselben Wert kosten, so dass die gesamte Auftragssumme zum Handel freigegeben wird. Nachdem eine Verkaufsreihenfolge von kleineren Kosten eröffnet worden ist, wird die freie Marge ebenfalls zunehmen. In diesem Fall machen die kleineren integrierten Kosten der Ein-Richtung-Marktaufträge 700.00, so dass die freie Marge um 700.00 ansteigen wird, während die Marge den Unterschied zwischen den integrierten Kosten unterschiedlich ausgerichteter Aufträge macht (Abb. 86). Wenn eine weitere Bestellung Verkauf von 0,1 Lose geöffnet ist (Kosten 100,00), die kleinere integrierte Kosten der Ein-Richtung Marktaufträge macht 700.00 100. 00 800.00. Somit sinkt die Marge (gegenüber der Situation, bei der nur ein Order Buy eröffnet wird) um 800.00. Im Vergleich zu der in Fig. 86 verringert sich die Marge, während sich das Eigenkapital um 100,00 erhöht (siehe Abb. 87). Freie Ränder in Abb. 86 und Fig. 87 unterscheiden sich um mehr als 100,00, da sich das integrierte Ergebnis der offenen Aufträge mit einer Änderung des aktuellen Preises geändert hat (der Unterschied macht 8,00). Wenn wir ähnliche Manipulationen in einem anderen Handelszentrum machen, ist es leicht zu sehen, dass die obige Reihenfolge der Bildung des Wertes der freien Marge nicht beibehalten wird. Für einige Handelszentren gilt die folgende Regel: Die Eröffnung von Marktaufträgen gibt das Eigenkapital nicht frei oder erhöht die freie Marge. Die Eröffnung von Marktaufträgen erhöht das Eigenkapital um den Betrag, der die integrierten Kosten für unterschiedlich orientierte Marktaufträge für ein Symbol übersteigt (die Regel gilt nicht in allen Handelszentren). Wenn Sie zum Beispiel eine Bestellung von 4 Lots für USD / JPY im Handelszentrum 2 eröffnet haben, werden sich die Beträge von Eigenkapital und freiem Gewinn beim Öffnen eines 4-Los-Verkaufsauftrags nicht ändern. Feige. 88. Das Vorhandensein unterschiedlich gerichteter Aufträge gibt kein Eigenkapital frei. Sie können Berechnungen durchführen, um zu erfahren, ob das aktuelle Eigenkapital ausreicht, um einen Auftrag zu öffnen. Sie können auch die Funktion AccountFreeMarginCheck () verwenden, die den Wert der freien Margin zurückgibt, um nach dem Öffnen einer Marktorder mit einer bestimmten Menge von Lots für ein bestimmtes Symbol zu bleiben. Wenn der zurückgegebene Wert gleich oder größer als 0 ist, gibt es genug Geld für das Konto. Wenn es kleiner als 0 ist, dann kann die Reihenfolge dieses Volumens und für dieses Symbol nicht geöffnet werden, das Client-Terminal wird den Fehler 134 zurückgeben. Um die Bedingungen zu kennen, die vom Handelszentrum angeboten werden, und die Menge des freien Randes, die zum Öffnen von benötigt wird Ein Auftrag mit dem Volumen von 1 Los, können Sie ein einfaches Skript verwenden, Bedingungen. mq4: Hier erlaubt der Ausdruck von uns, den Unterschied zwischen der verfügbaren freien Marge und der freien Marge, die nach dem Öffnen der Bestellung bleiben wird, zu berechnen. If we start this script for execution, when there are no market orders in the terminal, we can obtain the currently required amount of equity to be available and enough for opening of an order with the volume of 1 lot for buying and for selling: If we launch the script conditions. mq4 for execution in the window of the symbol, for which there are opened market orders, we can obtain other values, it depends on the calculation methods accepted in one or another dealing center. Other Errors and Function MarketInfo() There are other limitations related to determining of values of parameters of function OrderSend(). This are the maximum and the minimum order price step, the maximum and the minimum order price value, etc. The use of function MarketInfo() allows you to get various information about symbols that are shown in the window ampquotMarket Watchampquot of the client terminal. Function MarketInfo() The function returns various information about symbols listed in the window ampquotMarket Watchampquot of the client terminal. Parts of information about the current symbol are stored in predefined variables. symbol - the name of a symbol type - request identifier that determines the type of information to be returned. It can be either value of those of request identifiers (see Function MarketInfo Identifier ). Some errors may occur for the reasons on the server side. For example, in the conditions of transient prices, your broker may increase the minimum distance that limits placement of pending orders and stop orders. Further, at a calm market, the broker can decrease this distance again. Thus, the values of some parameters can be changed at any time. For the program to operate in a stable manner, with the minimal amount of rejected requests, you should update the parameters of information environment used by the program using the functions MarketInfo() and RefreshRates() before you execute the function OrderSend(). An example of a simple script that opens a Buy order costing 35 of the free margin, with some preset values of stop orders (openbuy. mq4 ). The script consists of one special function start() (blocks 1-10). In block 1-2, the values are set, at which the order must be opened. Block 2-9 represents cycle operator while(), in which all necessary calculations are performed. This cycle is included into the code to allow the program make several attempts to open the order. In block 2-3, the environment variables are updated. In blocks 3-4-5-6, the amount of lots and the requested prices of stop orders are calculated. In block 7-8-9, errors are processed. In block 9-10, the message is printed that the script has completed its operations. Lets consider some special features of a program code. Its easy to see that the trade request is formed in block 6-7. In block 3-4, the amount of lots is calculated. It also considers the situation when the available free margin is insufficient to open even an order with the minimum amount of lots. This is why, in block 3-4, after printing the message about insufficient money, we exit cycle 2-9 using the operator break. The control is passed to block 9-10, and script completes its operations. The message in block 9 is unnecessary. It is given here just to help users of the code to find tails or heads in the script - when is the end of the programs operations and when is the pause caused by delays in the network or on the server. If the free margin is sufficient for opening of the order, the control will be passed to block 4-5 and then to block 5-6. In those blocks, there is no cycle exit. This means that, for any minimum distance set by the broker, there will be corresponding stop levels found. In block 1-2, 3 points were chosen for TP by design. The majority of brokers set the minimum distance as 5 points. In block 5-6, the program will discover that the preset value is less than the allowed one. The program will set such a value of the stop-order price that does not contradict the limitation. then the control is passed to block 6-7 to open an order. In the first line of this block, the message is printed. The trade request is formed only in the second line. A question arises: Why do we declare about forming a request before it is really formed We could give the instruction first and then inform the user about it. The answer to this question is closely related to the technology of sending the request to the client terminal and then to the server (see Fig. 66). In our case, the trade request is formed in the function OrderSend() specified in the right part of the assignment operator. The trade request as such is created and sent to the server in the function, whereas the assignment operation will be executed in the assignment operator after the server has returned a reply about the ampquotfateampquot of the request. Thus, the only possibility to inform the user about the start of events related to the request is to show the message before the assignment operator, in the right part of which the trade function is specified. Sooner or later, the client terminal will pass the control back to the program, the assignment operator in block 6-7 will be executed, which will result in that the ticket variable will take a value, and the control will be passed further - to error-analyzing block 7-8-9. If the order is opened on the server, the number (ticket) of the opened order will be assigned to the variable ticket. In this case, it means that the script has fulfilled its task and there is no need for the program to continue operations. In block 7-8, we use the operator break to exit cycle while(). The control is passed to block 9-10 (outside the cycle), and the program completes its operations. However, if the attempt to open an order fails, the control will be passed to block 8-9 for error analyzing. Two types of errors are considered here: those that still allow to hope for successful opening of the order and those, the occurrence of which means unambiguous termination of the program execution. The variable Error is assigned with the code of the last error, in this case, of the error that has been returned by the server or by the client terminal at execution of function OrderSend(). In the first operator switch of block 8-9, overcomable errors are considered. Each error in this group is processed differently. For example, if the price has changed (error 135), it is sufficient just to update the environment parameters using RefreshRates() and repeat the attempt to open an order. If the error ampquotNo pricesampquot (error 136) occurs, there is no sense to re-send the request to the trade server. In this case, we should wait for a new tick to income (there are no prices on the server at this time, either) and, only after that, retry to open an order. This is why there is a waiting cycle in the block that processes error 136. This waiting cycle will be interrupted as soon as a new tick incomes. We exit the operator switch() using operator continue that breaks the current iteration of the cycle while() and starts a new one. Critical errors are processed in another way. If such an error occurs, the program will just inform the user about it and terminate operations. For this purpose, we use the operator break (the last one in block 8-9) that breaks the cycle while(), which results in termination of the program. We should note particularly that, in this example, we dont consider all errors without exceptions, by design. In this case, we are not aiming at providing the user with a ready-made program. It is very important that the programmer him or herself analyzes other errors and decides independently what else errors and in what way should be processed in the program. At the same time, some errors must not be processed, because the program is built in such a way that it does not imply occurrence of some errors, for example, in this case, of errors 129 and 130.. In the above example, there is a small algorithmic error that cannot be found at neither compilation nor in the client terminal, nor on the server. Take any program codes with a grain of salt, in contempt of any authorities. Note the code in block 4-5: As a result of calculations in the body of the operator if(), the variable DistSL can take a new value. Suppose a normal minimum distance makes 5 points. Suppose that at the first execution (in quick market), this value is set as 20 points on the server. The variable MinDist will take the value of 20. Also suppose that the formed trade request has been rejected due to error 136. The program will track the new tick in block 8-9. Within this period of time, the value of the minimum distance can be changed on the server, for example, decreased to 10 points. At the moment when the new tick incomes, the control will be passed to the new cycle, and the new value of the variable MinDist, equal to 10, will be calculated. However, the value of the variable DistSL remains unchanged and equal to 20 (block 4-5 is coded in such a way that the value of DistSL can only increase). In order to exclude this algorithmic error, you should write block 4-5 in such a manner that only the value that depends on the situation would change (in this case, it is the value of SL), whereas the value of DistSL wouldnt change, for example, like this: A similar change must be made in block 5-6 for the other stop order. Placing Pending Orders There is no crucial difference in programming between placing of pending orders and placing of market ones. You should only note the fact that the assets necessary to modify the pending order into a market one are checked for their sufficiency neither by the client terminal or by the server. They are not limited either. You can place a pending order for the amount that many times exceeds the amount of money available on your account. Such an order can be kept for indefinite periods of time. When the market price reaches the level of the open price requested for the pending order, there will be a check made on the server. If there are enough money on the account for opening this order, it will be modified into a market one (opened). If not, it will be deleted. Function WindowPriceOnDropped() In MQL4, we have a very important feature - we can determine programmatically in the symbol window the coordinates of the location, at which an Expert Advisor or a script has been placed, if they have been attached using a mouse. For example, we can obtain the ordinate value of attachment of the script using the function WindowPriceOnDropped(). The function returns the value of the price in the point of the chart, in which the EA or the script has been dropped. The value will be true only, if the EA or the script has been moved using a mouse (drag and drop). This value is not defined for custom indicators. An example of a simple script that opens a BuyStop order costing 35 of the free margin, with some preset values of stop orders (openbuystop. mq4 ). The structure of the script openbuystop. mq4 is built in the same way as that of the script openbuy. mq4. so there is no need to describe it in details. We will only turn our attention to basic differences between these programs. The price, at the level of which the script has been attached to the symbol window, is determined in the line: Subsequently, the value of this variable is kept unchanged during the entire period of operation of the program. This is necessary, if the script fails opening an order more than. At the same time, the script will every time calculate the requested value of the price close to the location (to the price level) where user attached the script. It is easy to see that, in the script openbuystop. mq4. there is no check for sufficiency of free margin for opening of an order, but there is a check of the order open price (block 3-4). If the calculated value of the variable Price does not comply with the requirements of placing of a pending Stop order (see Order Characteristics and Rules for Making Trades. Requirements and Limitations in Making Trades ), this value will be recalculated. In the block of error processing, there are some small changes, as well: some errors are not considered, but the codes of some other errors are processed. Reasonable Limitations As related to the use of trade functions, we should pay attention to some more general limitations. For example, error 146 occurs only, if several programs that form trade requests work in one symbol window. In our opinion, this practice is allowable, but not reasonable. It would be much more efficient to create and use one trading program that would consider all special features of trading. If we use only one trading program, it is just impossible to form several trade request simultaneously. Moreover, the entire algorithm could be organized much better in such a program: consider the probability of successful trades and re-allocate money correctly, according to this probability. For performing of trades, it is more efficient to use a full-scaled Expert Advisor, whereas a script would be better used for one-time calculations or for displaying some useful information on the screen. At the same time, if the trader does not use an Expert Advisor for automated trading, the use of scripts turns out to be more efficient than working with orders using the control panel of the client terminal.


No comments:

Post a Comment