Expert Advisor Programmierung mit MQL4
Strategien & Wissen

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:

Expert Advisor Schablone

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 mal den Fehler, wenn ihr Code eine Funktion aufruft, die eine Variable nutzt, die vorher von einer anderen Funktion berechnet wird.

Das Ende eines Befehls wird mit einem Semikolon „;“ gekennzeichnet. Auch wenn das trivial klingen mag, es wird nur zu gerne hier und da vergessen und endet dann in einer freudigen Schatzsuche.

Beim Programmieren im MetaTrader mit MQL4 muss man zudem beachten, dass englische Dezimalseparatoren verwendet werden, beispielsweise würde 0,5 also als 0.5 geschrieben.

Zum Schluss dieses Exkurses. Um Ihren Expert Advisor lauffähig zu machen, müssen Sie die Datei nicht nur speichern, sondern auch Kompilieren. Das geht bequem per Knopfdruck in der oberen Menüleiste. Sollte diese ausgeblendet sein, finden Sie sie unter „Ansicht -> Werkzeugleiste“. Hierbei überprüft der Compiler auch direkt die Lauffähigkeit des Codes und meldet Fehler zurück. Sie können den EA nur testen, wenn er fehlerfrei (Warnungen zählen nicht als Fehler) kompiliert wird.

Legen wir los

Das Konzept

Um das Beispiel einfach zu halten, soll unser Expert Advisor lediglich folgende Dinge tun.

  • Er soll eine beliebige Anzahl an Trades eröffnen, die wir per Parameter bestimmen können.
  • TakeProfit, StopLoss und Lotsize sollen ebenfalls per Parameter eingestellt werden können.
  • Er soll eine Position eröffnen, wenn der RSI im Stundenchart über 85 oder unter 15 liegt.
  • Es soll nur eine Position eröffnet werden, wenn wir uns zudem innerhalb der oberen oder unteren 20 % der letzten 24h befinden (High-Low)
  • Er soll nach dem Öffnen einer Position 30 Minuten warten, bevor er eine neue Position eröffnet.
  • Er soll pro Tick den aktuellen Stand unserer Equity erfassen, sowie deren Minimum und Maximum im Blick behalten und diese drei Werte auf dem Chart anzeigen, sowie die Veränderung zum Start.
  • Er soll alle Positionen sofort schließen, wenn die Equity unter 95 % des Maximums fällt und danach keine Trades mehr eröffnen.

Anmerkung: Hierbei handelt es nicht um einen gewinnbringenden Expert Advisor. Das Beispiel soll nur zu Lehrzwecken dienen. Der Einsatz auf einem Livekonto führt mit sehr hoher Wahrscheinlichkeit zu Verlusten.
Einige der Funktionen sind für einen Expert Advisor auch nicht erforderlich, aber durchaus als Beispiel sinnvoll, falls Sie sich stattdessen an einem eigenen Indikator versuchen möchten.

Parameter:

Zunächst sollten Sie die Parameter festlegen, die später noch verändert werden können. Diese werden durch ein „extern“ gekennzeichnet.

Expert Advisor Parameter

Wie auf dem Screenshot ersichtlich ist, lassen sich außerhalb des Codes nur die Variablen verändern, die mit extern gekennzeichnet wurden. Hier sollte Klasse statt Masse das Sprichwort sein. Der Großteil der Strategie sollte ohnehin fest verankert sein, lediglich Einstellungen rund um Money- und Risk Management sind sinnvoll.

Interne Variablen:

Hier fallen alle Variablen rein, die an irgendeiner Stelle im Code verwendet werden. Ob Sie die Variablen alle in einem Paket definieren oder bei Bedarf kreuz und quer verteilt im Code, ist Ihnen überlassen. Mit zunehmender Länge des Programmcodes wird es jedoch immer schwerer, die definierten Variablen wiederzufinden. Es empfiehlt sich daher, zumindest die Variablen, die Sie verändern/optimieren wollen, gebündelt zu sammeln. Variablen, die Sie nur kurz benötigen, können Sie auch getrost mitten im Code definieren. Wer auf der sicheren Seite sein möchte, definiert alle Variablen an einer Stelle, so sehen Sie auf einen Blick welche Variable welchen Wert beinhaltet.

Wir überlegen uns nun, für welche Werte wir Variablen brauchen und deklarieren diese.

 Variablen

Drei Equity-Variablen um Startwert, sowie Höchst- und Tiefstand zu speichern, eine für den RSI Wert, da wir diesen an mehreren Stellen abfragen werden, zwei für High bzw. Low der letzten 24 Stunden und eine als Zeitstempel für die 30 Minuten Wartezeit. Zuletzt ein Wahrheitswert, der weitere Trades verhindert, sobald 5 % Verlust erreicht wurden.

Von der Theorie zur Praxis der Expert Advisor Programmierung

Bearbeiten wir zunächst OnInit() beziehungsweise OnDeInit(). Beim Laden des Expert Advisors befüllen wir die Equity-Variablen mit den aktuellen Zahlen, der Zeitstempel wird mit 0 belegt und unsere Sicherheitsvariable wird mit False initialisiert. Beim Entfernen des Expert Advisors möchten wir alle Objekte im Chart wieder löschen.

Expert Advisor Programmierung

Ein Tipp am Rande hier: Bei der Programmierung im MetaTrader bietet MQL4 eine breite Masse an vorgefertigten Funktionen an, die Sie nach Lust und Laune nutzen können. AccountEquity() ist eine davon, und liefert als Wert die aktuelle Equity des verbunden Accounts wieder.

Weitere Beispiele wären AccountBalance(), AccountCurrency() oder AccountLeverage(). Intellisense bietet beim Programmieren eine Vorschau bei der Eingabe, womit der aktuelle Befehl vervollständigt werden kann.

MQL Programmierung

Information: Eine Übersicht der verfügbaren Funktionen finden Sie hier.
Dort wird neben dem Namen der Funktion auch erklärt, welche Paramater Sie benötigt und was Sie als Rückgabewert liefert. Zudem gibt es fast immer ein Anwendungsbeispiel.

Die Umsetzung der Planung

Zunächst möchten wir den Equity-Teil programmieren. Dazu nutzen wir eine If-Bedingung. Dies ist mitunter eine der praktischsten Möglichkeiten, die man als Programmierer nutzen kann.

Einigen dürfte das Prinzip aus Excel bekannt sein, in Form der Wenn-Formel.
=WENN(BEDINGUNG;DANN-WERT;SONST-WERT)

Der Aufbau in MQL4 ist ebenfalls simpel:

if(Bedingung)
{
// Code wenn Bedingung = wahr
}
else
{
// Code wenn Bedingung = falsch
}

Der „else“-Teil kann auch weggelassen werden, in diesem Fall geschieht nichts, wenn die Bedingung nicht erfüllt wird.

MQL Beispiel

Der Code ist so einfach, wie er auf den ersten Blick erscheint. Wenn die aktuelle Equity größer bzw. kleiner als der gespeicherte Max- bzw. Min-Wert ist, dann wird die Variable überschrieben. Da keine else-Anweisung vorhanden ist, passiert nichts, falls die Bedingung nicht zutrifft. Da wir nun unsere Equity Werte erfassen und speichern, können wir den Killswitch implementieren. Dieser soll alle Positionen schließen, wenn die aktuelle Equity kleiner als 95 % der maximalen Equity ist. Zudem setzen wir unsere boolean Variable auf True, welche dann später im Code verhindert, dass der Expert Advisor neue Positionen eröffnet.

Expert Advisor Positionen

Damit wäre die Sicherheit des Accounts zunächst hinreichend abgedeckt. Sollte unser Expert Advisor Verlust einfahren schützen wir somit mindestens 95 % des maximalen Kapitals.

Als nächsten Schritt ermitteln wir den RSI, sowie die 24h Range. Der RSI lässt sich hier bequem über eine vorhandene Funktion iRSI() ermittleln. Für die 24h Range bedienen wir uns einer Schleife, die der Einfachheit halber die letzten 24 1H Werte vergleicht und ersetzen die Werte analog zum Beispiel der Min. und Max. Equity. Hierfür nutzen wir die Funktionen iHigh() und iLow().

Funktionen iHigh

Nun haben wir vorerst alle Werte, die wir benötigen. Als nächstes müssen wir die Werte nun prüfen und bei Bedarf eine Position eröffnen.

Um sicherzustellen, dass auch nur Positionen eröffnet werden, bauen wir eine weitere Abfrage ein, die nur erfüllt wird, wenn unsere allgemeinen Trade-Bedingungen erfüllt sind.

MQL Abfrage

Diese Abfrage umfasst alle Code-Teile, die mit Positionseröffnung zu tun haben. Der Code innerhalb wird nur ausgeführt wenn folgende Bedingen erfüllt sind:

  • Die Anzahl aktuell offener Positionen (MQL4: OrdersTotal()) ist kleiner als die maximal erlaubte Anzahl nach Parameter
  • Die aktuelle Uhrzeit ist größer als der Zeitstempel des letzten Trades + 30 Minuten ( Wir ignorieren Zeitzonen, da 30 Minuten immer 30 Minuten sind )
  • Unsere Sicherheitsvariable hat den Wert false, wurde also nicht augelöst

Zu guter Letzt fragen wir nun unsere Bedingungen für Short und Long Positionen ab.

Bedingungen für Short und Long Positionen

Wir definieren zwei Variablen vom Typ boolean, die den Wert True oder False annehmen, je nachdem ob der mathematische Ausdruck dahinter richtig oder falsch ist. Der Ausdruck if(ShortCriteria1 && ShortCriteria2){} ist gleichwertig mit den vorhergehenden Beispielen. Beide Variablen müssen den Wert True haben, damit die Bedingung erfüllt ist. Ob Sie die eigentliche Abfrage bereits vorher machen, spielt keine Rolle. Zur Übersichtlichkeit und vor allem für den Fall, dass Sie die Kriterien öfter abfragen, macht diese Variante die Arbeit etwas leichter.

Da zwei Kriterien in der Regel nicht ausreichen, können Sie auch fünf oder zehn einbauen. Innerhalb der IF-Bedingung lassen sich beliebig viele Abfragen erstellen und logisch verknüpfen.

Beispiele:
if(Crit1 && Crit2) -> Wenn Crit1 = Wahr UND Crit2 = Wahr
if(Crit1 || Crit2) -> Wenn Crit1 = Wahr ODER Crit2 = Wahr
if((Crit1 && Crit2) || (Crit2 && Crit3)) -> Wenn (Crit1 und Crit2 = Wahr) ODER (Crit2 und Crit3 = Wahr)
if(!Crit1) -> Wenn Crit1 NICHT Wahr (Die Bedingung ist erfüllt wenn Crit1 den Wert False hat)

Die Klammersetzung kann hierbei eine Rolle spielen, aber Sie können dieses Spiel beliebig in die Länge ziehen und so mehrere Eintrittskonditionen abfragen.

Werte auf einem Chart anzeigen

In diesem Beispiel stellen wir zwei Möglichkeiten vor, wie man Werte auf einem Chart anzeigen kann.

Der einfache Weg nutzt die Comment() Funktion von MQL4. Hierbei kann man einen String oder beliebigen Wert als Parameter übergeben, welcher dann links oben im Chart eingeblendet wird.

Die Alternative dazu ist ein wenig aufwendiger, bietet aber wesentlich mehr Möglichkeiten für Gestaltung und Design. Hierbei erstellen wir Objekte, weisen ihnen den Inhalt eines Strings zu und vergeben einige Farben, sowie X/Y Angaben für die Position des Objekts.

Folgender Screenshot verdeutlicht den Aufwand/Nutzen der Varianten. In beiden Fällen zeigen wir die verschiedenen Equity Werte an, bei den Objekten zusätzlich noch die Veränderung zum Start und färben die aktuelle Equity rot oder grün, abhängig davon, ob sie über oder unter unserem Startwert liegt.

Aufwand/Nutzen der Varianten

Testen des Expert Advisors

Wir haben unseren Expert Advisor nun programmiert und möchten testen, wie effektiv er arbeitet. Für einen kurzen Test ist der Strategietester des MetaTraders wunderbar geeignet. Hierbei bedient sich der Tester an den historischen Kursdaten, simuliert die einzelnen Ticks innerhalb einer Kerze und handelt nach dem Motto „Was-wäre-wenn“.

Den Strategietester finden Sie im MetaTrader unter „Ansicht -> Strategietester“ (Shortcut: Strg + R).

MetaTrader Strategietester

Sollte ihr Expert Advisor nicht in der Liste auftauchen, wurde er entweder nicht korrekt kompiliert oder noch nicht vom MetaTrader erfasst. Sofern ersteres nicht zutrifft, starten Sie den MetaTrader einfach neu.

Sie können hier außerdem ein Symbol auswählen, auf welches der Expert Advisor angewendet wird, sowie die Zeiteinheit und den Spread. Die Methode „Jeder Tick“ ist am effektivsten und sollte immer verwendet werden.

Zeitraum „Von“ und „Bis“ bestimmen wo die Simulation beginnt und wo sie endet. Je größer die Zeitspanne, desto aussagekräftiger das Ergebnis. Mit dem Haken bei „Visueller Modus“ können Sie entscheiden, ob Sie den Verlauf auf einem Chart angezeigt bekommen möchten, oder nur auf das Endergebnis warten, was etwas weniger Zeit in Anspruch nimmt.

Mit dem Button „Expert Advisor Optionen“ gelangen Sie zu einem Menü, in dem Sie die externen Parameter des EAs verändern können, sowie das Startkapital festlegen und einige weitere Einstellungen verändern können. Zusätzlich können hier Optimierungsparameter eingestellt werden.

Parameteroptimierung soll uns an dieser Stelle nicht weiter belasten, aber als kurzes Beispiel zum Verständnis, wie diese Optimierung funktioniert:

Expert Advisor Optimierung

Diese Einstellung würde bewirken, dass der Expert Advisor mit einem StopLoss Parameter von 50 startet, diesen pro Durchlauf in 10er Schritten erhöht, bis er ein Maximum von 200 erreicht hat. Für jeden Durchlauf werden die Ergebnisse gespeichert und aufgelistet, um die effektivste Parameterwahl bestimmen zu können. Sie können auch mehrere Parameter kombinieren, was jedoch schnell zu einer riesigen Anzahl an Möglichkeiten führt, was wiederum Stunden oder Tage dauern kann.

Nachdem alle Einstellungen gemacht wurden, können Sie auf „Test starten“ klicken und abwarten. Das Endergebnis wird Ihnen in gewohnter MT4 Manier als Report angezeigt. Sie können das Ergebnis in drei verschiedenen Ansichten betrachten. Der Reiter „Ergebnisse“ zeigt eine Auflistung aller Order an (Eröffnung, falls vorhanden Modifizierung, Schließung), sowie das Endergebnis und den daraus resultierenden Kontostand. Der Reiter „Diagramm“ zeigt die Entwicklung von Balance und Equity als Graph pro geschlossener Position an. Unter „Bericht“ finden Sie eine Zusammenfassung mit einigen Schlüsselwerten.

Expert Advisor Bericht

Aus dem Bericht können wir entnehmen, dass unser Expert Advisor mehr Verluste als Gewinne einfährt und bei ca. 5 % Verlust unser Sicherheitsfeature aktiviert worden ist. Wir schließen daraus also, das weitere Anpassungen nötig sind.

Testen Sie Ihren Expert Advisor so oft es geht unter verschiedenen Bedingungen, wie beispielsweise höhere Spreads oder verschiedenen Zeiträumen, um möglichst viele Szenarien abzudecken. Wenn ihr programmierter Expert Advisor im Strategietester erfolgreich ist, sollten Sie ihn einige Zeit auf einem Demokonto laufen lassen, um sich zu versichern, dass er auch unter nahezu realen Marktbedingungen noch funktioniert. Erst wenn Sie auch hier mit dem Ergebnis zufrieden sind, sollten Sie ihn auf einem Echtgeldkonto einsetzen. Da sowohl im Strategietester, als auch im Demokonto, Stoploss und Takeprofit immer punktgenau ausgeführt werden, wird das Ergebnis im Echtgeldkonto immer ein wenig schlechter ausfallen. Wer ganz sicher gehen möchte, limitiert die Positionsgrößen zunächst auf ein Minimum, bis sich der Expert Advisor endgültig bewährt hat.

Das könnte Sie auch interessieren

Warum willst du Trader werden? Einer der wichtigsten Fragen!

Rudolf T.

Ist Volumentrading wirklich besser als technische Analyse? [Video]

Smartmoneynews

Daytrading lernen – Der Weg zum erfolgreichen Trader

Rudolf T.
>