Expert Advisor Programmierung für den MetaTrader in MQL4
Automatisierter Handel durch Expert Advisors Profitables Trading basiert in der Regel auf einer Strategie, welche Kriterien vorgibt, die ein Markt erfüllen muss, damit Sie einen Trade öffnen oder schließen. Völlig egal, wie diese Strategie nun aussieht, ob Sie komplex oder einfach gestrickt ist, es kostet immer Zeit sie umzusetzen. Wäre es nicht ungemein praktisch, wenn ein Programm diese Aufgabe übernehmen würde? Programmierung in MQL4 Der MetaQuotes Language Editor bietet dem Trader die Möglichkeit, so ziemlich jeden beliebigen Indikator oder Expert Advisor selbst zu erstellen, gewisse Programmierkenntnisse vorausgesetzt. Der Editor befindet sich im MetaTrader unter „Extras -> MetaQuotes Language Editor“ (Shortcut: F4). In gewohnter Manier kann man bequem über „Datei -> Neu“ eine Schablone auswählen. Wir beschränken uns in diesem Artikel auf Expert Advisor und Indikatoren. Wo liegt der Unterschied? Abgesehen von einigen Kleinigkeiten, im Grunde nur darin, dass der Expert Advisor Positionen managen darf, während der Indikator nur als Informationsquelle dient. Bevor wir anfangen, ein Wort der Warnung: Ein Expert Advisor hat volle Kontrolle über Ihr Handelskonto, nutzen Sie den erstellen EA deshalb niemals auf einem Echtgeldkonto, bevor Sie ihn nicht ausgiebig getestet haben. Aller Anfang ist schwer Erfahrungsgemäß programmiert es sich wesentlich angenehmer, wenn man ein Konzept parat hat. Nehmen Sie sich zunächst Stift und Papier und erstellen Sie einen Plan, wie der Expert Advisor arbeiten soll: Welche Parameter sollen veränderbar sein? Welche Kriterien soll der EA überwachen? Wann soll er aktiv sein? Wie viele Positionen soll er eröffnen? Sollen Positionen im Nachhinein modifiziert werden und wenn ja, wann und wie? Diese Liste können Sie beliebig fortsetzen, je mehr Details Sie planen, desto zielstrebiger ist das Programmieren. Programmieren mit Struktur Je größer oder umfangreicher das Programm wird, desto unübersichtlicher wird der Code. Daher ist es wichtig bereits zu Beginn einer festen Struktur zu folgen. Das nachfolgende Beispiel soll verdeutlichen, wie ein Code aufgebaut werden kann. Wir wählen die Schablone „Expert Advisor“, belassen die Einstellungen bei Standard und füllen Name, Autor und Website nach Belieben aus. Das fertige Produkt gleicht in etwa diesem hier: Zeilen und Sätze die mit „//“ beginnen, sind Kommentare und werden bei der Ausführung des Codes ignoriert. Nutzen Sie dies unbedingt aus, um sich Hinweise und Notizen zu hinterlegen. Wenn Sie in drei Monaten auf Ihren Code schauen, wissen Sie eventuell nicht mehr was Sie sich damals dabei gedacht haben. Hier sind Kommentare sehr hilfreich, um schnell wieder einsteigen zu können. Die vorhandenen drei Funktionen OnInit(), OnDenit() und OnTick() sind bereits definiert, jedoch ohne Inhalt. Zur Erläuterung: OnInit() -> On Initialization -> Beim Laden des EA im Chart Der hier eingefügte Code wird dann ausgeführt, wenn Sie den Expert Advisor auf ein Chart anwenden. Im Normalfall setzt man hier einige Startwerte fest, die sich zur Laufzeit ändern können. OnDeinit() -> On Deinitialization -> Beim Entfernen des EA vom Chart Hierbei handelt es sich um das Gegenstück zur eben erwähnten Funktion. Alles was Sie hier reinschreiben, wird dann ausgeführt, wenn Sie den Expert Advisor wieder entfernen. Hier können Sie ihre Plattform aufräumen, indem Sie zum Beispiel alle Objekte vom Chart löschen, die vom EA eingefügt wurden. OnTick() -> Pro Tick Hier liegt die Hauptfunktionsweise des EAs. Pro Tick ist wohl mit die schnellste Variante. Bei jedem Tick werden die Berechnungen neu durchgeführt. Dies kann interessant sein, wenn ihr EA beispielsweise im Minuten Chart reagieren soll. Wer seine Kriterien aber eher im 4H-chart oder auf Tagesbasis macht, kann auch andere Events auswählen. Denkbar sind z. B. „Bei neuem Bar“, „Zeitgesteuert mit Timer (z. B. alle 30 Minuten) oder zu bestimmten Uhrzeiten. Für unser Beispiel bleiben wir jedoch bei OnTick. Grundlagen der MQL-Programmierung Wer schon Erfahrungen im Programmieren gesammelt hat, kann diesen Absatz getrost überspringen. Für alle Neueinsteiger gibt es hier kurz und knapp ein paar Tipps, die Sie im Hinterkopf behalten sollten. Variablen: Variablen können fast beliebig definiert werden und Werte beinhalten. Diese Variablen können im Code anstelle des Wertes verwendet werden. Sie kennen das sicher aus dem Mathematikunterricht. „Lösen Sie x + 3 = 5 -> x = 2“ x ist hierbei unsere Variable, die den Wert 2 angenommen hat. Variablen sind immer dann sinnvoll, wenn Sie den entsprechenden Wert an mehreren Stellen verwenden wollen, jedoch von Zeit zu Zeit auch verändern. Stellen Sie sich 2000 Zeilen an Code vor, in denen die Zahl 5 rund 20 Mal genutzt wird. Am Ende stellen Sie fest, dass 5 nun doch besser eine 7 seien sollte. Anstatt nun alle Zeilen zu durchsuchen und den Wert von 5 auf 7 zu ändern, können Sie bequem ihr x als 7 definieren und sind fertig. Variablentypen: Variablen erhalten bei der Erstellung eine Definition ihres Typs, welcher festlegt, um was es sich bei der Variable handelt. Dies kann zum Beispiel sein: Int = Ganzzahl (Integer) (1 | 2 | 3) Double = Gleitkommazahl (0.05 | 1.33 | 3.1415) Bool = Wahrheitswert (Boolean) (True oder False) String = Zeichenkette („EA läuft im Währungspaar EUR/USD“) Die Dateitypen sind nicht immer bindend, sollten aber sinnvoll gewählt sein. Ein Parameter für die maximale Anzahl an Positionen sollte vom Typ Integer sein, ergo die Werte 0,1,2,3, … annehmen können. Der Typ Double würde in dem Fall keinen Sinn ergeben, da man eben nicht 1.5 Positionen offenen haben kann. Im Gegenzug, wer die maximal genutzte Margin in Prozent angeben möchte, sollte auf den Typ Double setzen und die Angabe praktischerweise sofort in Dezimalschreibweise machen, also beispielsweise 0.05 für 5 %. Code Aufbau Mit einigen Ausnahmen, läuft ein Code immer von oben nach unten durch. Denken Sie bei Berechnungen daran, dass die Reihenfolge eine Rolle spielt. Beispiel: int x, y, z; z = x * y; y = 3; x = 2; Wir haben die Variablen als Integer deklariert (Variable erstellt vom Typ X), jedoch noch nicht initialisiert (Der Variable einen Wert zuweisen). Der Code würde also nicht 2*3 rechnen, sondern einen Fehler melden, da x und y keinen Wert haben. int x = 2; int y = 3; int z = x * y; Diesmal initialisieren wir die Variable direkt beim Deklarieren. Dadurch kann z nun berechnet werden. Das mag jetzt einfach klingen, aber suchen Sie…