Thursday 9 March 2017

Writing Forex Experten Berater

MetaTrader 5 - Trading Systems Schritt-für-Schritt-Anleitung zum Schreiben eines Experten-Beraters in MQL5 für Anfänger Einleitung Dieser Artikel richtet sich an Anfänger, die lernen wollen, wie man einfache Expert Advisors in der neuen MQL5-Sprache schreibt. Wir werden zunächst beginnen, indem wir definieren, was wir wollen, dass unsere EA (Expert Advisor) zu tun, und dann weiter, wie wir wollen, dass die EA es zu tun. 1. Trading-Strategie Was unsere EA tun wird: Es wird ein bestimmter Indikator überwachen, und wenn eine bestimmte Bedingung erfüllt ist (oder bestimmte Bedingungen erfüllt sind), wird es je nach aktueller Bedingung einen Handel (entweder ShortSell oder LongBuy) platzieren Das ist erfüllt Das oben genannte heißt Handelsstrategie. Bevor du eine EA schreiben kannst, musst du zuerst die Strategie entwickeln, die du in die EA automatisieren möchtest. Also in diesem Fall lassen wir die obige Aussage so ändern, dass sie die Strategie widerspiegelt, die wir in eine EA entwickeln wollen. Wir verwenden einen Indikator namens Moving Average mit einem Zeitraum von 8 (Sie können eine beliebige Periode wählen, aber für die Zwecke unserer Strategie werden wir 8) Wir wollen unsere EA, um einen Long (Buy) Handel zu platzieren, wenn die Moving Average - 8 (um unserer Diskussion willen, werde ich es als MA-8 verweisen) steigt nach oben und der Preis ist dicht darüber und es wird einen Short (Sell) platzieren, wenn MA-8 nach unten abnimmt und der Preis nahe ist darunter. Wir werden auch einen anderen Indikator namens Average Directional Movement (ADX) mit Periode 8 verwenden, um uns zu helfen, festzustellen, ob der Markt tendiert oder nicht. Wir machen das, weil wir nur den Handel betreten wollen, wenn der Markt tendiert und sich entspannt, wenn der Markt reicht (das heißt nicht tendenziell). Um dies zu erreichen, werden wir nur unseren Handel (Kauf oder Verkauf), wenn oben Bedingungen erfüllt sind und der ADX-Wert ist größer als 22. Wenn ADX größer ist, dass 22 aber abnehmend, oder ADX ist weniger als 22, werden wir nicht handeln, Obwohl die Bedingung B erfüllt ist. Wir wollen uns auch schützen, indem wir einen Stop-Loss von 30 Pips setzen, und für unser Profit-Ziel werden wir einen Gewinn von 100 Pips ansprechen. Wir wollen auch, dass unsere EA nach dem Kauf von Sonderangeboten nur nach einer neuen Bar sucht, und wir werden auch sicherstellen, dass wir eine Kaufposition öffnen, wenn die Kaufbedingungen erfüllt sind und wir nicht bereits eine geöffnet haben und eine Verkaufsposition öffnen Die Verkaufsbedingungen sind erfüllt und wir haben noch keinen geöffnet. Wir haben jetzt unsere Strategie entwickelt, jetzt ist es an der Zeit, unseren Code zu schreiben. 2. Schreiben eines Expertenberaters Beginnen Sie mit dem Starten des MetaQuotes-Spracheditors 5. Drücken Sie dann Strg oder klicken Sie auf die Schaltfläche Neu in der Menüleiste. Abbildung 1. Starten eines neuen MQL5-Dokuments Im MQL5-Wizard-Fenster wählen Sie Expert Advisor und klicken Sie auf Weiter als Gezeigt in Abb. 2: Abbildung 2. Auswählen des Programmtyps Geben Sie im nächsten Fenster den Namen ein, den Sie Ihrem EA im Feld Name geben möchten. In diesem Fall habe ich MyFirstEA eingegeben. Sie können dann Ihren Namen in das Feld Autor und auch Ihre Website-Adresse oder E-Mail-Adresse in der Link-Box (wenn Sie eine haben). Abbildung 3. Allgemeine Eigenschaften des Expert Advisors Da wir in der Lage sein werden, einige der Parameter für unsere EA zu ändern, um zu sehen, welche der Werte uns das beste Ergebnis geben können, werden wir sie durch Anklicken der Schaltfläche Hinzufügen hinzufügen. Abbildung 4. Einstellen der EA-Eingangsparameter In unserem EA wollen wir mit unseren Stop-Loss-, Take Profit-, ADX-Perioden - und Moving Average Period-Einstellungen experimentieren, so dass wir sie an dieser Stelle definieren werden. Doppelklicken Sie unter den Namen Name und geben Sie den Namen des Parameters ein, und doppelklicken Sie dann unter den Typ, um den Datentyp für den Parameter auszuwählen, und doppelklicken Sie unter den Abschnitt Anfangswert und geben Sie den Anfangswert für den Parameter ein. Sobald Sie fertig sind, sollte es so aussehen: Abbildung 5. Datentypen der EA-Eingangsparameter Wie Sie oben sehen können, habe ich für alle Parameter einen Integer - (Int) - Datentyp ausgewählt. Lass uns ein wenig über Datentypen sprechen. Char: Der Char-Typ dauert 1 Byte Speicher (8 Bits) und erlaubt das Ausdrücken in den Binär-Notation 28256 Werte. Der Char-Typ kann sowohl positive als auch negative Werte enthalten. Der Wertebereich liegt zwischen -128 und 127. uchar: Der uchar-Integer-Typ belegt auch 1 Byte Speicher, sowie den Char-Typ, aber im Gegensatz dazu ist es uchar nur für positive Werte gedacht. Der Minimalwert ist Null, der Maximalwert ist 255. Der erste Buchstabe u im Namen des uchar-Typs ist die Abkürzung für unsigned. Kurz: Die Größe des kurzen Typs beträgt 2 Bytes (16 Bits) und erlaubt dementsprechend das Ausgeben des Wertebereichs gleich 2 der Leistung 16: 216 65 536. Da der Kurztyp ein Vorzeichen ist und beide enthält Positiven und negativen Werten liegt der Wertebereich zwischen -32 768 und 32 767. ushort: Der unsigned short type ist der Typ ushort. Die auch eine Größe von 2 Bytes hat. Der Minimalwert ist 0, der Maximalwert ist 65 535. int: Die Größe des int-Typs beträgt 4 Bytes (32 Bits). Der Minimalwert ist -2 147 483 648, der maximale ist 2 147 483 647. uint: Der unsigned Integer-Typ ist uint. Es dauert 4 Bytes Speicher und erlaubt das Ausdrücken von ganzen Zahlen von 0 bis 4 294 967 295. lang: Die Größe des langen Typs beträgt 8 Bytes (64 Bits). Der Minimalwert ist -9 223 372 036 854 775 808, der Maximalwert ist 9 223 372 036 854 775 807. ulong: Der ulong-Typ belegt auch 8 Bytes und kann Werte von 0 bis 18 446 744 073 709 551 615 speichern Die obige Beschreibung der verschiedenen Datentypen, die unsigned Integer-Typen sind nicht für die Speicherung von negativen Werten ausgelegt, jeder Versuch, einen negativen Wert zu setzen, kann zu unerwarteten Konsequenzen führen. Wenn Sie z. B. negative Werte speichern möchten, können Sie sie nicht in den unsignierten Typen speichern (d. H. Uchar, uint, ushort, ulong). Zurück zu unserer EA. Wenn wir uns die Datentypen anschauen, werden Sie mit mir einverstanden sein, dass wir annehmen, um char - oder uchar-Datentypen zu verwenden, da die Daten, die wir in diesen Parametern speichern möchten, weniger als 127 bzw. 255 betragen. Für eine gute Speicherverwaltung ist dies das Beste, was zu tun ist. Aber um unserer Diskussion willen, bleiben wir noch am int-Typ. Sobald Sie fertig sind, stellen Sie alle notwendigen Parameter ein, klicken Sie auf die Schaltfläche Fertig und der MetaQuotes Editor erstellt das Skelett des Codes für Sie, wie in der nächsten Abbildung gezeigt. Lets brechen den Code in die verschiedenen Abschnitte für ein besseres Verständnis. Der obere Teil (Header) des Codes ist dort, wo die Eigenschaft der EA definiert ist. Sie können sehen, dass hier die Werte sind, die Sie im MQL5 Wizard in Abbildung 3 ausgefüllt haben. In diesem Abschnitt des Codes können Sie zusätzliche Parameter wie Beschreibung (kurze Textbeschreibung der EA) definieren, Konstanten deklarieren, zusätzliche Dateien oder Importfunktionen enthalten . Wenn eine Aussage mit einem Symbol beginnt, wird sie als Präprozessor-Direktive bezeichnet und endet nicht mit einem Semikolon. Ein anderes Beispiel für Präprozessor-Direktiven beinhaltet: Die Definitionsrichtlinie wird für eine Konstantenerklärung verwendet. Es ist in der Form geschrieben definieren identifier tokenstring Was dies tut, ist ersetzen jedes Vorkommen der Kennung in Ihrem Code mit dem Wert tokenstring. Definieren ABC 100 definieren COMPANYNAME MetaQuotes Software Corp. Es ersetzt jedes Vorkommen von COMPANYNAME durch die Zeichenfolge MetaQuotes Software Corp. oder es ersetzt jedes Vorkommen von ABC mit dem Zeichen char (oder Integer) 100 in Ihrem Code. Lesen Sie mehr über die Präprozessor-Richtlinien im MQL5-Handbuch. Lasst uns nun mit unserer Diskussion fortfahren. Der zweite Teil des Headers unseres Codes ist der Eingabeparameter-Abschnitt: Wir spezifizieren alle Parameter, die in unserem EA in diesem Abschnitt verwendet werden. Dazu gehören alle Variablen, die von allen Funktionen verwendet werden, die wir in unserem EA schreiben werden. Variablen, die auf dieser Ebene deklariert werden, werden Globale Variablen genannt, weil sie von jeder Funktion in unserer EA zugänglich sind, die sie benötigen kann. Die Eingabeparameter sind Parameter, die nur außerhalb unserer EA geändert werden können. Wir können auch andere Variablen deklarieren, die wir im Rahmen unserer EA manipulieren werden, aber nicht außerhalb unserer EA in diesem Abschnitt verfügbar sind. Weiter ist die EA-Initialisierungsfunktion. Dies ist die erste Funktion, die aufgerufen wird, wenn die EA gestartet oder an ein Diagramm angeschlossen ist und es nur einmal genannt wird. Dieser Abschnitt ist der beste Ort, um einige wichtige Schecks zu machen, um sicherzustellen, dass unsere EA sehr gut funktioniert. Wir können entscheiden, ob das Diagramm genügend Stäbe für unsere EA hat, um zu arbeiten usw. Es ist auch der beste Platz, um die Griffe zu bekommen, die wir für unsere Indikatoren verwenden werden (ADX und Moving Average Indikatoren). Für unsere EA werden wir bei der Initialisierung in diesem Abschnitt die für unsere Indikatoren erstellten Griffe freigeben. Diese Funktion verarbeitet das NewTick-Ereignis. Die erzeugt wird, wenn ein neues Zitat für ein Symbol empfangen wird. Beachten Sie, dass Expert Advisor keine Handelsoperationen durchführen kann, wenn die Verwendung von Expertenberatern im Client-Terminal nicht erlaubt ist (Button Auto Trading). Abbildung 6. Autotrading ist aktiviert Die meisten unserer Codes, die unsere Handelsstrategie implementieren werden, die früher entwickelt wurde, wird in diesem Abschnitt geschrieben. Nun, da wir uns die verschiedenen Abschnitte des Kodex für unsere EA angesehen haben, fangen wir an, dem Skelett Fleisch hinzuzufügen. 2.2 EINGANGSPARAMETER ABSCHNITT Wie Sie sehen können, haben wir weitere Parameter hinzugefügt. Bevor wir die neuen Parameter fortsetzen, lassen Sie uns etwas diskutieren, das Sie jetzt sehen können. Die beiden Schrägstriche erlauben uns, Kommentare in unsere Codes zu stellen. Mit Kommentaren sind wir in der Lage zu wissen, was unsere Variablen stehen, oder was wir zu diesem Zeitpunkt in unserem Code machen. Es gibt auch ein besseres Verständnis unserer Code. Es gibt zwei grundlegende Möglichkeiten, um Kommentare zu schreiben: Dies ist ein Single-Line-Kommentar Dies ist ein mehrzeiliger Kommentar Dies ist ein mehrzeiliger Kommentar. Mehrzeilige Kommentare beginnen mit dem Symbolpaar und enden mit dem einen. Der Compiler ignoriert alle Kommentare beim Kompilieren Ihres Codes. Die Verwendung von Einzeilen-Kommentaren für die Eingabeparameter ist eine gute Möglichkeit, unsere EA-Benutzer zu verstehen, was diese Parameter für stehen. Auf den EA Input-Eigenschaften sehen unsere Benutzer den Parameter selbst nicht, aber stattdessen sehen sie die Kommentare wie folgt: Abbildung 7. Expert Advisor-Eingabeparameter Jetzt zurück zu unserem Code Wir haben uns entschlossen, zusätzliche Parameter für unsere EA hinzuzufügen. Das EAMagic ist die magische Zahl für alle Aufträge unserer EA. Der minimale ADX-Wert (AdxMin) wird als doppelter Datentyp deklariert. Ein Doppel wird verwendet, um Gleitpunktkonstanten zu speichern, die einen ganzzahligen Teil, einen Dezimalpunkt und einen Bruchteil enthalten. Double mysum 123.5678 double b7 0.09876 Das Lot to trade (Lot) repräsentiert das Volumen des Finanzinstruments, das wir handeln möchten. Dann haben wir andere Parameter erklärt, die wir verwenden werden: Der adxHandle wird für die Speicherung des ADX-Indikatorhandgriffs verwendet, während der MaHandle den Griff für den Moving Average-Indikator speichert. Die plsDI, minDI, adxVal sind dynamische Arrays, die die Werte von DI, - DI und Haupt-ADX (des ADX-Indikators) für jeden Balken auf dem Diagramm halten. Das maVal ist ein dynamisches Array, das die Werte des Moving Average Indikators für jeden Balken auf dem Diagramm enthält. Übrigens, was sind dynamische Arrays Ein dynamisches Array ist ein Array, das ohne Dimension deklariert ist. Mit anderen Worten, kein Wert wird in dem Paar von eckigen Klammern angegeben. Ein statisches Array, auf der anderen Seite hat seine Dimensionen definiert an der Stelle der Deklaration. Doppel Allbars 20 Dies wird 20 Elemente pclose ist eine Variable, die wir verwenden, um die Close-Preis für die Bar, die wir gehen zu überwachen für die Überprüfung unserer BuySell Trades zu speichern. STP und TKP werden verwendet, um den Stop Loss und die Take Profit Werte in unserem EA zu speichern. 2.3 EA INTIALISIERUNG ABSCHNITT Hier erhalten wir die Griffe unserer Indikator mit den jeweiligen Indikatorfunktionen. Der ADX-Indikatorgriff wird mit der iADX-Funktion erhalten. Es dauert das Diagramm-Symbol (NULL bedeutet auch das aktuelle Symbol auf dem aktuellen Diagramm), das Chart-Periodenzeitrahmen (0 bedeutet auch den aktuellen Zeitrahmen auf dem aktuellen Diagramm), die ADX-Mittelungsperiode für die Berechnung des Index (die wir früher unter Eingabeparameter definiert haben) Abschnitt) als Parameter oder Argumente. Int iADX (Stringsymbol, Symbolname ENUMTIMEFRAMES Zeitraum, Periode int Adxperiod-Mittelungsperiode) Der Moving Average Indikator-Handle wird mit der iMA-Funktion erhalten. Es gibt die folgenden Argumente: das Diagramm-Symbol (das mit dem Symbol Symbol () oder NULL für das aktuelle Symbol auf dem aktuellen Diagramm erhalten werden kann), das Diagrammperioden-Zeitrahmen (das mit Periodenperiode () oder 0 für erhalten werden kann Der aktuelle Zeitrahmen auf dem aktuellen Chart), die Moving Average-Mittelungsperiode (die wir zuvor unter Eingabeparameter-Sektion definiert haben), die Verschiebung des Indikators relativ zum Preis-Chart (Verschiebung hier ist 0), der Moving Average Glättungstyp (könnte sein Eine der folgenden Mittelungsmethoden: Einfache Mittelwertbildung-MODESMA, Exponential-Mittelwertbildung-MODEEMA, geglättete Mittelwertbildung-MODESMMA oder Lineargewichtete Mittelwertbildung-MODELWMA) und der für die Mittelung verwendete Preis (hier verwenden wir den engen Preis). Int iMA (Stringsymbol Symbolname ENUMTIMEFRAMES Zeitraum Periode int maperiod Mittelwertperiode int mashift horizontale Verschiebung ENUMMAMETHOD Mamethod. Glättung Typ ENUMAPPLIEDPRICE Applikationspreis Preis oder Griff) Bitte lesen Sie das MQL5 Handbuch, um weitere Details zu diesen Indikatorfunktionen zu erhalten. Es wird Ihnen ein besseres Verständnis für die Verwendung jeder Indikator geben. Wir versuchen wieder, auf irgendeinen Fehler zu überprüfen, falls die Funktion den Griff nicht erfolgreich zurückgibt, erhalten wir einen INVALIDHANDLE Fehler. Wir verwenden die Alert-Funktion, um den Fehler mit der Funktion GetlastError anzuzeigen. Wir beschließen, den Stop Loss und die Take Profit Werte in den Variablen STP und TKP zu speichern, die wir früher erklärt haben. Warum machen wir das, weil die in den INPUT-Parametern gespeicherten Werte schreibgeschützt sind, können sie nicht geändert werden. Also hier wollen wir sicherstellen, dass unsere EA sehr gut mit allen Brokern arbeitet. Ziffern oder Ziffern () r bestimmt die Anzahl der Dezimalstellen, die die Genauigkeit des Preises des aktuellen Kartensymbols bestimmen. Für eine 5-stellige oder dreistellige Preisliste multiplizieren wir sowohl den Stop Loss als auch den Take Profit um 10. 2.4. EA DEINTIALIZATION ABSCHNITT Da diese Funktion aufgerufen wird, wenn die EA deaktiviert oder aus einem Diagramm entfernt wird, werden wir alle Indikatorhandles freigeben, die bei der Initialisierung hier erstellt wurden. Wir haben zwei Griffe erstellt, eine für ADX-Indikator und einen anderen Griff für die Moving Average Indikator. Wir verwenden die IndicatorRelease () - Funktion, um dies zu erreichen. Es dauert nur ein Argument (der Indikatorgriff) bool IndicatorRelease (int Indikatorhandle. Indikatorgriff) Die Funktion entfernt einen Indikatorgriff und gibt den Rechenblock des Indikators frei, falls er nicht verwendet wurde. 2.5 DAS EA ONTICK-ABSCHNITT Das erste, was wir hier tun müssen, ist zu prüfen, ob wir genug Takte auf dem aktuellen Chart haben. Wir können die gesamte Balken in der Geschichte eines Diagramms mit der Funktion Bars erhalten. Es dauert zwei Parameter, das Symbol (kann mit Symbol oder Symbol () erhalten werden. Diese beiden geben das aktuelle Symbol für das aktuelle Diagramm, an dem unsere EA angehängt ist, und den Zeitraum oder Zeitrahmen des vorliegenden Diagramms (kann mit Periode erhalten werden Oder Periode (). Diese beiden werden den Zeitrahmen des aktuellen Diagramms zurückgeben, an dem die EA angeschlossen ist). Wenn die insgesamt verfügbaren Bars weniger als 60 sind, wollen wir unsere EA entspannen, bis wir genügend Bars auf dem Chart haben. Die Alert-Funktion zeigt eine Meldung in einem separaten Fenster an. Es werden beliebige Werte durch Kommas als Parameterargumente getrennt. In diesem Fall haben wir nur einen Stringwert. Die Rückkehr verlässt die Initialisierung unserer EA. Der Expert Advisor führt zu Beginn einer neuen Bar einen Handelsbetrieb durch, so dass es notwendig ist, das Problem mit der neuen Balkenidentifikation zu lösen. Mit den Worten, wir wollen sicher sein, dass unsere EA nicht auf LongShort Setups auf jedem Tick zu überprüfen, wir wollen nur unsere EA auf LongShort Positionen zu überprüfen, wenn es eine neue Bar ist. Wir beginnen mit einer statischen datetime Variable OldTime. Die die Bar-Zeit speichern wird. Wir haben es als statisch deklariert, weil wir den Wert bis zum nächsten Aufruf der OnTick-Funktion im Speicher behalten wollen. Dann können wir seinen Wert mit der NewTime-Variablen (auch vom Datetime-Datentyp) vergleichen, die ein Array eines Elements ist, um die neue (aktuelle) Balkenzeit zu halten. Wir haben auch eine bool-Datentypvariable IsNewBar deklariert und ihren Wert auf false gesetzt. Das ist, weil wir wollen, dass sein Wert nur dann WAHR ist, wenn wir eine neue Bar haben. Wir verwenden die CopyTime-Funktion, um die Zeit der aktuellen Leiste zu erhalten. Es kopiert die Bar Zeit auf das Array NewTime mit einem Element, wenn es erfolgreich ist, vergleichen wir die Zeit einer neuen Bar mit der vorherigen Bar Zeit. Wenn die Zeiten arent gleich sind, bedeutet dies, dass wir einen neuen Balken haben, und wir setzen die Variable IsNewBar auf TRUE und speichern den Wert der aktuellen Balkenzeit auf die Variable OldTime. Die Variable IsNewBar zeigt an, dass wir eine neue Leiste haben. Wenn es FALSE ist, beenden wir die Ausführung der OnTick-Funktion. Werfen Sie einen Blick auf den Code, den es für die Debug-Modus-Ausführung überprüft, wird es die Nachricht über die Bar-Zeiten drucken, wenn Debug-Modus, werden wir es weiter betrachten. Das nächste, was wir hier machen wollen, ist zu prüfen, ob wir genug Bars haben, um mit zu arbeiten. Warum es wiederholen Wir wollen nur sicher sein, dass unsere EA richtig funktioniert. Es sei darauf hingewiesen, dass während der OnInit-Funktion nur einmal aufgerufen wird, wenn die EA an ein Diagramm angehängt ist, wird die OnTick-Funktion jedes Mal aufgerufen, wenn es ein neues Tick (Preisangebot) gibt. Sie beobachten, dass wir es hier wieder anders gemacht haben. Wir beschließen, die Gesamtstäbe in der Geschichte zu speichern, die wir aus dem Ausdruck in einer neuen Variablen Mybars erhalten haben. Deklariert innerhalb der OnTick-Funktion. Diese Variable ist eine lokale Variable, im Gegensatz zu der Variablen, die wir im Abschnitt INPUT PARAMETERS unseres Codes angegeben haben. Während die Variablen, die im Abschnitt "Eingabeparameter" unseres Codes deklariert wurden, für alle Funktionen verfügbar sind, können innerhalb unseres Codes, die sie benötigen, Variablen, die innerhalb einer einzigen Funktion deklariert sind, begrenzt und für diese Funktion allein verfügbar sein. Es kann nicht außerhalb dieser Funktion verwendet werden. Als nächstes haben wir einige Variablen von MQL5-Strukturtypen deklariert, die in diesem Abschnitt unserer EA verwendet werden. MQL5 hat eine ganze Reihe von Bauwerken, die die Dinge für EA-Entwickler ganz einfach macht. Lass uns die Strukturen nacheinander nehmen. Dies ist eine Struktur für die Speicherung der neuesten Preise von Symbolen verwendet. Struct MqlTick datetime time Zeit der letzten preise update double bid Aktueller Gebotspreis double ask Aktueller Ask-Preis doppelt letzter Preis des letzten Deals (Letztes) ulong Volumen Volumen für den aktuellen Letzten Preis Jede Variable, die für den MqlTick-Typ erklärt wurde, kann leicht sein Verwendet, um die aktuellen Werte von Ask, Bid, Last und Volume zu erhalten, sobald Sie die Funktion SymbolInfoTick () aufgerufen haben. So erklärten wir den aktuellen Preis als MqlTick-Typ, so dass wir ihn nutzen konnten, um die Ask - und Bid-Preise zu erhalten. Diese Struktur wird verwendet, um alle Handelsanforderungen für einen Handelsbetrieb durchzuführen. Es enthält in seiner Struktur alle Felder, die für die Durchführung eines Handelsabkommens erforderlich sind. Struct MqlTradeRequest ENUMTRADEREQUESTACTIONS Aktion Handel Betrieb Typ ulong Magie Expert Advisor ID (Magic Number) ulong Auftrag Order Ticket String Symbol Handel Symbol Doppelvolumen Angefordertes Volumen für einen Deal in Lose doppelten Preis Preis Double Stoplimit StopLimit Ebene der Bestellung double sl Stop Loss Level der Bestellen double tp Take Profit Level der Bestellung ulong Abweichung Maximal mögliche Abweichung vom angeforderten Preis ENUMORDERTYPE Typ Auftragsart ENUMORDERTYPEFILLING Artfilling Auftragsausführung Typ ENUMORDERTYPETIME typetime Auftrag Ausführungszeit datetime Ablauf Ablauf Ablaufzeit (für die Bestellungen von ORDERTIMESPECIFIED Typ) String Kommentar Order comment Any Variable, die von der MqlTradeRequest-Art deklariert wurde, kann verwendet werden, um Aufträge für unsere Handelsoperationen zu senden. Hier erklärten wir als mqlTradeRequest-Typ mpequest. Das Ergebnis eines Handelsvorgangs wird als spezielle vordefinierte Struktur des MqlTradeResult-Typs zurückgegeben. Jede Variable, die als MqlTradeResult-Typ deklariert ist, kann auf die Handelsanforderungsergebnisse zugreifen. Struct MqlTradeResult uint retcode Operation return code ulong deal Deal ticket, wenn es durchgeführt wird ulong bestellen Bestellen ticket, wenn es platziert doppeltes Volumen Deal Volumen, bestätigt durch Broker doppelter Preis Deal Preis, bestätigt durch Broker doppelte Gebot Aktuelle Bid Preis doppelte Frage Aktuelle Ask Preis-String-Kommentar Broker-Kommentar zum Betrieb (standardmäßig wird er durch die Betriebsbeschreibung gefüllt) Der Preis (Open, Close, High, Low), die Zeit, die Volumes jeder Leiste und die Spread für ein Symbol werden in dieser Struktur gespeichert. Jedes Array, das von der Mql-Ports-Art deklariert wurde, kann verwendet werden, um den Preis, die Volumina und die Spread-Historie für ein Symbol zu speichern. Struct Mql Plätze datetime Zeit Zeitraum Startzeit doppelt offen Offener Preis doppelt hoch Der höchste Preis der Periode doppelt so niedrig Der niedrigste Preis der Periode doppelt schliessen Schliessen Preis lang Tickvolume Tick Volumen int verbreiten Langfristig realvolumen Handelsvolumen Hier haben wir ein Array gemeldet Wird verwendet, um diese Informationen zu speichern. Als nächstes entscheiden wir, alle Arrays zu setzen, die wir verwenden werden, um Bars Details als Serie zu speichern. Damit soll sichergestellt werden, dass die Werte, die in die Arrays kopiert werden, wie die Zeitreihen indiziert werden, also 0, 1, 2, 3 (entsprechend dem Balkenindex), also verwenden wir die ArraySetAsSeries () - Funktion ArraySetAsSeries (void array Array nach Referenzbool gesetzt true bedeutet umgekehrte Reihenfolge der Indizierung) Es sollte beachtet werden, dass dies auch einmal im Initialisierungsbereich unseres Codes erfolgen kann. Allerdings habe ich mich entschlossen, es an dieser Stelle zu zeigen Unsere Funktion dauert zwei Argumente Diagramm-Symbol und die MqlTick-Struktur-Variable (neueste Preis ).Wenn es Fehler gibt, haben wir es gemeldet. Als nächstes kopierten wir die Informationen über Die letzten drei Takte in das Mqlrates-Array mit der Funktion "CopyRates". Die Funktion "CopyRates" wird verwendet, um die Verlaufsdaten der Mql-Pfadstruktur eines bestimmten Symbol-Zeitraums in der angegebenen Menge in ein Mql-Pfad-Array zu übernehmen. Symbolname ENUMTIMEFRAMES Zeitrahmen. Zeitraum int startpos Startposition int zählen. Datenzählung zum Kopieren von Mql-Kursen Ratearray-Ziel-Array zum Kopieren) Der Symbolname wird mit Hilfe des Symbols erhalten. Der aktuelle Zeitraum wird durch die Verwendung der Periode erreicht. Für die Startposition starten wir von der aktuellen Bar, Bar 0 und wir zählen nur drei Bars, Bars 0, 1 und 2. Das Ergebnis wird in unserem Array gelagert werden. Das Matrizen-Array enthält nun den ganzen Preis, die Zeit, die Volumina und die Spread-Informationen für die Takte 0. 1 und 2. Um die Details einer Bar zu erhalten, werden wir folgendes verwenden: Zum Beispiel können wir die folgenden Informationen über jede Leiste haben : Mrate1.time bar 1 Startzeit mrate1.open Bar 1 Offener Preis mrate0.high Bar 0 (aktueller Bar) hoher Preis, etc. Als nächstes haben wir alle Indikatorwerte in die dynamischen Arrays kopiert, die wir mit der CopyBuffer-Funktion deklariert haben. Int copyBuffer (int indicatorhandle, Indikatorhandle int buffernum, Indikatorpufferzahl int startpos, Startposition int count, Betrag zum Kopieren von Doppelpuffer Zielgruppe zum Kopieren) Der Indikatorhandle ist der Handle, den wir im OnInit Abschnitt erstellt haben. In Bezug auf Pufferzahlen hat der ADX-Indikator drei (3) Puffer: Der Moving Average Indikator hat nur einen (1) Puffer: Wir kopieren von der aktuellen Leiste (0) in die letzten zwei Takte. Die Anzahl der zu kopierenden Aufzeichnungen beträgt 3 (Stäbe 0, 1 und 2). Der Puffer ist die Ziel-Dynamik-Arrays, die wir früher adxVal, plsDI, minDI und maVal erklärt hatten. Wie Sie hier wieder sehen können, versuchen wir, irgendwelche Fehler zu erfassen, die beim Kopieren auftreten können. Wenn es einen Fehler gibt, muss man nicht weiter gehen. Es ist wichtig zu beachten, dass die Funktion CopyBuffer () und Copy Copy () die Gesamtzahl der auf den Erfolg kopierten Datensätze zurückgibt, während sie -1 einen Fehler zurückgibt. Aus diesem Grund prüfen wir hier in den Fehlerprüffunktionen einen Wert kleiner als 0 (Null). An dieser Stelle wollen wir überprüfen, ob wir bereits eine Kauf - oder Verkaufsposition eröffnet haben, um Worte zu bestellen, wir wollen sicherstellen, dass wir nur einen Kauf oder Kaufhandel eröffnet haben. Wir wollen nicht einen neuen Kauf eröffnen, wenn wir schon einen haben, und wir wollen keinen neuen Verkauf eröffnen, wenn wir schon einen geöffnet haben. Um zu erreichen, werden wir zunächst zwei bool-Datentyp-Variablen (Buyopened und Sellopened) deklarieren, die einen TRUE-Wert halten, wenn wir bereits eine Position für den Kauf oder Verkauf haben. Wir verwenden die Handelsfunktion PositionSelect, um zu wissen, ob wir eine offene Position haben. Diese Funktion gibt TRUE zurück, wenn wir eine Position bereits geöffnet haben und FALSE, wenn wir keine haben. Es dauert, wie das große Argumentparameter, das Symbol (Währungspaar), das wir überprüfen wollen. Hier verwenden wir das Symbol, weil wir das aktuelle Symbol (Währungspaar) überprüfen. Wenn dieser Ausdruck TRUE zurückgibt, dann wollen wir überprüfen, ob die Position ein Kauf oder ein Verkauf ist. Wir verwenden dazu die Funktion PositionGetInteger. Es gibt uns die Art der Position geöffnet, wenn wir es mit dem POSITIONTYPE Modifikator verwenden. Es gibt die Positionstypkennung zurück, die entweder POSITIONTYPEBUY oder POSITIONTYPESELL sein kann. In unserem Fall haben wir es verwendet, um festzustellen, welche Position wir bereits geöffnet haben. Wenn es ein Verkauf ist, speichern wir einen TRUE-Wert in Sellopened und wenn es ein Buy ist, speichern wir einen TRUE-Wert in Buyopened. Wir werden diese beiden Variablen später verwenden können, wenn wir nach unseren Käufern nach Sell - oder Buy-Bedingungen suchen. Es ist jetzt Zeit, den engen Preis für die Bar zu speichern, die wir für unser BuySell-Setup verwenden werden. Denken Sie daran, dass wir eine Variable für das früher erklärt haben. Wir werden nun mit dem nächsten Schritt fortfahren. Es ist nun an der Zeit, die Gelegenheit zu prüfen. Lassen Sie uns den obigen Ausdruck analysieren, da er die Strategie darstellt, die wir früher entworfen haben. Wir erklären eine Bool-Typ-Variable für jede unserer Bedingungen, die erfüllt sein müssen, bevor eine Bestellung platziert werden kann. Eine Bool-Variable kann nur TRUE oder FALSE enthalten. Also, unsere Buy-Strategie wurde in vier Bedingungen unterteilt. Wenn eine der Bedingungen erfüllt oder erfüllt ist, wird ein Wert von TRUE in unserer Variable bool gespeichert, andernfalls wird ein Wert von FALSE gespeichert. Schauen wir sie eins nach dem anderen an. Hier sehen wir die MA-8 Werte auf Bars 0, 1 und 2. Wenn der Wert von MA-8 auf dem aktuellen Balken größer als sein Wert auf dem vorherigen Balken 1 ist und auch der MA-8-Wert auf Bar 1 größer als sein Wert auf Bar 2 ist. Es bedeutet, dass MA-8 nach oben zunimmt. Dies erfüllt eine unserer Bedingungen für ein Buy Setup. Dieser Ausdruck prüft, ob Bar 1 Close-Preis höher ist als der Wert von MA-8 im selben Zeitraum (Bar 1 Periode). Wenn der Preis höher ist, dann ist auch unsere zweite Bedingung erfüllt, dann können wir auf andere Bedingungen achten. Allerdings, wenn die beiden Bedingungen, die wir gerade betrachtet haben, nicht erfüllt sind, dann gibt es keine Notwendigkeit, andere Bedingungen zu überprüfen. Deshalb beschließen wir, die nächsten Ausdrücke innerhalb dieser beiden Anfangsbedingungen (Ausdrücke) einzuschließen. Nun wollen wir überprüfen, ob der aktuelle Wert von ADX (ADX-Wert auf Bar 0) größer ist als der in den Eingabeparametern deklarierte Minimum-ADX-Wert. Wenn dieser Ausdruck wahr ist, dh der aktuelle Wert von ADX größer als der minimal erforderliche Wert ist, wollen wir auch sicher sein, dass der plusDI-Wert größer als der minusDI-Wert ist. Dies ist, was wir im nächsten Ausdruck erreicht haben Wenn alle diese Bedingungen erfüllt sind, das heißt, wenn sie wahr sind, dann wollen wir sicher sein, dass wir keine neue Kaufposition öffnen, wenn wir bereits einen haben. Es ist jetzt Zeit, den Wert der Buyopened Variable zu überprüfen, die wir früher in unserem Code deklariert haben. Wenn Buyopened wahr ist, wollen wir keine andere Kaufposition öffnen, also zeigen wir eine Warnung an, uns zu informieren und dann zurückzukehren, damit unsere EA nun auf den nächsten Tick warten wird. Allerdings, wenn Buyopened ist FALSE, dann bereiten wir unsere Datensätze mit der MqlTradeRequest Typ Variable (mrequest), die wir früher erklärt, um unsere Bestellung zu senden. Die Aktion hier, die die Handelsbetriebsart ist, ist TRADEACTIONDEAL, weil wir eine Handelsordnung für eine sofortige Ausführung setzen. Wenn wir eine Bestellung ändern, dann verwenden wir TRADEACTIONMODIFY. Um eine Bestellung zu löschen, verwenden wir TRADEACTIONREMOVE. Wir haben unsere MqlTick Art neuesten Preis, um die neuesten Ask Preis zu bekommen. Der Auftrag Stop-Loss-Preis wird durch die Subtraktion unserer StopLoss in Punkten aus dem Ask-Preis erhalten, während die Bestellung Gewinn Gewinn erhalten wird, indem Sie unsere TakeProfit in Punkte auf den Ask-Preis. Sie werden auch beobachten, dass wir die NormalizeDouble-Funktion für den Ask-Preis, die StopLoss - und TakeProfit-Werte verwendet haben. Es ist eine gute Praxis, diese Preise immer auf die Anzahl der Ziffern des Währungspaares zu normalisieren, bevor sie an den Handelsserver gesendet werden. Das Symbol ist das aktuelle Symbol (Symbol oder Symbol ()). Die Auftragsart ist die Art der Bestellung, die wir platzieren, hier stellen wir eine Bestellung bestellen ORDERTYPEBUY. Für eine Verkaufsbestellung wird es ORDERTYPESELL sein. Die Auftragsabfüllung ist die Auftragsausführungsart ORDERFILLINGFOK bedeutet, dass der Deal ausschließlich mit einem bestimmten Volumen zum gleichen oder besseren Preis ausgeführt werden kann als der angegebene Preis. Wenn auf dem Bestellsymbol keine ausreichenden Mengen an Angeboten vorhanden sind, wird die Bestellung nicht ausgeführt. Die OrderSend () - Funktion übernimmt zwei Argumente, die Variable MqlTradeRequest und die Variable MqlTradeResult type. Wie Sie sehen können, haben wir unsere Variable MqlTradeRequest und die Variable MqlTradeResult verwendet, um unsere Bestellung mit OrderSend zu platzieren. Nachdem wir unsere Bestellung gesendet haben, verwenden wir nun die Variable MqlTradeResult, um das Ergebnis unserer Bestellung zu überprüfen. Wenn unsere Bestellung erfolgreich durchgeführt wird, wollen wir informiert werden, und wenn nicht, wollen wir auch wissen. Mit dem MqlTradeResult Typ Variable mresult können wir auf den Operation Return Code und auch die Order Ticket Nummer, wenn die Bestellung platziert wird. Der Rückgabewert 10009 zeigt an, dass die OrderSend-Anfrage erfolgreich abgeschlossen wurde, während 10008 zeigt, dass unsere Bestellung eingegangen ist. Deshalb haben wir auf einen dieser beiden Rückkehrcodes überprüft. Wenn wir irgendwelche von ihnen haben, sind wir sicher, dass unsere Bestellung abgeschlossen ist oder es wurde platziert. Um auf eine Sell Opportunity zu überprüfen, prüfen wir das Gegenteil von dem, was wir für Buy Opportunity getan haben, außer für unseren ADX, der größer sein muss als der angegebene Minimalwert. So wie wir es in der Kaufabteilung getan haben, erklären wir für jede unserer Bedingungen eine Bool-Variable, die erfüllt sein muss, bevor ein Auftrag erteilt werden kann. Eine Bool-Variable kann nur TRUE oder FALSE enthalten. So wurde unsere Verkaufsstrategie in vier Bedingungen unterteilt. Wenn eine der Bedingungen erfüllt oder erfüllt ist, wird ein Wert von TRUE in unserer Variable bool gespeichert, andernfalls wird ein Wert von FALSE gespeichert. Schauen wir sie eins nach dem anderen an, wie wir es für den Buy-Bereich getan haben. Hier sehen wir die MA-8 Werte auf Bars 0, 1 und 2. Wenn der Wert von MA-8 auf dem aktuellen Balken kleiner als sein Wert auf der vorherigen Leiste 1 ist und auch der MA-8-Wert auf Bar 1 kleiner als sein Wert auf Bar 2 ist. Es bedeutet, dass MA-8 nach unten abnimmt. Dies erfüllt eine unserer Bedingungen für einen Verkauf. This expression is checking to see if Bar 1 Close price is lower than the value of MA-8 at the same period (Bar 1 period). If the price is lower, then our second condition has also been satisfied, then we can check for other conditions. However, if the two conditions we have just considered were not met, then there will be no need to check other conditions. That is why we decide to include the next expressions within these two initial conditions (expressions). Now we want to check if the current value of ADX (ADX value on Bar 0) is greater than the Minimum ADX value declared in the input parameters. If this expression is true, that is, the current value of ADX is greater than the Minimum required value we also want to be sure that the MinusDI value is greater than the plusDI value. This is what we achieved in the next expression If these conditions are met, that is, if they return true, then we want to be sure that we do not open a new Buy position if we already have one. It is now time to check the value of the Buyopened variable we declared earlier in our code. If Sellopened is true, we do not want to open another Sell position, so, we display an alert to inform us and then return so that our EA will now wait for the next Tick. However, if Sellopened is FALSE, then we setup our Sell trade request as we did for Buying order. The major difference here is the way we calculated our stop loss price and take profit price. Also since we are selling, we sell at the Bid price that is why we used our MqlTick type variable latestprice to get the latest bid price. The other type here, as explained earlier, is ORDERTYPESELL. Also here, we used the NormalizeDouble function for the Bid price, the StopLoss and TakeProfit values, it is good practice to always normalize these prices to the number of digits of currency pair before sending it to the trade server. Just as we did for our Buy order, we must also check if our Sell order is successful or not. So we used the same expression as in our Buy order. 3. Debugging and Testing our Expert Advisor At this point, we need to test our EA to know it our strategy works or not. Also, it is possible that there are one or two errors in our EA code. This will be discovered in the next step. Debugging our code helps us to see how our code performs line by line (if we set breakpoints) and there and then we can notice any error or bug in our code and quickly make the necessary corrections before using our code in real trade. Here, we are going to go through the step by step process of debugging our Expert Advisor, first of all, by setting breakpoints and secondly, without breakpoints. To do this, Make sure you have not closed the Editor. First of all, let us select the chart we want to use to test our EA. On the Editor Menu bar, click on Tools and click on Options as shown below: Figure 8. Setting Debugging options Once the Options window appears, select the currency pair, and the periodtimeframe to use and click the OK button: Before we start the debugger, let us set breakpoints. Breakpoints allow us to monitor the behaviorperformance of our code at certain selected locations or lines. Rather than running through all the code at once, the debugger will stop whenever it see a breakpoint, waiting for your net action. By this we will be able to analyze our code and monitor its behavior as it reaches every set break-points. We will also be able to evaluate the values of some of our variables to see if things are actually the way we envisaged. To insert a breakpoint, go to the line in your code where you want to set the breakpoint. By the left hand side, on the gray field near the border of the code line, double-click and you will see a small round blue button with a white square inside it. Or on the alternative, place the cursor of your mouse anywhere on the code line where you want the breakpoint to appear and press F9 . To remove the breakpoint, press F9 again or double-click on it. Figure 10. Setting a breakpoint For our code, we are going to set breakpoint on five different lines. I will also label them form 1 to 5 for the sake of explanation. To continue, set breakpoint at the seven code lines as shown in the figure below. Breakpoint 1 is the one we have created above. Figure 11. Setting additional breakpoints Once we have finished setting our breakpoints, we are now set to start debugging our code. To start the debugger, press F5 or click the green button on the Toolbar of the MetaEditor: Figure 12. Starting the Debugger The first thing the editor does is to compile the code, if there is any error at the point, it will display it and if no error, it will let you know that the code compiled successfully. Figure 13. Compilation Report Please note that the fact that the code compiled successfully does not mean there may not be errors in your code. Depending on how your code is written, there may be runtime errors. For example, if any of our expressions does not evaluate correctly due to any little oversight, the code will compile correctly but may not run correctly. Too much of the talk, lets see it in action Once the debugger has finished compiling the code, it takes you to the trading terminal, and attach the EA to the chart you have specified on the MetaEditor Options settings. At the same time, it shows you the Input parameters section of the EA. Since we are not adjusting anything yet, just click the OK button. Figure 14. Expert Advisor Input Parameters for Debugging You will now see the EA clearly on the top-right hand corner of the chart. Once it starts the OnTick() . it will stop as soon as it gets to our breakpoint 1. Figure 15. Debugger stops at the first breakpoint You will notice a green arrow at that code line. That tells you that previous code line had been executed we are now ready to execute the present line. Let me make some explanations before we proceed. If you look at the Editors Tool Bar, you will observe that the three buttons with curved arrows which were earlier grayed out are now activated. This is because we are now running the debugger. These buttonscommands are used to step through our code (Step into, Step over or Step out) Figure 16. Step into command The Step Into is used to go from one step of the program execution into the next step, entering into any called functions within that code line. Click on the button or press F11 to invoke the command. (We will use this command in our Step-by-Step debugging of our code.) Figure 17. Step over command The Step over . on the other hand does not enter into any called function within that code line. Click on the button or press F10 to invoke the command Figure 18. Step out command To execute a program step that is one level higher, you click this button or press ShiftF11 . Also, at the lower part of the Editor, you will see the Toolbox window . The Debug tab in this window has the following headings: File : This displays the name of the file been called Function : This displays the present function from the file been called Line : This displays the number of the code line in the file from which the function is called. Expression : This is where you can type the name of any expressionvariable you are interested in monitoring from our code. Value : This will display the value of the expressionvariable we typed at the Expression area. Type : This will display the data type of the expressionvariable been monitored. Back to our debugging process The next thing we want to do is now to type in the variablesexpressions from our code that we are interested in monitoring. Make sure you only monitor the variablesexpressions that really matters in your code. For our example, we will monitor the following: OldTime (old bar time) NewTime0 (current bar time) IsNewBar (flag that indicates the new bar) Mybars (Total bars in History) Our EA depends on it You can add other ones like the ADX values, the MA-8 values, etc. To add the expressionvariable, double-click under the Expressions area or right-click under the Expressions area and select Add as shown in the figure above. Type the expressionvariable to monitor or watch. Figure 19. The expressions watching window Type all the necessary variablesexpressions Figure 20. Adding expressions or variables to watch If the variable hasnt been declared yet, its type is Unknown identifier (except the static variables). Now, lets move on Figure 21. Step into command in action Click the Step into button or press F11 and observe what happens. Keep on pressing this button or F11 until you get to breakpoint no 2 . continue until you get to breakpoint no 4 as shown below and observe the expressions watching window. Figure 22. Watching the expressions or variables Figure 23. Watching the expressions or variables Figure 24. Watching the expressions or variables Once there is a new tick, it will return to the fist code line of the OnTick() function. And all the values of our variablesexpression will now be reset because this is a new tick except if any of them is declared as a static variable. In our case we have one static variable OldTime. Figure 25. Values of variables on NewTick event To go over the process again, continue pressing the F11 key and keep monitoring the variables at the expressions watching window. You can stop the debugger and then remove all the breakpoints. As we see, in Debug mode it prints the message We have new bar here. . Figure 26. Expert Advisor prints the message in Debug mode Start the debugging process again but this time without breakpoints. Keep watching at every tick and if any of our BuySell condition is met, it will place a trade and since we have written our code to tell us if an order is placed successful or otherwise, we will see an alert. Figure 27. Expert Advisor places trade during debugging I think you can leave the EA to work for a few more minutes while you take a coffee. Once you are back and you have made some money ( just kidding ), then click the STOP (Red) button on the MetaEditor to stop debugging. Figure 28. Stopping the debugger What we have actually done here is to see that our EA only checks for a trade at the opening of a new Bar and that our EA actually works. There is still a lot of room for adjustments to our EA code. Let me make it clear, at this point that, the Trading terminal must be connected to the internet, otherwise, debugging will not work because the terminal will not be able to trade. 3.2 TESTING OUR EA STRATEGY At this point we now want to test our EA using the Strategy Tester built into the Trading Terminal. To start the Strategy Tester, press CONTROLR or click the View menu on the Terminal Menu Bar and click on Strategy Tester as shown below Figure 26. Starting the Strategy Testing The Tester (Strategy Tester) is shown at the lower part of the terminal. For you to see all the Testers settings, you need to expandresize it. To do this, move your mouse pointer to the point shown by the red arrow (as shown below) Figure 27. The Strategy Tester window The mouse pointer changes to a double-end arrow, hold down the mouse and drag the line upwards. Stop when you discover that you can see everything on the settings tab. Figure 28. The Strategy Tester Settings Tab Select the EA you want to test Select the Currency pair to use for the test Select the PeriodTimeframe to use for the test Select Custom Period and set the dates in 5 Set the dates for the custom period to be used for the test Execution is Normal Select the deposit amount in USD to be used for the test Set Optimization to Disable (We are not optimizing now, we just want to test) Click this button when you are ready to start test. Before we click the Start button, lets look at the other tabs on the Tester The processor used by the Tester for the Test. Depending on your Computers processor type. Mine is only one (1) core processor. Figure 29. The Strategy Tester Agents tab Once the agent, you will see something similar to the figure below Figure 30. The Strategy Tester Agents tab during a test This is where all the events going on during the test period is displayed Figure 31. The Strategy Tester Journal tab showing trade activities This is where you can specify the input parameters for the EA. Figure 32. The Strategy Tester Inputs tab If we are optimizing our EA, then we will need to set the values in the circled area. The Start is the values you want the Tester to begin with. The Step is the increment rate for the value you selected, and The Stop is the value at which the Tester will stop incrementing the value for that parameter. However, in our case we are not optimizing our EA, so we will not need to touch that for now. Once everything is set, we now go back to the Settings tab and click the Start button. Then the tester begins its work. All you need to do now is to go and take another cup of coffee if you like, or, if you are like me, you may want to monitor every event, then turn to the Journal tab. Once you begin to see messages about orders been sent on the Journal Tab, you may then wish to turn to a NEW tab named Graph which has just been created. Once you switch to the Graph tab, you will see the graph keep on increasing or decreasing as the case may be depending on the outcome of your trades. Figure 33. The graph result for the Expert Advisor Test Once the test is completed, you will see another tab called Results . Switch to the Results tab and you will see the summary of the test we have just carried out. Figure 34. The Strategy Tester Results tab showing test results summary You can see the total Gross Profit, Net Profit, total trades total loss trades and many more. Its really interesting to see that we have about USD 1,450.0 within the period we selected for our test. At least we have some profit. Let me make something very clear to you here. You will discover that the settings for the EA parameters that you see in the Strategy tester is different from the initial settings in the Input parameters of the EA. I have just demonstrated to you that you can change any of those input parameters to get the best out of your EA. Instead of using a period of 8 each for the Moving Average and ADX, I changed it to 10 for Moving Average and 14 for ADX. I also change the Stop Loss from 30 to 35. Last but not the least, I decided to use 2 Hour timeframe. Remember, this is the Strategy Tester. If you want to view a complete report of the test, then right-click on anywhere in the Results tab, you will see a menu. From this menu, Select Save as Report . Figure 35. Saving the result of the test The save dialog window will appear, type a name for your report (if you want, otherwise leave the default name) and click the save button. The whole report will be saved in HTML format for you. To view the chart for the test that was carried out, click Open Chart and you will see the chart displayed Figure 36. The chart showing the test Thats it, we have successfully written and tested our EA and we now have a result to work with. You can now go back to the strategy tester Settings tab and make the test for other TimeframesPeriod. I want you to carry out the test using different currency pairs, different timeframes, different Stop Loss, different Take profit and see how the EA performs. You can even try new Moving Average and ADX values. As I said earlier, that is the essence of the Strategy tester. I will also like you to share your results with me. Conclusion In this step by step guide, we have been able to look at the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. We have also looked at how we check our EA for errors using the debugger. We also discussed how to test the performance of our EA using the Strategy Tester. With this, we have been able to see the power and robustness of the new MQL5 language. Our EA is not yet perfect or complete as many more adjustments must still be made in order to used it for real trading. There is still more to learn and I want you to read the article over again together with the MQL5 manual, and try everything you have learn in this article, I can assure you that you will be a great EA developer in no distant future. Forex Expert Advisor Inexperienced beginners are always interested in finding a trade robot that does all the work, so that the trader does not have to lift a finger. This idea has been pursued by all traders of the computer age. The burden of responsibility for decision making, which wears out a traders nerves, now falls squarely on the trading forex expert advisors. What is a Forex Expert Advisor The forex expert advisor is a program capable of performing in the terminal any action following the instructions of a trader, without his direct involvement. All tasks are performed automatically or mechanically, which is why the advisors are called experts or mechanical trading systems (MTS). Simply put, this is a program sending applications to a broker without any intervention on the part of the trader. You install a profit forex expert advisor to the existing forex online trading platform, which is connected to the server broker, adjust all the settings, and the advisor will begin trading according to a preset strategy. Benefits of Forex Expert Advisors From a psychological point of view, the forex expert advisor is irreplaceable. A trader decreases the responsibility for decision-making, and the trades become less stressful. The trader does not need to have an in-depth knowledge of technical and fundamental analysis, since all the calculations are already included in the program. Besides, the advisor is able to handle the trading signals even when the trader is absent from the workplace. Writing An Forex Expert Advisor Forex Expert Advisors for MetaTrader4 are written in the MQL4 programming language. This language was developed by the manufacturer of the trading terminal specifically for writing expert advisors. It allows the trader to program the trading system without any difficulty, which will trade in online mode day and night. Programmers familiar with this language will not have any difficulty in doing the job. For ordinary users this will be a more difficult task. Forex Expert Advisors Indicators You can create your own technical indicators for more effective work by the advisors. They will be a great addition to the existing indicators in the MetaTrader4 terminal. The purpose of using advisors indicators is to implement analytic functions and generate trading signals. Built-in And Own Forex Expert Advisors The MetaTrader4 trading terminal has several built-in expert advisors. They have the function of an independent trading system and dub the trading signals. They are very popular among beginners and were created specifically to demonstrate the abilities of programming the MetaTrader 4 Client Terminal. The possibilities in creating your own advisor are simply dazzling. You can set various orders by price and time, automatically open the counter orders, etc. These programs are able to replace the trader at their workplace. Testing Forex Expert Advisors The trading terminal can not only write advisors, but also check them on historical data before using, which is another unique feature of using the advisors. Testing is very useful, since it helps to measure the ability and effectiveness of a mechanical trading system on historical data, estimating the chances of future earnings and errors. If you have tested the advisor, and know how it will behave in different market conditions, you can begin trading without needing to intervene. For this purpose, the terminal has a special window where you can also optimize the input parameters of advisors. Parting Words For Beginners Beginners may think that trading with advisors is it very complicated. It is not so. After about a month any trader can begin to program their own automated trading system. Even if you are hesitant about trusting your money to a computer program, you can configure the advisor to five sound alerts, which will greatly facilitate your work so that you spend less time on graphical analysis expecting a signal to open and close positions. You can find lots of advisors on the Internet, but getting a profitable one is very difficult, and using every single one is exhausting and may result in depleting your deposit. That is why you are advised against buying the first advisor you come across. Many advisors demonstrate excellent results when tested on one currency pair, but perform poorly on others. It is better to use the advisor for those instruments that you have tested on. quotVIP clientquot program Get exceptional privileges by joining our VIP program. Erstellen Sie Ihre eigenen Trading Roboter in 5 Minuten, auch wenn Sie donrsquot haben Programmierung Fähigkeiten stock. roboforex Direkter Zugang von 100 USD an die reale Börse. QuotRebates (Cashback) - Programm Handel und erhalten monatliche Rabatte auf Ihr Konto Bis zu 10 auf Kontostand Erhalten Sie zusätzlichen Gewinn für das Handelsvolumen, das Sie machen. Risk Warning There is a high level of risk involved when trading leveraged products such as ForexCFDs. You should not risk more than you can afford to lose, it is possible that you may lose the entire amount of your account balance. Sie sollten nicht handeln oder investieren, es sei denn, Sie verstehen das wahre Ausmaß Ihrer Exposition gegenüber dem Risiko des Verlustes. Wenn Sie handeln oder investieren, müssen Sie immer das Niveau Ihrer Erfahrung berücksichtigen. Copy-trading services imply additional risks to your investment due to nature of such products. If the risks involved seem unclear to you, please apply to an outside specialist for an independent advice. Advanced Guide To MetaTrader 4 - Expert Advisors Expert Advisor Creation Expert Advisors are programs that allow automation of the analytical and trading processes in the MT4 platform. To create an Expert Advisor (or Expert), the expert editing program - MetaEditor - has to be opened from within the MT4 platform. To open the editor (see Figure 1):13 In the Navigator window, right-click on Expert Advisors and select Create or In the Main Menu gt Tools gt MetaQuotes Language Editor or Click on the MetaEditor icon in the Standard Toolbar: or Press F4 on the computer keyboard. 13 13 Figure 1 - There are several ways to open the MetaEditor. 13Any of these actions will open the Expert Creation Wizard. The Wizard can be used to create Expert Advisors, Custom Indicators, Scripts and DLLs. To create an Expert Advisor, select Expert Advisor and click Next to continue, as shown in Figure 2. 13 Figure 2 - MT4s Expert Advisor Wizard is used to create Expert Advisors, Custom Indicators, Scripts and Libraries (DLLs). 13The General Properties of the Expert Advisor window appears. Here, traders must specify the: Name - A user-created name for the Expert. Developer - The developers name. Link - To the developers website, if applicable. Inputs - the list of Expert inputs 13 13To add a new parameter to the Inputs field, press the Add button. For each Parameter, the trader must specify the Name, Type and Initial Value, as shown in Figure 3. To delete a parameter, highlight the parameter and press Delete. These become the Input Variables within the Expert. Once all the inputs have been listed, click Finish to continue.13 Figure 3 - Create the input variables by identifying Name, Type and Initial Value. 13A new window appears in the programming environment. The Experts name appears at the top of the window, and the previously entered input parameters are listed near the top of the code, as shown in Figure 4. 13 Figure 4 - The Expert name and inputs appear in the code window. 13From here, the Expert code can be entered into the window using the MQL4 programming language and syntax (see Figure 5). Note . Specifics regarding programming are outside the scope of this tutorial understanding programming logic and learning a specific language require significant effort. Traders can learn more about programming in the MQL4 environment by reading the MT4 Help Guides and participating in the active MQL4 community forums. MQL4, like other proprietary languages, has a list of Reserved Words and Standard Constants that are used during programming. Examples of constants for trade operations, along with their descriptions, include:13 OPBUY - Buying position OPSELL - Selling position OPBUYLIMIT - Buy limit pending position OPSELLLIMIT - Sell limit pending position OPBUYSTOP - Buy stop pending position OPSELLSTOP - Sell stop pending position 13 13 Figure 5 - part of the code for an Expert Advisor. Certain words have predefined uses here, OPSELL instructs the computer to sell if other criteria are met ( if statements). Traders can find a MQL4 Reference in the Help tab of the Toolbox in the MetaEditor window. This Reference includes information that is helpful to beginner and experienced programmers including: Expert Advisor Compiling After the Expert development has been completed, it must be compiled in order to ensure that the code has been written in the proper format needed to run the Expert. To compile the Expert: Select File gt Compile (see Figure 6) or Click the Compile button on the toolbar or Press F5 on the computer keyboard. 13 13Once compiling has been initiated, an update appears in the Toolbox beneath the code in the MetaEditor window, as shown in Figure 6. An errors or warnings will be listed.13 Figure 6 - Successful compiling with zero errors and zero warnings. 13After successful compilation, the new Expert will appear in the Navigator - Expert Advisors window, as shown in Figure 7. If the Expert did not compile successfully, it will still appear but its icon will be gray and the Expert cannot be used. 13 Figure 7 - The new Expert now appears in the Navigator-Expert Advisors window. Expert Advisor Setup Before the Expert can be used, its parameters must be defined in the Terminal Settings window. So öffnen Sie das Fenster: 13 Im Hauptmenü gt Werkzeuge gt Optionen oder Drücken von CTRL O auf der Computertastatur. Either action will open the Options window. Select the Expert Advisors tab, as shown in Figure 8. 13 Figure 8 - Select the Expert Advisors tab in the Options window to define an Experts parameters. 13 13The following settings are available in the Expert Advisors tab: Enable Expert Advisors - this option allows the user to enable (check) or disable (uncheck) the use of all Experts. Disable experts when the account has been changed - this option disables the Expert if the account has been changes, such as from a demo to a live account. Disable experts when the profile has been changed - this option prevents Experts from launching if the profile has changed. Allow live trading - to enable Experts in real-time mode (rather than testing an Expert on historical data). Fragen Sie manuelle Bestätigung - um eine Bestätigung der Ware vor der Einreichung der Bestellung zu senden. DLL-Importe zulassen - DLLs verwenden, um die Funktionalität von Experten zu verbessern. Bestätigen Sie die DLL-Funktionsaufrufe - um die Kontrolle über die Ausführung jeder aufgerufenen Funktion zu ermöglichen. Erlaube externe Expertenimporte - damit der Experte auf Funktionen von anderen Experten oder MQL4-Bibliotheken zugreifen kann. 13 13Once the selections have been made, click OK to close the window. Expert Advisor Launch 13 After the Expert has been created and setup, it is ready to be launched. To launch an Expert: 13 Right-click on the Expert in the Navigator - Expert Advisors window and select Attach to a chart or13 Double-click on the Expert in the Navigator - Expert Advisors window or13 Drag-and-drop the Expert to the desired chart.13 13A window appears with Common and Inputs tabs, as shown in Figure 9. Review the settings in each tab and make any necessary changes, and then click OK to attach the Expert to the active price chart.13 Figure 9 - Make any changes to the Common and Inputs tabs before attaching the Expert to the active price chart. 13The Expert will now be attached to the price chart. Its name will appear in the upper right-hand corner of the chart. The Experts name will be followed by a smiley face, as shown in Figure 10, if live trading is enabled. Otherwise, the Experts name will appear with a frowny face, a dagger after the name indicates that all experts are disabled. 13 Figure 10 - An Expert with a smiley face indicates that live trading has been enabled. 13The Expert is now ready to begin analytical and trading functions. Expert Advisor Shutdown To shut down an Expert, it has to be removed from the chart. To remove an Expert, right-click on the active price chart, select Expert Advisors and then Remove, as shown in Figure 11. 13 Figure 11 - To remove an Expert, right-click the active price chart, select Expert Advisors from the drop-down menu, and then select Remove. Notes About Expert Advisors All Experts are shutdown if the Terminal is closed. If a chart is closed, the Expert attached to the chart will shut down as well. Adding another Expert to a chart will remove the previous one (a confirmation appears). Deleting the Expert from the Navigator window does not shut down an Expert of the same name on an active price chart. 13 13SEE: Trading Systems CodingWriting a Forex Expert Advisor Forex Expert Advisors for MetaTrader4 are written in the MQL4 software design language. This linguistic was industrialized by the constructor of the trading fatal definitely for writing forex ea . It permits the trader to plug-in the trading structure without any struggle, which will trade in online style day and night. Computer operator familiar with this linguistic will not have any trouble in doing the job. For normal users this will be an extra trying job. Forex Expert Generator is an instrument with which you can produce your own forex expert advisor for your strategy. You need to have at least MQL4 software design knowledge to use this tool. MQL4 is the software designing language that is rummage-sale to write forex expert advisors . If you are a single designer and would comparable to view the MQL4 code also for the forex ea you made, you must to purchase expert edition single certificate which is 139. If you purchase the normal edition you cannot interpretation the program. I accepted the expert version single certificate and after emerging my forex expert advisor I usually copy the code and paste it in the MQL 4 publishing superior and save it with some name, collect it and back trial it. This is a very easy tool as you dont actually essential to write the code but use the lumps on the left hand side and make your forex expert advisor . Once you collect it if there any mistakes you can see those mistakes below the Compilation tab at the lowest. If there are no mistakes you can vision the code below the tab Source Code . MT4 Expert Advisor Programming If you are a Forex trader and are in need of an experienced programmer to convert your trading strategy into an Expert Advisor (EA) then you have come to the right place. We would be happy to consider your idea and have the experience and knowledge to make it happen. Fühlen Sie sich frei, uns jederzeit zu kontaktieren.


No comments:

Post a Comment