Moving Average Mql4 Beispiel
Ich bin neu bei der Schaffung eines kompetenten Berater, und ich brauche Hilfe mit meinem Doppel-Crossover einfachen gleitenden durchschnittlichen Experten Berater. Mein Code ist sehr einfach. Es sellsbuys, wenn die kleineren gleitenden Durchschnitt bewegt sich über dem größeren gleitenden Durchschnitt. Was ich tun möchte, ist dies. Ein Auftrag wird platziert, wenn der kleinere gleitende Durchschnitt über dem größeren gleitenden Durchschnitt kreuzt, also kauft der EA. Wenn der kleinere gleitende Durchschnitt dann den größeren gleitenden Durchschnitt überschreitet, möchte ich diesen Auftrag verkaufen. Das ist alles gut Und gleichzeitig möchte ich eine neue Bestellung nach buysell abhängig von der letzten Bestellung. Ich möchte nicht auf den nächsten Crossover warten. Also, wenn ein Auftrag geschlossen ist, muss ein anderer gestellt werden. Get it Bitte kann jemand helfen, meine vorhandenen Code ändern sehen, dass ich ein Neuling bin, kann jemand bitte kommentieren den Code, der geschrieben wurde Ich habe meine aktuelle Datei beigefügt. Grüße, Brendan (Südafrika) Ich bin neu bei der Schaffung eines kompetenten Berater, und ich brauche Hilfe mit meinem Doppel-Crossover einfachen gleitenden durchschnittlichen Experten Berater. Mein Code ist sehr einfach. Es sellsbuys, wenn die kleineren gleitenden Durchschnitt bewegt sich über dem größeren gleitenden Durchschnitt. Was ich tun möchte, ist dies. Ein Auftrag wird platziert, wenn der kleinere gleitende Durchschnitt über dem größeren gleitenden Durchschnitt kreuzt, also kauft der EA. Wenn der kleinere gleitende Durchschnitt dann den größeren gleitenden Durchschnitt überschreitet, möchte ich diesen Auftrag verkaufen. Das ist alles gut Und gleichzeitig möchte ich eine neue Bestellung nach buysell abhängig von der letzten Bestellung. Ich möchte nicht auf den nächsten Crossover warten. Also, wenn ein Auftrag geschlossen ist, muss ein anderer gestellt werden. Get it Bitte kann jemand helfen, meine vorhandenen Code ändern sehen, dass ich ein Neuling bin, kann jemand bitte kommentieren den Code, der geschrieben wurde Ich habe meine aktuelle Datei beigefügt. Regards, Brendan (Südafrika) Ihre Dateien sind nicht beigefügt. Können Sie versuchen, Anfügen der mq4-Datei Nur eine Seite Kommentar, dass die Kreuze der MAs nicht die beste Zeit zu buysell sind. Wenn die Kreuze passieren, ist die Richtungsänderung bereits im Gange, so dass das buysell ein wenig spät ist. Der MACD, der die Lückenunterschiede zwischen 2 MAs verfolgt, ist ein besserer Indikator für die Richtungsänderung. Das Histogramm verfolgt die Richtung, die Signalleitung zeigt an, ob die Richtung nach oben oder unten ist. Das ist die Theorie sowieso. So denken Sie, dass ich die 2 MA-Überkreuzung kratzen und ein neues Expertensystem mit einem MACD schreiben muss Haben Sie möglicherweise ein Arbeitsbeispiel von diesem mit Ihnen bitte erhalten Hier ist mein 2 SMA crossover: int Gekreuzte (doppelte line1, doppelte line2) statische int lastdirection 0 statisch int currentdirction 0 wenn (line1 gt line2) currentdirction 1 up if (line1 lt line2) currentdirction 2 down int cnt, Ticket, gesamtes double shortSma, longSma if (Stäbe lt 100) Drucken (quartärbar kleiner als 100quot) (NULL, 0, 50, 0, MODESMA, PRICECLOSE) zurückgeben (0, 0, 5, 0, MODESMA, PRICECLOSE, 0) , 0) int isCrossed Gekreuzt (shortSma, longSma) if (gesamt lt 1) wenn (isCrossed 1) Ticket OrderSend (Symbol (), OPBUY, Lots, Ask, 3, 0, (doppelter SMA Crossover H1quot, 12345, 0, Blau) if (Ticket gt 0) if (OrderSelect (Ticket, SELECTBYTICKET, MODETRADES)) Drucken (quotBUY-Bestellung geöffnet, OrderOpenPrice ()) (Bid - TakeProfit Point), quotDouble SMA Crossover H1quot, 12345, 0, Red), wenn Sie die Option "GetShield" If (Ticket gt 0) if (OrderSelect (Ticket, SELECTBYTICKET, MODETRADES)) Drucken (quotiert Bestellung eröffnet, OrderOpenPrice ()) sonst Print (quotError Eröffnungsreihenfolge, GetLastError ()) return (0) return (0 ), Wenn (OrderType () OPBUY) Longposition geöffnet wird, falls (OrderType () OPBUY), wenn (OrderType () SELECTBYPOS, MODETRADES) 2) OrderClose (OrderTicket (), OrderLots (), Bid, 3, Violett) Schließen Position Rückkehr (0) Ausgangskontrolle für Nachlauf Stop (TrailingStop gt 0) if ((Bid - OrderOpenPrice ()) gt (Punkt TrailingStop) (), OrderOpenPrice (), (Bid - Point TrailingStop), OrderTakeProfit (), 0, Green) Rückgabewert (0) sonst geht es in die Short - Position Geschlossen werden, wenn (isCrossed 1) OrderClose (OrderTicket (), OrderLots (), Ask, 3, Violet) close position return (0) exit check für trailing stop if (TrailingStop gt 0) if ((OrderOpenPrice () - Ask) gt (OrderStopLoss () 0)) OrderModify (OrderTicket (), OrderOpenPrice (), (Ask Point TrailingStop), OrderTakeProfit (), 0, Red) zurückgegeben werden (0) Du denkst also, ich muss den 2 MA Crossover zerkratzen und ein neues Expertensystem mit einem MACD schreiben. Hast du vielleicht ein funktionierendes Beispiel dafür mitgemacht? Hier ist mein 2 SMA Crossover: int Crossed (double line1, double line2) Static int lastdirection 0 statisch int currentdirction 0 wenn (line1 gt line2) currentdirction 1 up if (line1 lt line2) currentdirction 2 unten int cnt, Ticket, Gesamtsumme double ShortSma, longSma if (Stäbe lt 100) Drucken (quotbars kleiner als 100quot) Rückkehr (0) if (TakeProfit lt 10) Ausdruck (quotTakeProfit kleiner als 10quot) Rückgabe (0) check TakeProfit shortSma iMA (NULL, 0, 5, 0, MODESMA, PRICECLOSE, 0) longSma iMA (NULL, 0, 50, MODESMA, PRICECLOSE, 0) int isCrossed gekreuzt (shortSma, longSma) if (gesamt lt 1) wenn (isCrossed 1) Ticket OrderSend (Symbol (), OPBUY, Lots, Ask, 3, 0, Crossover H1quot, 12345, 0, Blau) if (Ticket gt 0) if (OrderSelect (Ticket, SELECTBYTICKET, MODETRADES)) Drucken (quotBUY-Bestellung geöffnet. (0) if (isCrossed 2) Ticket OrderSend (Symbol (), OPSELL, Lots, Gebot, 3, 0, (Gebot - TakeProfit (Ticket gt 0) if (OrderSelect (Ticket, SELECTBYTICKET, MODETRADES)) Print ("Order of Order", OrderOpenPrice ()), sonst Print ("Eröffnungsauftrag SELL" (Cnt, SELECTBYPOS, MODETRADES), wenn (OrderType () lt OPSELL ampamp OrderSymbol () Symbol ()) if (OrderType () OPBUY) Lange Position wird geöffnet, falls sie geschlossen wird, wenn (isCrossed 2) OrderClose (OrderTicket (), OrderLots (), Bid, 3, Violet) close position return (0) exit check for trailing stop if (TrailingStop gt 0) (Bid - OrderOpenPrice ()) gt (Punkt TrailingStop)), wenn (OrderStopLoss () lt (Bid - Punkt TrailingStop) OrderModify (OrderTicket (), OrderOpenPrice (), (Bid - Punkt TrailingStop), OrderTakeProfit (), 0 (), OrderLegs (), Ask, 3, Violett) close position return (0) Exit-Check für nachfolgenden Stop wenn (isCrossed 1) OrderClose (OrderTicket () (OrderStopLoss ()) (OrderStopLoss () 0)) OrderModify (OrderTicket (), OrderOpenPrice (), Ask Point TrailingStop), OrderTakeProfit (), 0, Red) return (0) Verwendung von technischen Indikatoren Nach der Zugehörigkeit zum Online-Handelssystem MetaTrader 4 gibt es zwei Arten von Indikatoren in MQL4 - technische und benutzerdefinierte. Technische Indikator ist ein integraler Bestandteil des Online-Handelssystem MetaTrader, integrierte Funktion, die Zeichnung auf dem Bildschirm eine bestimmte Abhängigkeit ermöglicht. Eigenschaften der technischen Indikatoren Zeichnung im Sicherheitsfenster Jeder technische Indikator berechnet eine bestimmte vordefinierte Abhängigkeit. Um diese Abhängigkeit grafisch auf dem Bildschirm zu zeichnen, sollte ein technischer Indikator einem Diagramm zugeordnet werden. Dies kann über das Systemmenü Insert gtgt Indicators oder über das Navigatorfenster eines Client-Terminals erfolgen. Für das Anhängen eines technischen Indikators an ein Diagramm aus dem Navigator-Fenster wird eine sehr einfache Methode verwendet - drag-amp-drop des technischen Indikatornamens aus dem Navigator-Fenster in ein Diagrammfenster. Als Ergebnis werden eine oder mehrere Zeilen, die in diesem Indikator berechnet werden, im Diagrammfenster erscheinen. Indikatorlinien eines technischen Indikators können sowohl im Hauptdiagrammfenster als auch in einem separaten Fenster im unteren Teil eines Sicherheitsfensters gezeichnet werden. In Fig. 104 Technischer Indikator Alligator wird in einem Diagrammfenster gezeichnet. Code Unchangeability Alle technischen Indikatoren sind eingebaut, ihr Code ist nicht verfügbar für Änderungen. So ist ein Anwender vor einer fehlerhaften Änderung von integrierten technischen Indikatoren gesichert. Der Quellcode, auf dem ein technischer Indikator berechnet wird, steht auf der Softwareentwickler-Website (MetaQuotes Software Corp.) im Abschnitt Technische Indikatoren zur Verfügung. Bei Bedarf kann ein Programmierer den vollständigen Code oder einen Teil davon verwenden, um benutzerdefinierte Indikatoren zu erstellen (siehe Erstellen von benutzerdefinierten Indikatoren). Aufruf von Funktionen der technischen Indikatoren Die graphische Darstellung, die für einen Benutzer sichtbar ist, wird von einem Client-Terminal angezeigt. Aus Gründen der Bequemlichkeit werden wir solche Zeichnungsindikatorlinien aufrufen. Indikatorlinie ist eine grafische Darstellung einer bestimmten Abhängigkeit, die auf numerischen Werten basiert, die in einem Indikatorarray enthalten sind. Der Zeilentyp wird von einem Benutzer eingerichtet. Die Indikatorlinie kann in Form einer durchgezogenen oder gestrichelten Linie, einer bestimmten Farbe, sowie in Form einer Kette von bestimmten Zeichen (Punkte, Quadrate, Ringe usw.) dargestellt werden. Bei Indikatorberechnungen werden Sätze von numerischen Werten in diesen Indikatorlinien entsprechend diesen Berechnungen berechnet. Diese Wertsätze werden in Indikatorfeldern gespeichert. Indicator Array ist ein eindimensionales Array, das numerische Werte enthält, gemäß denen Indikatorlinien erstellt werden. Numerische Werte von Indikatorarrayelementen sind Punktkoordinaten, auf denen eine Indikatorlinie gezeichnet wird. Die Y-Koordinate jedes Punktes ist der Wert eines Indikator-Array-Elements, X-Koordinate ist der Indexwert des Indikator-Array-Elements. Die Datenspeicherungstechnik in Indikatorarrays ist die Basis für den Aufbau von technischen und individuellen Indikatoren. Die Werte der Indikatorarrayelemente der technischen Indikatoren sind von allen Anwendungsprogrammen, einschließlich Expertenberatern, Skripts und benutzerdefinierten Indikatoren, verfügbar. Um einen Wert eines Indikatorarray-Elements mit einem bestimmten Index in einem Anwendungsprogramm zu erhalten, ist es notwendig, eine integrierte Funktion aufzurufen, deren Name in Übereinstimmung mit einem technischen Indikatornamen gesetzt wird. Für die Ausführung einer technischen Indikatorfunktion sollte das entsprechende Kennzeichen nicht unbedingt an ein Sicherheitsfenster angehängt werden. Auch der technische Indikatorfunktionsaufruf aus einem Applikationsprogramm führt nicht zum Anhängen eines entsprechenden Indikators an ein Sicherheitsfenster. Das Anhängen eines technischen Indikators an ein Sicherheitsfenster führt auch nicht zu einem technischen Indikationsaufruf in einem Anwendungsprogramm. Eine Reihe von technischen Indikatoren ist in der Client-Terminal des Online-Handelssystem MetaTrader 4 enthalten. Wir können einige von ihnen zu analysieren. Gleitender Durchschnitt, MA Technischer Indikator Gleitender Durchschnitt, MA zeigt den Mittelwert des Instrumentenpreises für einen bestimmten Zeitraum an. Der Indikator spiegelt die allgemeine Marktentwicklung - kann einige Schwankungen in der Nähe von einigen Preis zu erhöhen, zu senken oder zeigen. Um Werte der MA-Indikatorzeile zu einem bestimmten Zeitpunkt zu erhalten, verwenden Sie die Standardfunktion: Symbol - Symbolname eines Wertpapiers, auf dessen Daten der Indikator berechnet wird. NULL bedeutet das aktuelle Symbol. Zeitrahmen. Kann eine von Diagrammperioden sein. 0 bedeutet die Periode des aktuellen Diagramms. Zeitraum - Zeitraum der Mittelung für MA Berechnungen. Mashift - Indikatorverschiebung relativ zu einem Kursdiagramm. Mamethod - Methode der Mittelung. Kann einer der MA Methodenwerte sein. Angewandter Preis - gebrauchter Preis. Kann jede der Preiskonstanten sein. Der von einem Indikatorarray (Umschalten relativ zu einem aktuellen Balken um eine vorgegebene Anzahl von Balken) erfaßt wird. Nachfolgend sehen Sie ein Beispiel für den Aufruf einer technischen Indikatorfunktion von Expert Advisor callindicator. mq4: In der EA callindicator. mq4 wird die Funktion iMA () verwendet (Funktion des technischen Indikators Moving Average). Dieser Programmteil kann im Detail analysiert werden: NULL bezeichnet die Berechnung eines gleitenden Durchschnitts für ein Sicherheitsfenster, an das das EA angehängt ist (in diesem Fall ist es EA, im allgemeinen kann es jedes Anwendungsprogramm sein) 0 - es ist Berechnet für den im Sicherheitsfenster eingestellten Zeitrahmen, an dem das EA angeschlossen ist PeriodMA - Mittelungsperiodenwert wird in einer externen Variablen gesetzt, wenn nach der EA-Zuordnung zu einem Sicherheitsfenster ein Benutzer diesen Wert nicht in den Einstellungen der externen EA-Variablen verändert , Ist der Wert gleich 5 0 - Indikatorarray ist nicht relativ zu einem Diagramm verschoben, dh Werte von Indikatorarrayelementen enthalten MA-Werte, die für Balken berechnet werden, auf denen die Indikatorzeile gezeichnet wird MODESMA - Methode eines einfachen gleitenden Mittelwertes Berechnungen PRICECLOSE - Barschlusspreis wird für Berechnungen verwendet 0 - Indikatorarray-Elementindex, für den der Wert erfasst wird - in diesem Fall ist er Null-Element. Unter Berücksichtigung, dass das Indikatorarray nicht relativ zum Diagramm verschoben ist, wird der MA-Wert für den Null-Balken erhalten. Die Funktion iMA () gibt einen Wert zurück, der der Variablen MA zugeordnet ist. In weiteren Programmlinien wird dieser Wert mit dem aktuellen Bid-Preis verglichen. Wenn der aktuelle Preis höher oder niedriger als der erhaltene MA-Wert ist, wird eine Warnung angezeigt. Die Verwendung der Variablen FactUp und FactDn erlaubt es, die Warnung erst nach dem ersten Übergang der MA-Linie zu zeigen (Beachten Sie, dass die blaue Anzeigerzeile in einem Sicherheitsfenster nicht gezeichnet wird, weil die technische Indikatorfunktion aus dem Programm aufgerufen wurde, sondern weil ein Benutzer angeschlossen ist Der Indikator für das Diagramm, Abb. 104). Hierbei ist anzumerken, dass beim Erscheinen der neuen Balken-Indizes der Historienbalken die Zunahme der aktuell gebildeten Balken immer den 0-Index aufweist. Im Expertenadvisor callindicator. mq4 gibt die technische Indikatorfunktion iMA () den für den Nullbalken berechneten Wert zurück. Obwohl der Indexwert während der EA-Ausführung nie geändert wird (d. h. Berechnungen werden immer für auf dem aktuellen Balken durchgeführt), entspricht der von iMA () zurückgegebene Wert immer dem zuletzt berechneten, d. H. Für den aktuellen Nullpunkt berechneten Wert. Wenn bei einigen Berechnungen im Programm der Wert eines technischen Indikatorwerts nicht für den aktuellen Bar, bur für einen historischen Wert ermittelt werden soll, so sollte im Funktionsaufruf der notwendige Indikator-Array-Index angegeben werden. Hier sehen Sie ein Beispiel für EA historybars. mq4. In dem MA auf dem vierten Balken berechnet wird: In den EA-Historybars. mq4 werden MA-Werte für den aktuellen Balken (Index 0) und für den vierten Balken (Index 4) berechnet. Die angezeigten Indizes 0 und 4 ändern sich während dieses Programmiervorgangs nicht, und das Programm kann unendlich lang jedes Mal die MA-Werte für den Null - und den vierten Balken berechnen. Denken Sie daran, obwohl Berechnungen für MA auf Stäben mit denselben Indizes durchgeführt werden, wird MA geändert, d. H. Entspricht aktuellen MA-Werten auf dem aktuellen Null-Balken und dem aktuellen vierten Balken. In Fig. 106 ist es klar, dass, wenn die Preise auf den las Bars wachsen, geht MA auf. Die Differenz zwischen den MA-Werten auf der Null - und der vierten Spur wächst ebenfalls, was sich in den angezeigten Warnungen widerspiegelt. Technische Indikatoren können nicht nur eine, sondern auch zwei oder mehr Indikatorlinien darstellen. Technische Indikator Stochastischer Oszillator vergleicht den aktuellen Schlusskurs mit der Preisspanne für einen ausgewählten Zeitraum. Der Indikator wird in der Regel durch zwei Indikatorlinien dargestellt. Die Hauptlinie wird K genannt. Die zweite D-Signalleitung ist der gleitende Durchschnitt von K. Üblicherweise wird K als durchgezogene Linie gezeichnet, D-gestrichelt. Nach einer der Erläuterungsvarianten der Indikatoren sollten wir kaufen, falls K größer als D ist und verkauft, falls K niedriger als D ist. Der günstigste Zeitpunkt für die Ausführung einer Handelsoperation wird als der Zeitpunkt der Übereinstimmung der Linien angesehen. Symbolsymbolname eines Wertpapiers, auf dessen Daten der Indikator berechnet wird. NULL bedeutet das aktuelle Symbol. Zeitrahmen. Kann eine von Diagrammperioden sein. 0 bedeutet die Periode des aktuellen Diagramms. Kperiod - Periode (Anzahl der Balken) zur Berechnung von K. Dperiod - Periode der Mittelung von D. Verlangsamung - Wert der Verlangsamung. Methode - Mittelwertbildung. Kann einer der MA Methodenwerte sein. Pricefield - Parameter der Auswahl der Preise für Berechnungen. Kann einer der folgenden Werte sein: 0 - LowHigh oder 1 - CloseClose. Modus - Index der Anzeigelinien. Einer der folgenden Werte kann sein: MODEMAIN oder MODESIGNAL. Verschiebungsindex des erhaltenen Wertes aus einem Indikatorpuffer (Umschalten relativ zu einem aktuellen Balken um eine vorgegebene Anzahl von Balken). Die Verwendung des stochastischen Oszillators bietet die Notwendigkeit, die relativen Linienpositionen zu analysieren. Für die Berechnung, welche Trade-Entscheidung durchgeführt werden soll, muss der Wert jeder Zeile des aktuellen und vorherigen Balken berücksichtigt werden (siehe Abb. 107). Wenn sich die Zeilen im Punkt A kreuzen (grüne Linie kreuzt die rote nach oben), sollte die Verkaufsreihenfolge geschlossen sein und die Bestellung bestellt werden. Während des Teils A - B (keine Linienkreuzung, grüne Linie ist höher als die rote Linie) Kaufauftrag sollte offen gehalten werden. In Punkt B (grüne Linie kreuzt die rote nach unten) Kauf sollte geschlossen werden und Verkauf sollte geöffnet werden. Dann sollte der Verkauf bis zur nächsten Kreuzung offen bleiben (keine Kreuzung, grüne Linie unter der roten Linie). Feige. 107. Übereinstimmung der Haupt - und der Signalleitungen des Stochastischen Oszillators. Das nächste Beispiel enthält die Implementierung eines einfachen Algorithmus, der veranschaulicht, wie notwendige Werte jeder Zeile erhalten werden können und Handelskriterien gebildet werden können. Dazu werden im EA callstohastic. mq4 Werte der technischen Indikatorfunktionen iStochastic () verwendet: Um einen K-Zeilenwert (solid green) auf der Nullleiste zu erhalten, wird folgende Rechenzeile verwendet: Hier zeigt der Parameter MODEMAIN die Zeile, den Wert an Von denen gefragt wird, ist der letzte Parameter 0 der Balkenindex, für den der Zeilenwert berechnet werden soll. In den drei folgenden Programmzeilen werden analog zu anderen Variablen - für D-Zeile (rote gestrichelte Linie, Parameter MODESIGNAL) für die Null - und die erste Leiste berechnet. Im nächsten Block wird die Korrelation der erhaltenen Werte analysiert und der EA berichtet über den aktuellen Zustand bei jedem Tick. Zum Beispiel in Linien: die Tatsache, dass eine rote Linie von der grünen nach oben gekreuzt wird, wird erkannt. Wenn auf der vorherigen Leiste die grüne Zeile unter der roten (dh der Ausdruck M1 lt S1 ist wahr) und auf der aktuellen Leiste die grüne Linie über dem roten ansteigt oder ihre Werte gleich sind (dh der Ausdruck M0 gt S0 ist True), bedeutet das, dass von der vorherigen Balkenbildung bis zum aktuellen Moment die grüne Lone die rote nach oben gekreuzt hat. Somit wird die Bedingung berechnet, wenn der Operator wahr ist, weshalb die Kontrolle an den Operator-Körper übergeben wird, wodurch Alert () ausgeführt wird, um die entsprechende Meldung anzuzeigen. In einem Expert Advisor, der für den Handel bestimmt ist, sollte eine Handelsfunktion zur Eröffnung eines Kaufauftrags angegeben werden. In diesem Fall führt die analysierte Variante der Zeilenkreuzung zur Bildung eines Handelsauftrags und schließlich zur Ausführung einer Handelsoperation. Für die Variante, wenn die grüne Linie kreuzt die rote nach unten, in wenn Körper eine Handelsfunktion zum Öffnen einer Verkauf Reihenfolge sollte angegeben werden. Feige. 108 zeigt das Ergebnis der callstohastic. mq4-Operation. Mit Funktionen der technischen Indikatoren zu schaffen, Handel Expert Advisors und Skripte ist sehr bequem. Die Anzahl der technischen Indikatorfunktionen eines Expertenberaters ist unbegrenzt. Ein Trading-Strategie-Entwickler kann entscheiden, verschiedene Trading-Kriterien auf der Kombination der technischen Indikatorwerte zu definieren. Beispiel eines einfachen Trading Expert Advisor, dessen Trading-Kriterien auf technischen Indikatoren basieren, wird im Abschnitt Simple Expert Advisor analysiert. Simple Expert Advisor Problem 29. Erstellen Sie einen Trading Expert Advisor. Vorläufige Argumente Bevor Sie mit dem Programmieren eines Trade Expert Advisor beginnen, müssen Sie allgemeine Grundsätze für ein zukünftiges Programm definieren. Es gibt keine strengen Programmerstellungsregeln. Allerdings, sobald ein Programm erstellt, ein Programmierer in der Regel weiter zu verbessern. Um das Programm in Zukunft gut verstehen zu können, muss es nach einem gut durchdachten und leicht verständlichen Schema erstellt werden (es ist besonders wichtig, dass ein Programm von einem anderen Programmierer weiter verbessert wird). Das bequemste Programm ist das, das aus Funktionsblöcken besteht, von denen jedes für seinen Teil der Berechnungen verantwortlich ist. Um einen Algorithmus eines Trading Expert Advisor zu erstellen, können Sie analysieren, was ein Betriebsprogramm tun soll. Eines der wichtigsten Daten bei der Bildung von Handelsaufträgen ist die Information über Aufträge, die bereits in einem Client-Terminal vorhanden sind. Einige der Handelsstrategien erlauben nur eine unidirektionale Ordnung. Im Allgemeinen, wenn eine Handelsstrategie erlaubt, können mehrere Aufträge in einem Terminal zur gleichen Zeit geöffnet sein, obwohl ihre Anzahl angemessen begrenzt sein sollte. Bei jeder Strategie sollten Handelsentscheidungen unter Berücksichtigung der aktuellen Situation getroffen werden. Bevor eine Handelsentscheidung in einem Programm getroffen wird, ist es notwendig zu wissen, welche Handelsaufträge bereits eröffnet oder platziert wurden. Zunächst muss ein Programm eine Auftragsblockbuchhaltung enthalten, die zu den ersten auszuführen ist. Während einer EA-Durchführung sollten Handelsentscheidungen getroffen werden, deren Durchführung zur Ausführung von Handelsoperationen führt. Code-Teil verantwortlich für Trade Orders Bildung ist besser in einem separaten Block geschrieben. Ein Expert Advisor kann eine Handelsanfrage erstellen, um eine neue ausstehende oder Marktorder zu eröffnen, bestehende Aufträge zu schließen oder zu modifizieren oder gar keine Aktionen auszuführen. Ein EA muss auch die Auftragspreise je nach Wunsch des Benutzers berechnen. Handelsentscheidungen sollten in einem Programm auf der Grundlage der Handelskriterien getroffen werden. Der Erfolg des gesamten Programms hängt von der Korrektheit der Erkennung von Handelskriterien im Programm ab. Bei der Berechnung von Handelskriterien kann ein Programm alle Informationen berücksichtigen (und muss), die nützlich sein können. Beispielsweise kann ein Expert Advisor die Kombination von technischen Indikatorwerten, die Zeit wichtiger Pressemitteilungen, die aktuelle Zeit, Werte einiger Preisniveaus usw. analysieren. Aus Gründen der Einfachheit sollte der für die Berechnung der Handelskriterien verantwortliche Programmteil separat geschrieben werden Block. Ein Trade Expert Advisor muss unbedingt Fehlerverarbeitungsblock enthalten. Die Analyse von Fehlern, die bei der Ausführung von Handelsoperationen auftreten können, ermöglicht es einerseits, eine Handelsanforderung zu wiederholen und andererseits einen Benutzer über eine mögliche Konfliktsituation zu informieren. Struktur eines einfachen Expertenberaters Hier ist ein Strukturschema eines einfachen Expertenberaters, der auf der Basis von mehreren Funktionsblöcken aufgebaut ist, in jedem Block ein bestimmter Teil der Berechnungen. Auf der folgenden EA-Entwicklungsstufe gibt es noch keinen Programmcode. Gleichzeitig wird der Algorithmus eines Programms weitgehend gebildet. Wie die auf den Grundlagen des angebotenen Schemas aufgebaute EA funktionieren kann, kann leicht verstanden werden, indem man einfach auf das Schema blickt und auf Blocknamen und Relationenmatrizen (Kontrolle übergeben) zwischen ihnen hin orientiert. Nach dem Programmstart wird die Steuerung an den Block der Vorverarbeitung übergeben. In diesem Block können einige allgemeine Parameter analysiert werden. Wenn zum Beispiel nicht genügend Balken in einem Fenster vorhanden sind (Balken, die für die Berechnung der Parameter der technischen Indikatoren erforderlich sind), kann ein EA nicht in der Lage sein, adäquat zu operieren. In einem solchen Fall muss eine EA den Betrieb beenden, der vorläufig einen Benutzer darüber informiert und über den Grund der Kündigung berichtet. Wenn es keine Kontraindikatons von allgemeinem Charakter gibt, wird die Kontrolle an den Abrechnungsblock weitergegeben. Im Block der Buchhaltungsaufträge wird die Anzahl und Qualität der Aufträge, die in einem Clientterminal für ein Wertpapier vorhanden sind (an dem Fenster, an dem die EA angeschlossen ist) erfasst. In diesem Block müssen Aufträge anderer Wertpapiere eliminiert werden. Wenn eine programmierte Handelsstrategie nur Marktaufträge erfordert (und keine ausstehenden Aufträge verwendet), muss die Tatsache der Anwesenheit von ausstehenden Aufträgen erkannt werden. Wenn eine Strategie nur eine Marktordnung zulässt und es tatsächlich mehrere Aufträge gibt, sollte diese Tatsache auch bekannt sein. Die Aufgabe des Auftragsabrechnungsblocks (in diesem Schema) besteht darin, festzustellen, ob die aktuelle Handelssituation mit einem erwarteten übereinstimmt, d. H. Dem, in dem die EA adäquat arbeiten kann. Wenn die Situation entspricht, muss die Steuerung an den nächsten Block weitergeleitet werden, um die EAs-Operation fortzusetzen, wenn nicht, muss die EAs-Operation beendet werden, und diese Tatsache muss einem Benutzer gemeldet werden. Wenn im Terminal keine Aufträge vorhanden sind oder die Anzahl und Qualität der bestehenden Aufträge den Erwartungen entspricht, wird die Kontrolle an den Block der definierenden Handelskriterien übergeben. In diesem Block werden alle für die Durchführung von Handelsentscheidungen notwendigen Kriterien, nämlich Kriterien für das Öffnen, Schließen und Ändern von Aufträgen, berechnet. Eine weitere Steuerung wird an den Block der Schließaufträge weitergegeben. Es ist leicht zu verstehen, warum in dem angebotenen Schema der Block von Schlussaufträgen früher ausgeführt wird als der Block der Öffnungsbefehle. Es ist immer sinnvoller, erste Aufträge zu bearbeiten (schließen oder ändern) und erst danach neue Aufträge zu eröffnen. Im allgemeinen ist es richtig, sich von dem Wunsch leiten zu lassen, möglichst wenig Befehle zu haben. Bei der Ausführung dieses Satzes müssen alle Aufträge, für die das Schließkriterium aktiviert wurde, geschlossen werden. Nachdem alle notwendigen Aufträge geschlossen wurden, wird die Steuerung an einen Block der Größenordnung der neuen Aufträge übergeben. Es gibt viele Algorithmen zur Berechnung eines Auftragsvolumens. Die einfachste von ihnen ist mit einer konstanten, festen Losgröße. Es ist praktisch, diesen Algorithmus in einem Programm zum Testen von Strategien zu verwenden. Die populärere Methode, eine Auftragsgröße zu definieren, ist das Festlegen der Anzahl der Lots abhängig von der Menge an freiem Rand, zum Beispiel 30-40 davon. Wenn die freie Marge nicht ausreicht, beendet das Programm seinen Betrieb, indem er einen Benutzer über den Grund informiert hat. Nachdem die Anzahl der Lose für die Eröffnung neuer Aufträge definiert ist, wird die Steuerung an den Auftragsöffnungsblock übergeben. Wenn irgendeine der zuvor ermittelten Kriterien auf die Notwendigkeit hinweist, eine Bestellung einer bestimmten Art zu eröffnen, wird in diesem Block eine Handelsaufforderung zum Öffnen einer Bestellung gebildet. Es gibt auch Fehleranalyse-Block in einem Experten-Berater. Wenn eine Handelsoperation fehlgeschlagen ist, wird die Steuerung (nur in diesem Fall) an den Fehlerverarbeitungsblock übergeben. Wenn ein von einem Server oder Client-Terminal zurückgegebener Fehler nicht entscheidend ist, wird ein weiterer Versuch unternommen, eine Handelsoperation auszuführen. Wenn ein wichtiger Fehler zurückgegeben wird (z. B. ein Konto gesperrt ist), muss ein EA seinen Vorgang abbrechen. Denken Sie daran, in MQL4 gibt es keine Möglichkeit der Programmabschluss einer EAs-Operation in einem Sicherheitsfenster (anders als Skripte, siehe Sonderfunktionen). Was man auf Programmebene machen kann, ist die Beendigung von start (). Bei einem Neustart der Funktion start () auf einem neuen Tick kann der Wert eines bestimmten Variablen-Flag-Verbotshandels (in diesem Fall als Folge eines kritischen Fehlers aktiviert) analysiert und die Steuerung für die Beendigung des Vorgangs übergeben werden Sonderfunktion Betrieb damit Bildung von neuen Handelsanfrage ist nicht zulässig. In dem angebotenen Schema wird der Merkerwert im Block der Vorverarbeitung analysiert. Handelsstrategie Die Marktpreise bewegen sich ständig. Der Marktstatus kann zu jedem Zeitpunkt entweder als trend - starke unidirektionale Preisveränderung (Anstieg oder Abfall) charakterisiert werden, oder als flach - laterale Kursbewegung mit schwachen Abweichungen von einem bestimmten Durchschnitt. Diese Marktmerkmale sind bedingt, da es keine eindeutigen Kriterien gibt, nach denen Trend oder Wohnung identifiziert werden können. Beispielsweise lange Seitenbewegungen mit starken Abweichungen, die weder auf eine Ebene noch auf einen Trend zurückzuführen sind. Im Allgemeinen wird davon ausgegangen, dass der Markt ist vor allem in den Zustand der seitlichen Bewegung und Trends in der Regel statt 15-20 der Zeit. Alle Handelsstrategien können auch konventionell in zwei Hauptgruppen aufgeteilt werden. Die erste Gruppe enthält flachorientierte Strategien. Der Grundgedanke solcher Strategien ist, dass nach einem offensichtlichen Abweichungspreis zur vorherigen Position zurückkehren muss, deshalb werden Aufträge in die Richtung entgegen der letzten Kursbewegung geöffnet. Die zweiten Gruppenstrategien sind Trendstrategien, bei denen Aufträge in die gleiche Richtung wie die Salzpreisbewegung eröffnet werden. Es gibt kompliziertere (kombinierte) Strategien. Solche Strategien berücksichtigen viele verschiedene Faktoren, die charakterisieren Markt als Ergebnis Handel kann sowohl auf Flach-und Trend durchgeführt werden. Es ist nicht schwer, den Handel nach dieser oder dieser Strategie technisch zu implementieren - MQL4 enthält alle notwendigen Mittel dafür. Die wichtigste Arbeit in der Schaffung von einmal eigene Strategie besteht aus der Suche nach Handel Kriterien. Trading-Kriterien In diesem Beispiel werden wir versuchen, einen Trend Expert Advisor zu konstruieren, d. H. Diejenige, die Aufträge in der Kursbewegungsrichtung öffnen wird. So müssen wir finden unter verschiedenen technischen Indikatoren diejenigen, die einen Trend zu erkennen. Eine der einfachsten Methoden zum Suchen von Handelskriterien basiert auf der Analyse der Kombination von MAs mit unterschiedlichen Mittelungsperioden. Feige. 111 und Fig. 112 zeigen die Position von zwei verschiedenen MA (mit Perioden der Mittelung 11 und 31) auf verschiedenen Marktteilen. Mittelwerte mit kleinen Mittelungszeit (rote Linien) sind näher an einem Preisdiagramm, twisty und beweglich. Gleitende Mittelwerte mit größeren Mittelwerten (blaue Linie) sind inert, haben größere Verzögerungen und liegen weiter von den Marktpreisen entfernt. Lets Aufmerksamkeit auf Orte, wo MAs mit unterschiedlichen Mittelungsperioden Kreuz und versuchen zu entscheiden, ob die Tatsache der MA crossing kann als Lesekriterium verwendet werden. Feige. 111. Kreuzung von MA (11) und MA (31), wenn sich die Kursbewegungsrichtung ändert. In Fig. 111 sehen wir einen Marktteil, bei dem Aufträge in Richtung der Kursbewegung bei der MA-Kreuzung gerechtfertigt sind. In Punkt A kreuzt die rote Linie die blaue von unten nach oben, danach steigt der Marktpreis für eine gewisse Zeit an. Weitere Rückwärts-MA-Kreuzung zeigt die Kursbewegungsänderung an. Wenn wir einen Kaufauftrag am Punkt A öffnen und ihn bei B schließen, erhalten wir Profit proportional zur Differenz von A und B Preisen. Feige. 112. Kreuzung von MA (11) und MA (31), wenn sich die Kursbewegungsrichtung ändert. Gleichzeitig gibt es andere Momente auf dem Markt, wenn MA kreuzt, aber dies führt nicht zu einem weiteren erheblichen Preisanstieg oder - rückgang (Abb. 112). Aufträge bei MA Kreuzung in solchen Momenten zu Verlusten führen. Wenn Sell bei A eröffnet und bei B geschlossen wird, führt dies zu Verlusten. Dasselbe gilt für einen bei B eröffneten und bei C geschlossenen Kaufauftrag. Der Erfolg der gesamten auf MA-Crossing umgesetzten Strategie hängt von der Anzahl der Teile ab, die als Trend und flach charakterisiert werden können. In flachen oft MA Kreuzung ist ein regelmäßiges Ereignis, das jede Trendstrategie stört. Zahlreiche falsche Signale führen in der Regel zu Verlusten. Aus diesem Grund kann diese Zeichenüberquerung von MAs mit unterschiedlicher Mittelungsperiode für den Aufbau von Handelsstrategien nur in Kombination mit anderen Trendzeichen verwendet werden. In this example (for constructing a simple Expert Advisor) we will have to refuse using this sign. We will use another sign. Analyzing visually the character of price changes in the market, we can see that a long one-direction price rise or fall often appears as a result of a short strong movement. In other words, if within a short period a strong movement happened, we may expect its continuation in a medium-term period. Feige. 113 shows the market period when a strong movement resulted in the continuation of the price change in the same direction. As the quota strong movementquot we may use the difference of MAs with different averaging periods. The stronger the movement, the larger is the lag of MA with larger averaging period from MA with a small period of averaging. Moreover, even strong discontinuous price movements with further return do not result in a large difference between MAs, i. e. numerous false signals do not appear. For example, price jump by 50 points with further return (in the center in Fig. 113) entailed increase of difference between MAs only by 20 points. At the same time a really strong movement (which is not usually accompanied by a considerable correction) in point A resulted in the difference increase up to 25 - 30 points. If Buy order is opened when a certain value of difference between MAs is reached, for example in A, most probably the order will be profitable when a price reaches a preset Stop order value. Lets use this value as a trading criterion in our Expert Advisor. Number of Orders In this example we analyze an Expert Advisor that admits presence of only one market order, pending orders are not provided. Such an approach is justified not only in this certain example, but can be used as the basis for any strategy. Pending orders are usually used when a developer has quite a reliable criterion for forecasting the future price change with high probability. If there is no such criterion, no need to use pending orders. The situation when several opposite orders for one security are open also cannot be considered reasonable. It was written earlier that from economical point of view opposite orders are considered to be senseless, especially if the order prices are equal (see Closing and Deleting Orders ). In such a case we should close one order by another one and wait for a signal to open one market order in a certain direction. Relation of Trading Criteria From this position it becomes clear what relations are possible between trading criteria. Feige. 114 shows three variants of correlation of trading criteria, when each criterion is important (valid). Actions (opening and closing market orders) take place clockwise on the following pictures. Feige. 114. Order opening and closing criteria correlation (a and b - correct, c - incorrect). The most popular variant of a correctly formed trading criteria is the variant a . After being opened a market order Buy is held upon till the moment when criterion requiring its closing triggers. After that a pause occurs when no orders are opened. Further a market order Sell can be opened. Conditions for closing a Sell order (in accordance with correctly formed criteria) occur earlier, than conditions for opening a Buy order. However, a Buy order can be opened once again, if a trading criterion requires this. But according to this variant a market order cannot be opened if there is an open market order in the contrary direction. Similar criteria correlation is in the variant b . The difference is that a criterion for opening any market order is at the same time a criterion for closing the opposite order. This variant like the variant a does not allow several orders opened in the terminal at the same time on one security. The variant of criteria correlation is incorrect. According to this variant opening of a market order is allowed when contrary orders are not closed yet, which is senseless. There can be rare cases when this variant is partially justified. Opening of an opposite order is sometimes acceptable for compensating losses occurring at small corrections after strong price movements. In such cases an opposite order can be opened of the same or smaller value than the already existing one and then closed when the correction is over. Such a tactic allows not to interfere with the quotmainquot order opened in the trend direction. In general case several one-direction orders are also possible. This may be justified when an earlier opened order is protected by a Stop order and the criterion pointing at the price development in the same direction triggered once again. However, when creating such a strategy, a developer must be fully aware that in case of a sharp price movement change the placed stop orders may be unexecuted by some brokers at the first price touch. And the loss will be proportionate to the total value of one-directional market orders. In our example we use variant b of trading criteria correlation. All opened market orders are closed either by a stop order or after a criterion of opening an order in opposite direction triggers (here criterion of closing Buy coincides with that of opening Sell and vice versa). Size of Opened Orders In any trading strategy order sizes should be reasonably limited. In a simple case a fixed order size is used in an Expert Advisor. Before EA operation start, a user can set any size of future orders and leave it unchanged for some time. Further if balance changes, a user can set up a new value of lot numbers of opened orders. A too small order size provides more confidence in operation at the unpredictable market change, but the profit in case of success will be not so large. If the order size is too large, large profit can be acquired, but such an EA will be too risky. Usually the size of opened orders is set up so, that margin requirements do not exceed 2-35 percent of the balance or free margin (if a strategy allows only one opened order, balance and free margin at the moment before the order opening will be equal). In this example both variants are implemented. A user may choose either to indicate directly values of orders or set the value in percentage from the free margin. Programming Details A simple trend Expert Advisor tradingexpert. mq4 constructed on the basis of previous arguments can look like this: Describing Variables One more criterion in program estimation is its readability. A program is considered to be correctly written, if it can be easily read by other programmers, thats why all main program parts and main moments characterizing the strategy must be commented. This is also why it is recommended to declare and comment all variables at the beginning of the program. In the block 1-2 external and global variables are described. According to rules, external and global variables must be opened before their first usage (see Types of Variables ), thats why they are declared in the program head part. All local variables of the function start() are gathered and described in the upper function part (block 2-3) immediately after the function header. Rules of declaring local variables do not require it, but also do not prohibit. If a programmer faces difficulties in understanding the meaning of a variable when reading the program, he can refer to the upper program part and find out the meaning and type of any variable. It is very convenient in programming practice. Block of preliminary processing In this example the preprocessing consists of two parts (block 3-4). The program terminates operation if there are not enough bars in a security window in such a case it is impossible to detect correctly (in block 5-6) values of moving averages necessary for calculating criteria. Besides here the value of the variable Work is analyzed. In the normal EA operation the variable value is always true (it is set once during initialization). If a critical error occurs in the program operation, false is assigned to this variable and start() finishes its operation. This value will not change in future, that is why the following code is not executed. In such a case the program operation must be stopped and the reason for the critical error must be detected (if needed, a dealing center must be contacted). After the situation is solved, the program can be started once again, i. e. the EA can be attached to a security window. Accounting orders The described Expert Advisor allows working only with one market order. The task of the orders accounting block (block 4-5) is to define characteristics of an opened order, if there is one. In the loop going through orders for all existing market and pending orders are checked, namely from the first (int i1) to the last one (iampltOrdersTotal()). In each cycle iteration the next order is selected by the function OrderSelect(). The selection is made from a source of opened and pending orders (SELECTBYPOS). If the selection is executed successfully (i. e. there is one more order in the terminal), further this order and the situation must be analyzed: whether the order is opened for the security, at which the EA operates, whether the order is market or pending it also must be taken into account when counting orders. In the line: all orders opened for another security are eliminated. Operator continue stops the iteration and characteristics of such an order are not processed. But if the order is opened for the security, to the window of which the EA is attached, it is further analyzed. If OrderType() returns value more than 1 (see Types of Trades ), the selected order is a pending one. But in this Expert Advisor managing pending orders is not provided. It means the execution of start() must be terminated, because a conflict situation occurred. In such a case after a message about the operation termination start() execution is stopped by the operator return. If the last check showed that the analyzed order is a market order, the total number of orders for a security is calculated and analyzed. For the first of such orders all necessary characteristics are defined. If in the next iteration the order counter (variable Total) finds the second market order, the situation is also considered to be conflict, because the EA cannot manage more than one market order. In such a case start() execution is stopped after showing a corresponding message. As a result of the order accounting block execution (if all checks were successful) the variable Total preserves its zero value if there are no market orders, or gets the value 1 if there is a market order for our security. In the latter case some variables set in correspondence with the order characteristics (number, type, opening price, stop levels and order value) also get their values. Calculating Trading Criteria In the analyzed example definition of trading criteria (block 5-6) is calculated on the bases of difference between Moving Averages with different periods of averaging. According to accepted criteria a chart is bull-directed if the current value of the MA with smaller period is larger than the value of MA with larger period, and the difference between the values is larger than a certain value. In a bear movement MA with smaller period is lower than MA with larger period and the difference is also larger than a certain critical value. At the block beginning values of MAs with averaging periods PeriodMA1 and PeriodMA2 are calculated. The fact of significance of any trading criterion is expressed via the value of a corresponding variable. Variables OpnB and OpnS denote the criterion triggering for opening Buy and Sell orders, variables Cls and ClsS - for closing. For example, if a criterion for opening Buy has not triggered, the value of OpnB remains false (set at the variable initialization) if it has triggered, OpnB gets the value true. In this case the criterion for closing Sell coincides with that for opening Buy, criterion for opening Sell coincides with that for closing Buy. Trading criteria accepted in this example are used for educational purpose only and must not be considered as a guideline when trading on a real account. Closing Orders It was written earlier that this Expert Advisor is intended for operation only with one market order opened for a security, to which window the EA is attached. To the moment when control in the program is passed to the order closing block it is known for sure that at the current moment there are either no orders for the security, or there is only one market order. Thats why the code in orders closing block is written so that only one order can be closed successfully. This block is based on the infinite loop while, the body of which consists of two analogous parts: one for closing a Buy order, another for closing a Sell order. While is used here for the purpose that in case of a trade operation failure it could be repeated once again. In the header of the first operator if condition for closing a Buy order is calculated (Sell orders are closed in the analogous way). If the type of an earlier opened order corresponds to Buy (see Types of Trades ) and the sign for closing Buy is relevant, control is passed to the body of if operator where a request to close is formed. As an order closing price in the function OrderClose() the value of a two-sided quote corresponding to the order type is indicated (see Requirements and Limitations in Making Trades ). If a trade operation is executed successfully, after a message about the order closing is shown the current while iteration is stopped and the execution of the order closing block is over. But if the operation fails, the user-defined function for processing errors FunError() is called (block 10-11). Processing Errors As a passed parameter in FunError() the last error code calculated by GetLastError() is used. Depending on the error code FunError() returns 1 if the error is not critical and the operation can be repeated, and 0 if the error is critical. Critical errors are divided into two types - those, after which a program execution can be continued (for example, a common error) and those, after which execution of any trade operations must be stopped (for example, blocked account). if after an unsuccessful trade operation the user-defined function returns 1, the current while iteration is terminated and during the next iteration another attempt is made to execute the operation - to close the order. If the function returns 0, the current start() execution is stopped. On the next tick start() will be started by the client terminal again and if conditions for order closing are preserved, another attempt to close the order will be made. If during error processing it is found out that further program execution is senseless (for example the program operates on an old client terminal version) during the next start the execution of the special function start() will be terminated in the block of preliminary processing when analyzing the value of the variable Work. Calculating Amount of Lots for New Orders Amount of lots can be calculated in accordance with a users settings following one of the two variants. The first variant is a certain constant value set up by a user. According to the second variant the amount of lots is calculated on the basis of a sum equal to a certain percentage (set by a user) of a free margin. At the beginning of the block of defining the amount of lots for new orders (block 7-8) necessary values of some variables are calculated - minimal allowed amount of lots and step of lot change set up by a broker, free margin and price of one lot for the security. In this example the following is provided. If a user has set up a certain non-zero value of the external variable Lts, for example 0.5, it is accepted as the amount of lots Lts when a trade request to open an order is formed. If 0 is assigned to Lts, the number of lots Lts is defined on the basis of the variable Prots (percentage), free margin and conditions set up by a broker. After Lts is calculated, a check is conducted. If this value is lower than the minimal allowed value, the minimal allowed value is accepted. but if free margin is not enough, after a corresponding message the start() execution is terminated. Opening Orders The block of opening orders (block 8-9) like the bloke of opening orders is an infinite loop while. In the header of the first operator if conditions for opening a Buy order are calculated: if there are no orders for the security (variable Total is equal to 0) and the sign for opening a Buy order is relevant (OpnB is true ), control is passed to if operator body for opening an order. In such a case after rates are refreshed prices for stop levels are calculated. Values of stop levels are initially set by a user in external variables StopLoss and TakeProfit. In a general case a user can set values for this parameters smaller that a broker allows. Besides a broker may change the minimal allowed distance at any moment (it is an often case at strong market movements, for example, before important news release). Thats why before each order opening stop levels must be calculate taking into account values set bu a user and the minimal allowed value set up by a broker. For calculating stop levels the user-defined function NewStop() is used as a passed parameter the stop level value set by a user is used. In NewStop() first the current minimal allowed distance is calculated. If the value set by a user corresponds to a brokers requirements, this value is returned. If it is smaller than the allowed value, the value allowed by a broker is used. Prices of stop requests are calculated from the corresponding two-sided quote (see Requirements and Limitations in Making Trades ). A trade request to open an order is formed using the function OrderSend(). For the calculation of order opening price and prices of stop requests the two-sided quote values corresponding to the order type are used. If a trade operation was successful (i. e. a server returned the number of an opened order) after a message about a successful order opening is shown. start() execution is finished. If an order was not opened and the client terminal returned an error, the error is processed according to the algorithm described earlier. Some Code Peculiarities The analyzed Expert Advisor code is oriented to the implementation of a certain strategy. Note, some program lines contain variables and calculations that would be changed, if the strategy were changed. For example, according to the accepted strategy the Expert Advisor is developed to work only with one order. This allowed to use the variable Ticket both for the identification of a closing order number (in block of closing 6-7) and for the identification of a success of a trade operation execution when opening an order (in the block of opening 8-9). In this case such a solution is acceptable. However, if we take the analyzed code as the basis for the implementation of another strategy (for example allow opposite orders) we will have to introduce one or several variables to be able to recognize numbers of opened orders and identify the success of trade operations. In further strategy modifications we will have to change come program lines containing part of logics contained in the source strategy. Namely in the order accounting block we will not have to terminate the program operation if there are several open orders for a security. Besides, conditions for opening and closing orders will alslo change. This will entail the code changing in blocks of opening and closing orders. On the basis of this analysis we can easily conclude that the described simple Expert Advisor is not perfect. In a general case, for the implementation of order accounting one should use a universal function based on using data arrays and not containing logics of a certain strategy. The same can be said about the blocks of opening and closing orders. A more complete program must contain a main analytical function, all other user-defined functions must be subordinate to it. This analytical function must contain a program code, in which all conditions for the implementation of any strategy are analyzed all subordinate functions must perform limited actions. The function of accounting orders must only account orders, functions of opening and closing orders must only open and close orders, and the analytical function must quotthinkquot and manage all other functions, i. e. call them when needed.
Comments
Post a Comment