MetaQuotes Sprache 4 und 5 sind Werkzeuge zur Entwicklung von Anwendungen für das MetaTrader-Kundenterminal. Sie basieren auf den Plattformen der MetaTrader-Produktfamilie der vierten bzw. fünften Generation. Mit diesen Sprachen stehen den Benutzern Tools zur Entwicklung von clientseitigen automatisierten Handelsstrategien zur Verfügung.

Der Artikel befasst sich mit folgenden Themen:


Für Sie habe ich eine ausführliche Anleitung zur MetaTrader-Programmierung MQL4 vs. MQL5 vorbereitet. Nach dem Lesen dieses Artikels werden Sie wissen, was MQL ist, die Unterschiede zwischen den beiden neuesten Versionen der Sprachen kennen und verstehen, wie man mit ihnen arbeitet. Sie finden hier eine detaillierte Beschreibung mit Abbildungen, wie Sie einen Expert Advisor schreiben können. Fangen wir an!

Was sind MQL4 und MQL5?

Die Sprachen MQL4 und MQL5 sind sich in vieler Hinsicht sehr ähnlich. Deshalb werden wir gesondert auf die Unterschiede eingehen. Vorerst einigen wir uns aber darauf, beide als MQL im Singular und ohne Angabe der Version zu nennen.

MQL ist eine Programmiersprache, die in der MetaTrader-Plattform integriert ist. Die Entwicklungsumgebung MetaQuotes Language Editor dient dazu, Ihre eigenen Handelsroboter, Indikatoren oder andere Anwendungen in MQL zu schreiben, sowie diese zu kompilieren und zu debuggen. Diese Entwicklungsumgebung wird mit dem MetaTrader-Kundenterminal und allen Referenzinformationen geliefert. ​

LiteForex: Was sind MQL4 und MQL5?

Wenn Sie schon einmal in bestimmte Vermögenswerte investiert haben - auch wenn Sie vielleicht nur Dollars gekauft haben, um sie auf der Bank zu halten - dann wissen Sie, dass diese Investition eine unablässige Überwachung voraussetzt. Mit Sicherheit haben Sie sich Fragen wie diese schon mehr als einmal gestellt:

  • Ist der Zeitpunkt gekommen, aus dem Handel auszusteigen, während der Preis auf seinem Höchststand ist?
  • Wie stelle ich fest, ob der Preis einen Finanzinstruments weiter steigen oder der Markt sich drehen wird?
  • Vielleicht ist das aktuelle Signal ein Fehlsignal und es lohnt sich nicht, ein neues Risiko einzugehen und eine Position zu eröffnen?

Man muss mit dem Markt Schritt halten und rechtzeitig Handelsentscheidungen treffen. Es ist empfehlenswert, dies Tag und Nacht in den aktivsten Sitzungen zu tun. Bei der Arbeit mit mehreren Finanzinstrumenten zeitgleich wird die Situation immer mehr verschärft.

MQL gestattet Ihnen die Implementierung einer beliebigen Handelsstrategie oder eines Algorithmus in Form eines Computerprogramms. Danach wird dieses Programm gestartet und läuft ständig auf einer Workstation im MetaTrader-Kundenterminal. Außerdem enthält der Lieferumfang eine Reihe von Handelsrobotern, Indikatoren und Skripten des Plattformentwicklers in Form von Quellcodes. Das erleichtert die Weiterentwicklung der Sprache und der damit verbundenen Techniken erheblich. Auch wird MQL mit detaillierten Online- und Offline-Referenzinformationen bereitgestellt. Um die Sprache herum gibt es eine riesige Community.

Angenommen, Sie haben sich einen interessanten Indikator oder einen intelligenten Handelsalgorithmus ausgedacht, den Sie bei Ihrer Arbeit einsetzen möchten. Oder vielleicht möchten Sie den Markt unter Verwendung neuronaler Netzwerke analysieren? Es gibt keinerlei Einschränkungen. Mit MQL lässt sich jede Idee in Form eines Indikators, Experten oder einer anderen Anwendung implementieren, kompilieren, debuggen, im Strategietester mit historischen Daten überprüfen - und das alles ohne finanzielle Risiken und aktiv im Handel einsetzen. ​

LiteForex: Was sind MQL4 und MQL5?

Lassen Sie es uns zusammenfassen! MQL löst das Problem des Schreibens von Hilfsprogrammen zur Überwachung des Status eines Handelskontos, zur Berechnung von Indikatoren und Niveaus, zum Empfang von Handelssignalen und zur Markteinstiegs- und -ausstiegspunkten. Die Werkzeuge der Sprache erlauben es den Handelsrobotern oder Indikatoren, den Informationsaustausch mit einem entfernten Server unter Verwendung des TCP-Protokolls, einschließlich der TLS-Verschlüsselung, oder des HTTP-Protokolls zu realisieren. Es besteht die Möglichkeit, Daten über FTP sowie Push-Benachrichtigungen an mobile MetaTrader-Clients oder an die E-Mail-Adresse des Benutzers zu senden. Ein gut geschriebenes und getestetes Programm wird solange funktionieren, bis Sie sich für Änderungen entscheiden oder es komplett durch ein anderes ersetzen. Sie müssen sich lediglich um die allgemeine Überwachung kümmern.

Die Geschichte hinter den Sprachen MQL4 und MQL5

MQL ist durch die evolutionäre Entwicklung der Plattform entstanden. Es handelt sich um ein Tool zur automatischen Verwaltung von Handelskonten im MetaTrader. Ich werde nicht im Detail auf diesen Punkt eingehen, sondern ihn oberflächlich durchgehen.

MetaQuotes hat die Sprache MetaQuotes Language zusammen mit der MetaTrader-Plattform veröffentlicht, die zuvor die FXCharts-Anwendung war. MQL stieg zur zweiten Version zusammen mit dem MetaTrader 3 Update auf. Hier brachte MetaQuotes die API auf den Markt, die den Kunden als zusätzliche Ebene zwischen MetaTrader Client und MetaTrader Server zur Verfügung gestellt wurde.

Die Veröffentlichung der vierten Generation der Plattform erfolgte am 1. Juli 2005. Parallel dazu wurde MQL4 herausgegeben. Die Abwärtskompatibilität mit der vorherigen Version der Programmiersprache wurde aufgegeben. MetaQuotes stellte auch die Unterstützung der Client-Terminal-API ein, aber erweiterte die Fähigkeiten der Sprache selbst und bot Methoden zur Integration eigener DLL-Bibliotheken in MQL-Anwendungen. Die API stand weiterhin nur Brokern auf der Server-, Administrations- und Managementebene zur Verfügung.

Im Juni 2010 wurde, nach zahlreichen Versionen, MetaTrader 5 eingeführt. MetaQuotes hatte die Handelslogik überarbeitet und die meisten Restriktionen beseitigt, die durch die interne Struktur der Plattform entstanden waren. Doch bisher kann MT5 in der Beliebtheit nicht mit der vierten Generation mithalten.

Im Februar 2014 wurde MQL4 gemeinsam mit dem Build 600 des Kundenterminals MT4 aktualisiert. MetaQuotes optimierte die Sprache, führte die meisten Funktionen von MQL5 ein und erhöhte die Geschwindigkeit gleichzeitig auf das Niveau eines Nachfolgers.

Funktionen der Programmiersprachen MQL4 und MQL5

MQL wird zur Erstellung von automatisierten Handelsstrategien eingesetzt. Der MQL-Code wird vorab in C++-Code interpretiert, der dann in einen lauffähigen Code kompiliert wird, welcher innerhalb des Terminals als eine eingebundene dynamische Bibliothek fungiert. Wenn wir eine Parallele mit dem Vorgänger bilden, dann ist es ähnlich wie das Einschließen der DLL-Bibliothek in den ausführbaren Code des Hauptprogramms. Diese Vorgehensweise trägt zur einfachen Entwicklung und einer niedrigen Schwelle für den Einstieg in den Bereich des automatisierten Handels bei. Die Programmiersprache ist unter Tradern beliebt, obwohl sie eng spezialisiert ist und plattformabhängig ist.

MetaQuotes hat sich der Anwender angenommen und alle seine Anwendungen mit ausführlichen Hilfetexten versehen. Die Referenzen für die MQL4-Programmierung und MQL5 werden mit MetaEditor in mehreren Sprachen in Form von HTM-Dateien bereitgestellt. Somit haben Sie immer eine detaillierte Anleitung mit Codebeispielen, um das gewünschte Verhalten zu implementieren.

Eine große Community von Tradern und Programmierern hat sich um MQL gebildet. Es gibt Tools, die die Kommunikation zwischen Programmierern und Händlern erleichtern. Zur Vereinfachung des Handelsprozesses wurde bereits eine Reihe von vorgefertigten Anwendungen gebildet. Für den kostenpflichtigen oder kostenlosen Austausch von Anwendungen gibt es einen Markt unter mql5.com. Das Handelsterminal integriert den App-Store, die Codebase, Artikel und Signale von anderen Tradern. Der App-Store bietet Hunderte von kostenpflichtigen und kostenlosen Lösungen wie Indikatoren, Advisors, Skripte und allerlei Hilfsprogramme. Für den Fall, dass es einfacher ist, ein vorgefertigtes Programm zu kaufen, als "das Rad neu zu erfinden".

Wenn Sie sich entschlossen haben, MQL selbständig zu erlernen und in die Welt der Erstellung eigener Anwendungen einzutauchen, können Sie in diesem Artikel etwas über Probleme erfahren, auf die ein Anfänger bei den ersten Schritten auf diesem Gebiet stößt. Für den fortgeschrittenen Leser ist es unwahrscheinlich, dass er aus dem folgenden Text etwas Neues lernt.

Die Entwickler bieten der MQL-Gemeinschaft Unterstützung in Form von Informationen, indem sie regelmäßig Anleitungen in Form von Artikeln zu verschiedenen Themen aus der Welt des Handels veröffentlichen. Die Autoren der Artikel befassen sich mit neuen Programmiermethoden, einschließlich der Erstellung von neuronalen Netzen, der Analyse und Lösung von Problemen und Einschränkungen der Sprache, der Analyse und dem Testen von Handelsstrategien sowie mit der Suche und Implementierung von neuen Algorithmen.

MQL Wizard bietet 8 Optionen für MQL4 und 10 Optionen für MQL5. Hier die Screenshots des Datei-Assistenten für beide Versionen der Sprache.

LiteForex: Funktionen der Programmiersprachen MQL4 und MQL5

LiteForex: Funktionen der Programmiersprachen MQL4 und MQL5

Betrachten wir die geläufigsten unter ihnen:

  • Expert Advisor/Handelsroboter;
  • Indikator;
  • Skript;
  • Bibliothek mit Include-Dateien (.mqh).

Nach der Kompilierung werden die Anwendungen in Form von ausführbarem Code in das entsprechende Verzeichnis des MetaTrader-Kundenterminals (Datei -> Datenordner öffnen) gelegt: Experts, Indikatoren, Skripte, etc. Nach der Initialisierung auf dem Chart werden sie dann als Reaktion auf Ereignisse ausgeführt, die vom MetaTrader-Kundenterminal während des Betriebs generiert werden. Die Ereignisse sind ein Auslöser für den Start von benutzerdefinierten Programmen und ermöglichen es Ihnen die Initialisierung und Deinitialisierung, den Empfang eines neuen Kurses, benutzerdefinierte Ereignisse auf dem Chart und mehr zu verfolgen.

Außerdem ist es jetzt möglich, Anwendungen in Python zu erstellen. Entsprechend stehen im Handelsterminal nun Python-Tools zur Verfügung.

Die folgenden Event-Handler werden in der MQL4-Referenz beschrieben.

LiteForex: Funktionen der Programmiersprachen MQL4 und MQL5

In MQL5 wurde die Anzahl der Handler verglichen mit der vorherigen Generation erhöht. Die Liste sieht jetzt wie folgt aus:

LiteForex: Funktionen der Programmiersprachen MQL4 und MQL5

Danach wurde die Ereignisliste erweitert. Sie sieht jetzt folgendermaßen aus:

LiteForex: Funktionen der Programmiersprachen MQL4 und MQL5

Handelsrotober oder Expert Advisor

In der Trader-Community wird er auch Expert genannt. Der Expert Advisor wird an den Chart im MetaTrader-Kundenterminal angehängt und ist ständig aktiv, solange das Handelsterminal läuft und eine Verbindung zum Handelsserver existiert. Expert Advisors dienen dazu, absolut beliebige Handelsstrategien zu implementieren, den Kontostand zu überwachen, Handelsvorgänge unter festgelegten Bedingungen durchzuführen und grafische Objekte zu verwalten. Immer wenn der Handelsroboter einen neuen Tick für ein Instrument erhält, beginnt er mit der Eröffnung von Trades. Außerdem kann der Expert Advisor als Reaktion auf verschiedene andere Ereignisse gestartet werden: OnTimer, OnChartEvent, OnTesterTimer, usw.

Expert Advisors dienen der Erstellung von Benutzeroberflächen. Sowohl Roboter als auch Indikatoren können auf grafische Objekte zugreifen.

Im Folgenden finden Sie den Code für einen einfachen Handelsroboter. Bei jedem neuen Tick auf dem Symbol im Chart, mit dem der EA gerade arbeitet, werden die Handelsgeschäfte überprüft. Gibt es bereits einen Handel für ein Symbol, wartet der EA auf dessen Schließung. Gibt es keinen Handel, dann wird einer in der dem vorherigen Handel entgegengesetzten Richtung eröffnet. Die EA-Parameter Volumen, Stop-Loss und Take-Profit-Niveaus werden vom Benutzer festgelegt. Beim ersten Start wird er eine Long-Position auf eine bestimmte Währung eröffnen. Nach dem Schließen wird der nächste Handel ein Short-Handel sein, dann wieder Long, und so weiter. Im Falle eines erfolglosen Versuchs, einen Trade zu eröffnen, schreibt der EA eine Fehlermeldung in das Log und geht für 60 Sekunden in den Ruhezustand. Anschließend wird der Versuch wiederholt. Da der EA die vom Benutzer eingegebenen Parameter nicht auf Richtigkeit überprüft, sollten Sie auf diesen Aspekt achten. Im Folgenden sind einige der potenziellen Probleme aufgeführt, die sofort sichtbar sind:

  • Die allgemeine Handelsfähigkeit wird nicht geprüft. Sie kann im Terminal durch den Benutzer oder speziell für diesen Advisor deaktiviert werden. Der Handelsserver kann ebenfalls Einschränkungen für den automatisierten Handel besitzen.
  • Das Volumen kann geringer als das kleinere oder größer als das größere sein und ist unter Umständen ungeeignet, wenn der Server eine Grenze für den Volumenschritt hat. Beispiel: Der Benutzer gibt 0,23 Lots ein, doch der Server hat eine Mindeständerung von 0,05 Lots. Infolgedessen wird der Trade nicht eröffnet und die OrderSend-Funktion meldet einen Fehler.
  • Die Stop-Niveaus für den Trade werden ebenfalls nicht auf ihre Genauigkeit überprüft. Sie liegen möglicherweise nicht innerhalb der zulässigen Minimal-/Maximalwerte oder passen nicht in die von den Freeze-Levels gesetzten Grenzen.

Der einfachste Code, der als Vorlage für die Umsetzung größerer Problemlösungen verwendet werden kann.

Dieser Code wird kompiliert und ausgeführt in MetaQuotes Language Editor 5 build 2375 vom 31. März 2020.

LiteForex: Handelsrotober oder Expert Advisor

Indikator

Der Indikator wird verwendet, um Informationen über Kursdaten darzustellen, die auf irgendeine Weise umgewandelt wurden. Alle Arten von Oszillatoren, Trendlinien, Fraktale sind Indikatoren. Die Indikatoren greifen auf grafische Werkzeuge zu. In MQL4 gibt es 6 von ihnen, während es in MQL5 18 sind. Beispielsweise zeigt der gleitende Mittelwert einige gemittelte und/oder geglättete Kurse für eine Kursperiode in der Vergangenheit an und gibt indirekt die zukünftige Richtung des Kurses für ein Instrument an. Er ist ständig auf dem Chart aktiv. Der Indikator wird bei jedem Tick für das Instrument auf dem Chart, mit dem der Indikator arbeitet, aktualisiert und neu berechnet. Die Aktualisierung erfolgt auch, wenn Ereignisse vom Benutzer empfangen werden.

Jedem Indikator innerhalb des MetaTrader Client Terminals sind ein oder mehrere Puffer zugeordnet, in denen numerische Daten abgelegt werden. MQL4 stellt 32 Puffer für einen Indikator zur Verfügung. In MQL5 können Sie mit 512 Puffern arbeiten.

Unten finden Sie ein Beispiel für den Quellcode des Bears-Indikators, der von den Entwicklern der Plattform zusammen mit MetaTrader4 bereitgestellt wird. ​

LiteForex: Indikator

Script

Entwickler setzen Skripte ein, um Algorithmen zu erstellen, die keine Datenverarbeitung in Echtzeit erfordern. Beispielsweise, um statistische Daten herunterzuladen oder Debug-Informationen ausgeben zu können. Skripte werden einmal ausgeführt, wenn sie durch das OnStart-Ereignis an ein beliebiges Diagramm angehängt werden. Nur dieses Ereignis kann das Skript verarbeiten.

Das Bild unten zeigt den Skriptcode zum Schließen aller Marktaufträge auf dem Konto. Das Skript führt alle Orders aus, unabhängig davon, auf welchem Chart des Symbols es gestartet wird. Ausstehende Orders werden in diesem Fall ignoriert.

LiteForex: Script

Als Ergebnis der Ausführung dieses Skripts erscheint die folgende Ausgabe im Log des MetaTrader: ​

LiteForex: Script

Etwas aufwändiger ist es, dem Skript beizubringen, ausstehende Orders separat in MQL4 zu verarbeiten. Zunächst legen wir eine Eigenschaft an, damit das Skript ein Fenster mit Eingabedaten anzeigt. Dann fügen wir ein Enum hinzu, das 3 Optionen für den Abschluss von Geschäften mit einem Skript enthält: nur Marktaufträge, nur ausstehende Orders oder alle Geschäfte, die sich gerade auf dem Konto befinden. Anschließend fügen wir ein Array zum Speichern von Tickets für ausstehende Orders hinzu und belegen es in der ersten For-Schleife entsprechend. Es bleibt nun noch, die vom Benutzer gewählte Option zum Schließen von Trades zu verarbeiten.

Als Resultat haben wir ein Skript wie dieses, das nicht nur alle Trades schließt, sondern auch die Auswahl des Benutzers berücksichtigt. ​

LiteForex: Script

Bibliothek mit Include-Dateien (.mqh)

Wie die Bezeichnung schon andeutet, wird es zur Einbindung in andere Arten von Programmen für das MetaTrader-Kundenterminal verwendet. Der versierte Entwickler verfügt über einen Satz eigener Tools, die in verschiedenen Anwendungen vielfach wiederverwendbar sind.

Im MetaQuotes-Spracheditor müssen Sie lediglich den Pfad zur eingebundenen Header-Datei angeben, relativ zum Speicherort der Datei, in die die Einbindung erfolgt. Beim Kompilieren des Programms findet MetaEditor diese Datei und schließt den Code daraus anstelle der #include-Direktive ein. Nun ist der gesamte Bibliothekscode in der Anwendung nutzbar.

In gleicher Weise verwenden C- und C++-Programmierer Code wieder, indem sie Header-Dateien in ihre Projekte einbinden und mit Binärdateien verbinden.

Das unten stehende Beispiel zeigt die am meisten vereinfachte Interpretation eines dynamischen Arrays namens std::vector aus der Standard-C++-Bibliothek. Dieser Code kompiliert und funktioniert mit MetaEditor Version: 5.00 build 2375 vom 31. März 2020.

LiteForex: Bibliothek mit Include-Dateien (.mqh)

Datentypen und Syntax von MQL4- und MQL5-Sprachen

Die Datentypen und die Syntax der Sprache wurden von C++ geerbt. Vor der Kompilierung wird der MQL-Code in den entsprechenden C++-Code vorverarbeitet und interpretiert. Deshalb werden Sprachkonstrukte, die im Vorgänger gültig sind, sehr wahrscheinlich auch kompiliert und funktionieren in MQL. Ein mit C, C++ oder C# vertrauter Programmierer kann leicht nachvollziehen, wie MQL-Code zu schreiben ist.

Datentypen

In MQL gibt es die folgenden grundlegenden Datentypen:

  • Boolesche Werte;
  • Einfach- und doppeltgenaue Gleitkommazahlen;
  • Integer, auch einfache und doppelte Genauigkeit, mit und ohne Vorzeichen;
  • Char zum Speichern von Zeichendaten;
  • Enum-Aufzählungen, aber die Enum-Klasse wird nicht unterstützt;
  • Strukturen, Klassen und Klassenvorlagen.

Zugleich gibt es eine zusätzliche Unterstützung für color, string und datetime als eingebaute Typen, was dem Entwickler die Arbeit natürlich etwas erleichtert. Die Bearbeitung dieser Typen ist im C-Stil über globale Funktionen organisiert. Die Funktionsweise eines MQL-Strings unterscheidet sich grundlegend von der std::string-Familie der Templates für C++03. Sie sollten sie nicht verwechseln.

LiteForex: Datentypen

Syntax von MetaQuotes-Sprachen

Die Syntax von MQL ähnelt der von C++. Auch die Semantik des Vorgängers des C++03-Standards wurde mit kleinen Änderungen auf MQL übertragen. Gegenwärtig entspricht MQL in Bezug auf die Fähigkeiten dem Standard C++03.

Der Hauptunterschied zwischen MQL und C++ ist die unterschiedliche Semantik von Pointers. Während es in C++ eine virtuelle Addresse ist, an der sich Daten befinden, so ist es in MQL ein Deskriptor, ein Analogon eines POSIX-Standard-Deskriptors. Ein numerischer Identifikator, eine Art Wrapper über einem rohen Pointer, durch den im dynamischen Speicher erzeugte und mit diesem Identifikator verbundene Objekte existieren. Für MQL-Pointer wird der Pfeiloperator "->" nicht unterstützt, eine Dereferenzierung wird mit dem Punktoperator "." durchgeführt. Der Deskriptor muss, ebenso wie der Pointer, nach Beendigung des Programms gelöscht werden. Sollten Sie jedoch vergessen, das Objekt, auf das dieser Handle verweist, zu zerstören, wird die Laufzeit das für Sie erledigen, wenn das Programm deinitialisiert wird.

In der Sprache MQL fehlt das Konzept einer temporären Variablen und der Datenbewegung. Das Übergeben von Variablen per Referenz und per Wert unterscheidet sich von C++ und ist in MQL auf eine eigene Weise implementiert. Alle komplexen Objekte oder benutzerdefinierten Klassen werden per Referenz an die Funktion übergeben, unabhängig davon, ob Sie den Ampersand-Operator verwenden oder nicht.

Für den Vorgänger gibt es eine Reihe von Einschränkungen. Man kann keine Funktionen und Vorlagen mit einer variablen Anzahl von Argumenten schreiben. Bemerkenswert ist jedoch, dass eine Reihe von integrierten Funktionen wie iCustom (die wir später in diesem Artikel analysieren werden), printf, StringFormat, PrintFormat eine variable Anzahl von Argumenten annehmen. Das ist paradox!

Der Umgang mit Daten- und Objektreferenzen weist im Vergleich zu C++ einige Unterschiede auf, die aber allesamt durch Meldungen des Compilers leicht zu beheben sind. Es bestehen Unterschiede in den Signaturen des Copy-Constructors und des Copy-Assignment-Operators aufgrund der unterschiedlichen Semantik der Übergabe von Variablen per Referenz. Auch gibt es keine Move-Semantik für das Verschieben von Variablen und Objektinstanzen in MQL.

Unterschied zwischen MQL4- und MQL5-Codes

Die Unterschiede zwischen der vierten und fünften Generation der MQL-Sprachen liegen in den Unterschieden zwischen den Plattformen MetaTrader4 und MetaTrader5 an sich begründet. Zu beachten ist, dass seit der Veröffentlichung des MT4-Builds 600 nur noch die fünfte Version des MetaQuotes Language Editor zum Schreiben und Kompilieren von Programmen in MQL4 und MQL5 genutzt wird. Die Sprachen funktionieren insbesondere bei Handelsoperationen auf unterschiedliche Weise, da die fünfte Plattform mehr Handelsmodi hat und die Konzepte von Order, Deal und Position voneinander getrennt sind.

Zum Senden von Anfragen wird jetzt nur noch die Funktion OrderSend benutzt. Anders als in der vierten Version, wo separate Funktionen zum Setzen einer Änderung oder zum Löschen eines Auftrags benötigt werden.

 

MQL4

MQL5

Zeitrahmen

9 (M1, M5, M15, M30, H1, H4, D, W, MN)

21 (M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, MN1)

Zeichenstile

6

DRAW_NONE

DRAW_LINE

DRAW_SECTION

DRAW_HISTOGRAM

DRAW_ARROW

DRAW_ZIGZAG

Mit Build 600 ist die Nummer mit der fünften Version einheitlich geworden

18

DRAW_NONE

DRAW_LINE

DRAW_SECTION

DRAW_HISTOGRAM

DRAW_HISTOGRAM2

DRAW_ARROW

DRAW_ZIGZAG

DRAW_FILLING

DRAW_BARS

DRAW_CANDLES

DRAW_COLOR_LINE

DRAW_COLOR_SECTION

DRAW_COLOR_HISTOGRAM

DRAW_COLOR_HISTOGRAM2

DRAW_COLOR_ARROW

DRAW_COLOR_ZIGZAG

DRAW_COLOR_BARS

DRAW_COLOR_CANDLES

Ereignisgesteuertes Launch-Modell

OnInit

OnStart

OnDeinit

OnTick

OnCalculate

OnTimer

OnChartEvent

OnTester

OnInit

OnStart

OnDeinit

OnTick

OnCalculate

OnTimer

OnTrade

OnTradeTransaction

OnBookEvent

OnChartEvent

OnTester

OnTesterInit

OnTesterDeinit

OnTesterPass

Handel

OrderSend

OrderModify

OrderDelete

Das Verhalten wird durch einen separaten Satz von Parametern für jede Funktion vorgegeben. Dies erschwert das Schreiben und Debuggen von Programmen.

OrderSend

Eine Funktion für alle Operationen. Das gewünschte Verhalten wird in der MqlTradeRequest-Struktur angegeben. Die Antwort wird in der MqlTradeResult-Struktur zurückgeliefert. Es ist einfacher, das Verhalten zu entwerfen, das Ergebnis zu testen und das Programm zu debuggen.

Indikator-Datenpuffer

32

512

Integrierte Indikatoren

Anzahl: 30

Anzahl: 38

Die Indikatoren werden mit Handles erzeugt. Anzahl der Kopien und Speicherbedarf wurden reduziert.

Handelsmodi

Hedging

Netting

Hedging

Stock

OpenCL und DirectX Grafiktools

Nein

Ja

Erstellung von Handelsrobotern

Nein

Ja. Zugleich lassen sich benutzerdefinierte Signalmodule festlegen.

Es gibt somit einige wenige Unterschiede, aber sie sind vorhanden. Nach dem Update in Build 600 unterscheidet sich MQL4 von MQL5 nur noch in dem Punkt, wo sich die eine Plattform von der anderen unterscheidet. Im LiteForex-Blog ist bereits ein Artikel dem Vergleich von MetaTrader 4 und MetaTrader 5 gewidmet, dessen Lektüre ich dringend empfehle, wenn Sie Ihr Wissen zu diesem Thema vertiefen wollen.

Programmierung des MQL4-Indikators: So schreibt man einen Expert Advisor in MQL4 oder MQL5

Bevor Sie einen Expert Advisor schreiben, müssen Sie sich darüber im Klaren sein, dass bereits eine Handelsstrategie vorliegen muss. Nur dann können Sie beginnen, die Idee in Form eines formalen Algorithmus zu realisieren. Der Programmcode selbst stellt nur Sprachwerkzeuge für die Umsetzung einer bestimmten Idee bereit.

Sie brauchen daher zuerst eine funktionierende Handelsstrategie. Die Frage, wie man diese entwickelt, sprengt den Rahmen dieses Artikels. Lassen Sie uns also etwas Einfaches als Beispiel betrachten. Gehen wir von Folgendem aus. In Zeiten geringer Aktivität des Finanzinstruments ("flacher Verlauf") kann man Trades in entgegengesetzten Richtungen mit kleinen Limits eröffnen. Dadurch haben Sie die Möglichkeit, kleine seitwärts gerichtete Marktbewegungen optimal auszunutzen und einen Gewinn zu erzielen.

Wir werden einen Expert Advisor schreiben, der die manuelle Eröffnung von Trades und die Überwachung ihrer Limits automatisieren wird, und ihn auf einem Handelskonto während der flachen Zeiträume starten wird.

Zunächst ist die Vorgehensweise unabhängig von der Sprachversion identisch. Zum Schreiben von Programmen in MQL müssen Sie das MetaTrader-Kundenterminal installieren, dessen Lieferumfang MetaEditor enthält. Anschließend können wir MetaEditor direkt aus dem Arbeitsordner des Terminals oder über das Hauptmenü im Handelsterminal starten: Tools und danach MetaQuotes Language Editor (F4). Im MetaEditor-Fenster des Hauptmenüs klicken wir auf Datei -> Neu. Dasselbe geschieht nach Klicken auf Neu im grafischen Menü.

So erstellt man einen MQL4-Handelsroboter

Wählen Sie im MQL4 EA Builder Application Wizard den Expert Advisor (Vorlage) und klicken Sie auf Weiter. ​

LiteForex: So erstellt man einen MQL4-Handelsroboter

Als nächstes tragen Sie die Parameter ein, die dem Benutzer eine Schnittstelle zur Interaktion mit dem Programm bieten, und bestätigen mit OK. Hier wird hinzugefügt:

  1. Tool zum Trading
  2. Auswahl einer Richtung für den ersten Trade, den der Roboter eröffnen wird. Momentan ist dies ein Integer-Typ, doch später werden wir den Code so anpassen, dass nur Kaufen oder Verkaufen auswählbar ist.

LiteForex: So erstellt man einen MQL4-Handelsroboter

MetaEditor fügt automatisch den OnTick-Eventhandler in den Code ein. Den Rest müssen Sie selbst wählen. Wie Sie erkennen können, haben wir zusätzlich Zugriff auf OnTimer, das jedes Mal mit der für den Timer eingestellten Frequenz aufgerufen wird und OnChartEvent, das bei Benutzeraktionen mit dem Chart aufgerufen wird. Hier ist zu sehen, dass noch weitere Handler für MQL5 verfügbar sind.

LiteForex: So erstellt man einen MQL4-Handelsroboter

Fahren Sie fort und wählen Sie die Event-Handler im Testmodus aus. In MQL5 können Sie im Testmodus mehr Ereignisse auswählen, dementsprechend sind auch mehr Handler für diese verfügbar.

LiteForex: So erstellt man einen MQL4-Handelsroboter

In den beiden vorherigen Schritten habe ich alle Optionen leer gelassen. Die gesamte Logik wird mit der Funktion OnTick durchgeführt. Sie wird jedes Mal aufgerufen, wenn ein neuer Tick für ein Symbol eintrifft.

Nach dem Klicken auf die Fertigstellen-Schaltfläche erstellt MetaEditor eine Vorlage für den zukünftigen Expert Advisor mit der angegebenen Bezeichnung und den Parametern. Auch die ausgewählten Event-Handler werden in den Code aufgenommen. Auf die einzelnen Handler werde ich nicht im Detail eingehen. Alle erforderlichen Informationen dazu finden Sie in der Referenzanleitung.

LiteForex: So erstellt man einen MQL4-Handelsroboter

Dieser Code lässt sich bereits im Handelsterminal kompilieren und ausführen. Doch es passiert nichts. Wir haben Eingangsvariablen, verwenden sie aber noch nicht. Die Funktion OnInit informiert das Terminal immer über die erfolgreiche Initialisierung, während OnTick und OnDeinit keine Befehle enthalten.

Beginnen wir dem Schreiben des Codes.

Zuerst wird aufgeräumt. Entfernen Sie überflüssige Leerzeichen und kürzen Sie die Kommentare auf eine Zeile. Danach definieren wir enum TradeCmd (Zeilen 11-14), um die Richtung für den ersten Trade auf eine logische Weise anzugeben und nicht durch eine Zahl. Anschließend ändern Sie den Eingabetyp der Variablen FirstTradeDirection von int auf TradeCmd (20). Im nächsten Schritt erstellen Sie eine statische globale Variable Direction mit dem Typ TradeCmd, um die Richtung des vorherigen Handels zu berücksichtigen und für den nächsten in die entgegengesetzte Richtung zu ändern.

Am Anfang vergaß ich, im Wizard Variablen für das Volumen der Geschäfte, Stop-Loss und Take-Profit-Level hinzuzufügen. Diese fügen wir jetzt mit dem Eingabeschlüsselwort den restlichen externen Einstellungen hinzu. ​

LiteForex: So erstellt man einen MQL4-Handelsroboter

Kommen wir nun zur Funktion OnTick. Wir analysieren die Verfügbarkeit offener Trades. Zu diesem Zweck iterieren wir über alle offenen Trades mit einem einfachen Zyklus im Bereich [0, TotalTrades). Wir prüfen einen nach dem anderen, ob das Symbol des ausgewählten Trades mit dem im InputSymbol angegebenen übereinstimmt. Wenn es mindestens einen derartigen Trade gibt, brauchen wir nichts weiter zu tun. Wir beenden die Funktion OnTick vorzeitig mit Return (Zeilen 29-35) und warten auf den nächsten Start.

LiteForex: So erstellt man einen MQL4-Handelsroboter

Andernfalls müssen Sie einen Trade öffnen. Lassen Sie uns in der MQL4-Dokumentation nachschlagen, um die Funktion OrderSend richtig zu benutzen. Mit ihrer Hilfe senden wir eine Anfrage an den Handelsserver. Die Deklaration sieht so aus:

LiteForex: So erstellt man einen MQL4-Handelsroboter

Betrachten wir die Parameter der Reihe nach:

  1. Symbol. Wir haben es bereits, allerdings prüfen wir die Richtigkeit keineswegs und verlassen uns nur auf die korrekte Eingabe durch den Benutzer.
  2. CMD. Dafür nutzen wir die globale statische Variable Direction.
  3. Volumen. Vom Anwender spezifiziert. Auch hier müsste der eingegebene Wert für die Grenzen überprüft werden: Minimum, Maximum und minimaler Schritt der Volumenänderung.
  4. Kurs. Ask (Briefkurs), wenn wir kaufen und Bid (Geldkurs), wenn wir verkaufen.
  5. Slippage (Abweichung). In unserem Fall nicht relevant. Stellen Sie sie auf 2 Pips ein.
  6. Stoploss. Auch hier kommt es auf die Richtung der Transaktion an. Er sollte niedriger als der Eröffnungspreis sein, wenn wir kaufen, und höher als der Eröffnungspreis, wenn wir verkaufen.
  7. Takeprofit. Ebenso wie beim Stoploss kommt es auf die Richtung des Trades an.

Die übrigen 4 Parameter mit einem Standardwert sind für uns noch nicht von Bedeutung. Um einen Trade zu eröffnen, haben wir daher somit: InputVolume (d.h. Volumen), Direction (d.h. Richtung des Deals), InputSymbol (d.h. Symbol), Slippage setzen auf 1 Punkt. Abhängig von der Direction müssen wir berechnen: price (d.h. Eröffnungskurs), sl (d.h. Stop Loss) und tp (d.h. Take Profit). Falls wir kaufen, dann ist der Kurs Ask, Stop Loss ist niedriger als der aktuelle Kurs, Take Profit ist höher. Wenn wir verkaufen, dann ist der Kurs Bid, Stop Loss ist höher als der aktuelle Kurs, und Take Profit ist niedriger. Außerdem benötigen wir 2 zusätzliche Variablen. Die erste dient zur Konvertierung des Niveaus der Limits von Punkten in den Nominalwert Punkt, der der Mindestwert ist, um den sich der Kurs für ein Symbol ändern kann. Die zweite ist für die Normalisierung der Werte mit Digit Floating Point (Anzahl der signifikanten Stellen im Nachkommateil des Kurses).

Konvertierung dessen zu MQL.

LiteForex: So erstellt man einen MQL4-Handelsroboter

Wir gehen direkt zur Eröffnung eines Trades über. Die Systemvariable _LastError wird mit der integrierten Funktion ResetLastError zurückgesetzt. Mit OrderSend senden wir eine Anfrage und schreiben das Ergebnis in die Ergebnisvariable:

  1. Der Handel wurde erfolgreich geöffnet, wenn result einen Wert größer als Null enthält, den Ticker des Handels. Wir müssen daher den Wert Direction ändern, um beim nächsten Mal einen Trade in der entgegengesetzten Richtung zu eröffnen.
  2. Wenn result einen negativen Wert enthält, wurde der Handel nicht eröffnet. Sie sollten den letzten Fehler mit GetLastError überprüfen, ihn analysieren und Maßnahmen ergreifen: erneut versuchen, für eine Weile pausieren, Debug-Informationen in das Protokoll ausgeben usw. Zur Vereinfachung gebe ich den Wert des letzten Fehlers in das Protokoll aus.

Lassen Sie uns einen Blick darauf werfen.

LiteForex: So erstellt man einen MQL4-Handelsroboter

Nun haben wir einige Dutzend Zeilen Code geschrieben und den Handelsroboter fertiggestellt. Er funktioniert zugegebenermaßen noch nicht sehr gut. Aber er kann als hervorragendes Beispiel dafür dienen, dass das Schreiben von Code nicht viele Kenntnisse oder erheblichen Aufwand erfordert.

Hier finden Sie eine vollständige Auflistung, falls Sie diese benötigen.

LiteForex: So erstellt man einen MQL4-Handelsroboter

Wir kompilieren den Code und starten im Handelsterminal den Expert Advisor.

Erstellung eines Expert Advisor in MQL5

In dieser Hinsicht hat MQL5 einen eindeutigen Vorteil gegenüber MQL4. Mit wenigen Klicks können Sie einen Handelsroboter für die fünfte Version erstellen, ohne auch nur eine Zeile Code zu schreiben.

Klicken Sie in MetaEditor auf Neu und wählen Sie im Anwendungsassistenten Expert Advisor (generieren). ​

LiteForex: Erstellung eines Expert Advisor in MQL5

Wir nennen unseren Expert Advisor MQL5_Generated_Robot. Bei Bedarf geben wir den Autor und seine Website oder sein Profil an. Ergänzen Sie die Parameter des Advisors, falls nötig: Symbol und Zeitrahmen für den Handel. Mit einem Doppelklick wird der Parameter aktiviert, mit einem Klick auf den Namen oder den Wert der Variablen ändern Sie die vorgeschlagenen Voreinstellungen. Sie können jedes beliebige Symbol einstellen. Ich habe es als das aktuelle definiert, auf dessen Chart der EA funktionieren wird. Den Zeitrahmen habe ich auf M15 eingestellt, um die Wahrscheinlichkeit von Handelssignalen zu erhöhen.

LiteForex: Erstellung eines Expert Advisor in MQL5

Es geht weiter. Jetzt müssen wir ein Signal und Einstellungen dafür auswählen. Hierbei können Sie improvisieren und verschiedene Kombinationen der von den Entwicklern vorgeschlagenen Signale ausprobieren. Mit diesen Signalen werden Ereignisse für den Experten erzeugt, um Transaktionen durchzuführen.

LiteForex: Erstellung eines Expert Advisor in MQL5

In diesem Abschnitt lassen sich benutzerdefinierte Signale hinzufügen, auch solche aus der Überwachung auf mql5.com. Die folgenden Optionen sind standardmäßig in der Plattform enthalten:

LiteForex: Erstellung eines Expert Advisor in MQL5

Ich habe "Handel am Schnittpunkt zweier Mittelwerte" gewählt und die Perioden auf 21 und 55 festgelegt. Zu kurze Zeiträume sind zu vermeiden, wenn Sie die Anzahl der Fehlalarme reduzieren wollen. Wir verlassen das aktuelle Symbol. Zum Beispiel werden wir EURJPY handeln und Signale von gleitenden Mittelwerten erhalten, die auf die Kursdaten desselben EURJPY angewendet werden. Wählen Sie hier ein anderes Symbol, wenn Ihre Strategie den Handel mit dem Instrument in Abhängigkeit von dem Verhalten eines anderen vorsieht. Ich habe auch den Zeitrahmen auf M15 eingestellt.

LiteForex: Erstellung eines Expert Advisor in MQL5

Bestätigen Sie. Wir erkennen, dass ein Signal für das aktuelle Symbol und den aktuellen Zeitrahmen hinzugefügt wurde, wodurch Ereignisse für den EA generiert werden.

LiteForex: Erstellung eines Expert Advisor in MQL5

Gehen Sie weiter zum Modus "Trailing Stop". Dort habe ich ein festes Größenlimit gewählt. Außerdem habe ich Stop Loss bei 150 Punkten und Take Profit bei 200 Punkten gesetzt.

LiteForex: Erstellung eines Expert Advisor in MQL5

Als nächstes lässt sich einer von fünf Modi des Geldmanagements für ein Handelskonto auswählen. Der Handel ist wie folgt möglich:

  • Festes Handelsvolumen;
  • Feste Margin;
  • Festgelegtes Risiko;
  • Minimal zulässiges Handelsvolumen;
  • Optimiertes Handelsvolumen.

LiteForex: Erstellung eines Expert Advisor in MQL5

Ich habe mich für den Handel mit einem festen Risiko von 1 % des Kontoguthabens entschieden.

LiteForex: Erstellung eines Expert Advisor in MQL5

Klicken Sie auf "Fertig" und erzielen Sie Gewinne! Wir haben soeben einen Expert Advisor erstellt, ohne eine einzige Zeile Code zu schreiben.

Schauen wir uns das Ganze einmal genauer an und führen eine kleine Analyse der Quellen durch.

LiteForex: Erstellung eines Expert Advisor in MQL5

Tabellenkopf und Attribute - alles ist vertraut. Dann folgt die Einbindung von Bibliotheksmodulen. Expert ist unser Roboter. MACross ist ein Signalgenerator für die Überschreitung des gleitenden Mittelwerts, TrailingFixedPips ist ein Modul zur Steuerung des Grenzwerts, MoneyFixedRisk ist ein Modul des Risikomanagements. Dann folgen die Einstellungen, die Eingabevariablen enthalten, welche die Schnittstelle für die Interaktion mit der Anwendung definieren. Das kommt Ihnen sicher bekannt vor, oder? Ja, klar! Wir haben sie im Assistenten für die Erstellung von Expert Advisors eingerichtet. In Zukunft können die Standardwerte hier angepasst werden.

Im nächsten Schritt wird eine automatische globale Variable vom Typ CExpert deklariert, die mit einem Standardwert initialisiert wird. Für ein Objekt bedeutet dies, dass der Default-Konstruktor aufgerufen wurde. Im Body OnInit wird der EA initialisiert, Signale und Filter werden angelegt und mit den in den Einstellungen angegebenen Werten initialisiert. Nachfolgend ist der Code, aus dem ich alle Prüfungen der Initialisierungsergebnisse auf Erfolg und der Deskriptoren auf Gültigkeit entfernt habe, um den Codeumfang optisch zu reduzieren.

LiteForex: Erstellung eines Expert Advisor in MQL5

Unten stehen die Funktionen OnDeinit, OnTick, OnTimer, OnTrade. Jede davon ruft die entsprechende Methode der CExpert-Klasse auf.

LiteForex: Erstellung eines Expert Advisor in MQL5

Bei genauem Hinsehen können Sie im Navigator links im Ordner Include -> Experts die im Generator verfügbaren Signale und Module erkennen. Demzufolge lassen sich einige spezialisierte Lösungen zum Generator hinzufügen und für jeden Bedarf mit wenigen Klicks erzeugen.

Lassen Sie uns die Kompilierung des Codes probieren. 0 Fehler und 0 Warnungen bedeutet einen Erfolg. Um den Strategietestmodus zu starten, betätigen Sie gleichzeitig die Tasten Strg und F5, oder klicken Sie auf die Schaltfläche im grafischen Menü am oberen Rand. ​

LiteForex: Erstellung eines Expert Advisor in MQL5

In den Einstellungen des Strategietesters wird die Kontrolle an das MetaTrader-Kundenterminal übertragen. Wir wählen dann die zu testende Datei aus und konfigurieren die restlichen Parameter: Symbol, Zeitrahmen, Historientiefe, Saldo und Hebelwirkung des Handelskontos usw. Es gibt zahlreiche Einstellungen, und für jede von ihnen gibt es eine Beschreibung in der Referenzdatei. Um detaillierte Informationen zu den Einstellungen und dem Testmodus zu erhalten, wählen Sie den Tester aus und drücken Sie F1.

LiteForex: Erstellung eines Expert Advisor in MQL5

Zum Starten drücken Sie auf Start in der unteren rechten Ecke des Testers. Wenn der Test ohne Optimierung durchgeführt wird, können Sie den Visualisierungsmodus für Ihre Strategie auswählen.

Die Entwickler haben uns freundlicherweise eine Beschreibung für jedes eingebaute Modul und Signal auf https://www.mql5.com/de/docs/standardlibrary/expertclasses zur Verfügung gestellt. Nutzen Sie die Dokumentation, um Ihr Wissen in dieser Hinsicht zu erweitern.

Vor- und Nachteile der MQL4- und MQL5-Sprachen

Der Hauptnachteil liegt in dem eigentlichen Zweck dieser Sprachen. MetaQuotes Querying Language ist eine Sprache zum Erstellen von Anwendungen ausschließlich für MetaTrader. Das Kompilieren und Debuggen von MQL-Code ist nur in der MetaEditor-Umgebung möglich. Das Programm kann nur im MetaTrader-Kundenterminal zur Ausführung gestartet werden. Eine manuelle Speicherverwaltung existiert nicht. Sie haben immer noch die Wahl, die Variable auf dem Stack oder im dynamischen Bereich zu erstellen, doch in beiden Fällen haben Sie keinen Zugriff auf ihre virtuelle Adresse.

Es gibt viel mehr Vorzüge. Niedrige Einstiegshürde, insbesondere wenn Sie bereits Erfahrung in der Entwicklung in statisch typisierten Sprachen haben. Hohe Leistungsfähigkeit auf dem Niveau von C und C++. Unterstützung für objektorientierten Programmierstil: Kapselung und Erweiterbarkeit, Vererbung, Polymorphismus und virtuelle Methoden von Klassen. Es können Vorlagen für Klassen und Funktionen erstellt werden, d. h. parametrischer Polymorphismus. All dies ermöglicht eine vielfache Wiederverwendung des Codes. Die kostenlose Infrastruktur umfasst ein Handelsterminal, eine Entwicklungsumgebung, einen Strategietester und integrierte Bibliotheken.

Konvertierung von MQL4 zu MQL5

Lassen Sie uns die Transformation der Aktualisierung eines Programms von einer Version zu einer anderen am Beispiel eines Roboters betrachten, der zuvor in diesem Artikel im Abschnitt über die Fähigkeiten der Sprache vorgestellt wurde. Dazu erstellen Sie einen leeren Expert Advisor in MetaEditor 5 und kopieren den Quellcode des Expert Advisors MQL4_Example_EA hinein. Sie werden diesen Code nicht ohne Änderungen kompilieren können, beim Versuch werden viele Fehler auftreten.

Zunächst verändert sich fast nichts, bis auf ein paar Punkte:

  1. Entfernen Sie #property strict aus den Präprozessor-Direktiven, damit es beim Kompilieren von MQL4-Code Sinn ergibt.
  2. Übertragen Sie das Anlegen der statischen Variable Direction oberhalb der EA-Initialisierungsfunktion, um diese in OnInit auf bestimmte Weise zu initialisieren, abhängig von den verfügbaren Positionen. Dadurch wird es in Zukunft möglich sein, die EA-Einstellungen während des Handelsvorgangs zu ändern.

Beachten Sie, dass es jetzt einfacher ist, ein Geschäft für ein beliebiges Symbol in MQL5 mit der eingebauten Funktion PositionSelect auszuwählen, ohne alle offenen Transaktionen durchsuchen zu müssen.

LiteForex: Konvertierung von MQL4 zu MQL5

Lassen Sie uns die Funktion OnTick ausführlich betrachten. Wir verwenden PositionSelect, um nach einer offenen Position für ein Symbol zu suchen. Gibt es keine solche, dann gehen wir in den if-Body und bereiten uns auf das Senden einer Anfrage zum Öffnen eines Trades vor. MQL5 stellt uns praktischerweise die Struktur MqlTradeRequest zum Erstellen einer Anfrage bereit, im Gegensatz zu einer Reihe von Parametern in MQL4. Auf die einzelnen Felder werde ich jetzt nicht gesondert eingehen. Ich möchte nur anmerken, dass wir, genau wie in MQL4, 4 von 7 erforderlichen Parametern haben: Handelssymbol, Volumen, Richtung und Abweichung vom angeforderten Kurs. Die übrigen drei (Eröffnungskurs, Stopp Loss und Take Profit) berechnen wir in Abhängigkeit von der Transaktionsrichtung. Wir füllen die Struktur der Reihe nach aus. Jetzt besteht keine Notwendigkeit mehr, Gleitkommazahlen zu normalisieren, so dass die Ziffernvariable überflüssig ist.

Das Senden einer Anfrage ist in der neuesten Version der Sprache viel übersichtlicher. Alle Informationen über das Ergebnis der Ausführung der OrderSend-Funktion werden jetzt in MqlTradeResult an uns zurückgegeben.​

LiteForex: Konvertierung von MQL4 zu MQL5

Nach dem Debuggen und einer Reihe von Tests landete ich bei dem folgenden Code. Die Größe hat sich nicht geändert, obwohl wir eine Änderung in der Logik vorgenommen haben, die zusätzliche Aktionen in der Initialisierungsphase in OnInit erforderlich machte.

LiteForex: Konvertierung von MQL4 zu MQL5

Fassen wir zusammen. Ein Upgrade von Anwendungen von MQL4 auf MQL5 ist unkompliziert. Wenn Sie Grundkenntnisse in MQL haben, wird es Ihnen nicht schwer fallen, es selbst zu tun.

Des Weiteren habe ich speziell für Sie eine Reihe der häufigsten MQL-Fragen ausgewählt und versucht, sie kurz und bündig zu beantworten.

FAQ zu MQL4 und MQL5

MetaQuotes Language ist eine hochentwickelte Programmiersprache zum Schreiben von Anwendungen für die MetaTrader-Handelsplattform mit einer statischen schwachen Typisierung, deren Syntax der ihres Vorgängers C++ sehr ähnlich ist. MetaQuotes Language verwirklicht das Multi-Paradigma-Konzept. Beim Schreiben des Codes haben Sie die Möglichkeit, einen objektorientierten, funktionalen, prozeduralen oder gemischten Ansatz zu verwenden. OOP unterstützt Kapselung, Vererbung und Polymorphismus. Funktions- und Klassenvorlagen sind verfügbar. Es ist leider nicht möglich, Metaprogrammierung mit Kompilierzeitberechnung zu verwenden.

Um Programme in MQL zu schreiben, benötigen Sie das MetaTrader-Kundenterminal. Dessen Lieferumfang enthält eine Umgebung zur Entwicklung von Anwendungen in MQL namens MetaEditor. Wir starten ihn über das Hauptmenü Tools -> MetaQuotes Language Editor (F4). Jetzt können wir unser erstes MQL-Programm schreiben.

LiteForex: FAQ zu MQL4 und MQL5

Das Ergebnis der Ausführung eines solchen Programms im Handelsterminal ist die folgende Ausgabe:

LiteForex: FAQ zu MQL4 und MQL5

Mq4 ist eine gewöhnliche Textdatei. Diese Erweiterung ermöglicht es dem Betriebssystem, die Datei selbst automatisch mit der MetaEditor-Entwicklungsumgebung zu verbinden. Eine ex4-Datei ist eine ausführbare Datei, die sich nicht als Text lesen lässt und die Daten im Binärcode enthält.

Beim Kompilieren wird der mq4-Programmcode in einen ausführbaren ex4-Code konvertiert. Diese Umwandlung ist simpel und kommt bei der Programmerstellung sehr häufig vor. Und genau das macht der Compiler.

Der entgegengesetzte Vorgang, eine Dekompilierung (Disassemblierung) des ausführbaren ex4-Codes in mq4-Textcode, kommt selten vor und hat oft keine rechtliche Grundlage. Open-Source-Projekte stellen den Quellcode in der Regel jedem zur Verfügung, der sich mit den Regeln für die Verbreitung, Umwandlung und Nutzung einverstanden erklärt. Die übrigen Projekte schützen alle ihre Entwicklungen durch das Urheberrecht. Für die Durchführung der Dekompilierung gibt es keine Standardwerkzeuge.

Was ist aber, wenn Sie den ausführbaren Code der ex4-Datei wirklich in den Programmcode umwandeln müssen? Hier sind mehrere Antworten auf diese Frage, geordnet nach der zunehmenden Komplexität der Implementierung:

1. Wenden Sie sich an den Autor des Programms und erkundigen Sie sich nach den Bedingungen für die Bereitstellung des Codes.

2. Finden Sie einen Programmierer, der diese Logik in Ihrem ex4-Programm implementieren kann, und verhandeln Sie mit ihm.

3. Lernen Sie MQL und schreiben Sie selbst ein Programm, das gleichwertig zu dem ist, das Sie in Form von ex4 haben. Dieser Lösungsweg ist nicht einfach, aber er wird Ihre Möglichkeiten enorm erweitern.

4. Führen Sie die Dekompilierung selbst oder mit fremder Hilfe durch. Bitte beachten Sie die Haftung nach dem Urheberrechtsgesetz.

Mq4- und mq5-Dateien sind schlichte Textdateien, die den MQL-Code in Textform enthalten. Falls Sie Ihren eigenen Quellcode nicht weitergeben möchten, ist es in dieser Situation am einfachsten, die Dateien nicht in diesem Format zu verteilen.

Eine einfachere Möglichkeit, Ihren Code zu schützen besteht darin, ihn im ex4 (ex5) Format zu verteilen. Dateien in diesem Format werden von MetaEditor beim Kompilieren des mq4 (mq5)-Codes erzeugt. Gemäß den Sprachregeln werden die Anweisungen im Text in einen ausführbaren Binärcode umgewandelt, der vom Terminal ausgeführt wird, wenn Sie dem Chart einen Advisor, ein Skript oder einen Indikator zuführen.

Die Disassemblierung des ausführbaren Codes in den ursprünglichen Code ist keine einfache Aufgabe, was zum Schutz Ihres Quellcodes beiträgt. Beim Dekompilieren in den Quellcode gehen in jedem Fall sinnvolle Variablennamen Ihres Codes verloren, wodurch es viel schwieriger wird, die Programmlogik zu verstehen.

Die MetaQuotes-Sprache ist eine hochentwickelte OOP-Programmiersprache mit schwacher statischer Typisierung, abgeleitet von C++. MQL5 ist eine logische Weiterentwicklung der MQL4-Sprache, die gemeinsam mit der MetaTrader 5-Plattform veröffentlicht wurde. Später übte sie einen erheblichen Einfluss auf die Entwicklung von MQL4 aus und trug zu dessen Fortentwicklung bei.

In MQL5 gibt es ein Tool zum Generieren von Expert Advisors. Es ermöglicht es, vollständig auf das Schreiben von Code von Hand zu verzichten. Mit wenigen Klicks erhalten Sie einen Handelsroboter zusammen mit dem Quellcode. Das Einrichten für den Handel erfolgt über Signale. Die Überwachung des Status des Handelskontos basiert auf den Risiko- und Geldmanagementstrategien, die mit dem Handelsterminal zur Verfügung gestellt werden.

Das Herunterladen von Indikatoren unterscheidet sich nicht vom Herunterladen jeder anderen Datei auf Ihren Computer. Dies muss auf einem PC erfolgen, da MQL nur mit der Desktop-Version vom MetaTrader-Kundenterminal genutzt werden kann. Öffnen Sie das Arbeitsverzeichnis des Terminals (Datei -> Datenordner öffnen). Wechseln Sie anschließend in das Verzeichnis MQL/indicators und fügen Sie hier den geladenen Indikator ein. Nach dem Neustart des Terminals wird der Indikator im Navigator verfügbar sein. Sie müssen ihn nur noch in den Chart verschieben und die Eingabeparameter anpassen.

Faktisch werden alle MQL4- oder MQL5-Programme mit der fünften Version des MetaQuotes Language Editor erstellt. Zwischen den Haupt- und Nebenversionen der Sprache besteht eine Abwärtskompatibilität. Einzige Einschränkung ist in diesem Fall der MetaQuotes Server selbst. In der vierten Version der Plattform fehlen einige Funktionen und Strukturen. Die Logik der Verarbeitung von Handelsoperationen in der fünften Version des Servers wurde zum Teil geändert. Auch in der internen Struktur der Indikatoren gibt es Unterschiede. In der vierten Version können nicht mehr als acht Indikatorpuffer verwendet werden. Die Anzahl der Puffer wurde im MetaTrader 5 auf 21 erhöht.

Mit der eingebauten iCustom-Funktion können Sie Signale von Indikatoren verwenden, um die Handelslogik innerhalb des EA zu implementieren. Sollten Sie einen eigenen Indikator haben und im Advisor Handelssignale generieren wollen, um Handelsaktionen auszuführen, müssen Sie dafür iCustom verwenden. Schauen wir uns die Dokumentation an. Hier können Sie die folgende Definition von MQL4 sehen:

LiteForex: FAQ zu MQL4 und MQL5

MQL5-Definition:

LiteForex: FAQ zu MQL4 und MQL5

Im Grunde genommen macht die Funktion das Gleiche, auch wenn ihre Signatur in der vierten und fünften Version der Sprache nicht identisch ist. Schauen wir uns die einzelnen Parameter genauer an:

1. Zeichenketten-Symbol Zeile. Das ist das zu berechnende Symbol.

2. Zeitrahmen. In MQL4 ist es ein Integer-Typ int. In MQL5 ist es auch ein Integer, aber enum, das Aufzählungen von Zeitrahmen enthält.

3. String-Parametername. Hier muss der Pfad zum Indikator übergeben werden (wenn er sich z.B. in einem anderen Verzeichnis befindet) und auch der Name des Indikators zusammen mit der Erweiterung, für die wir berechnen wollen. Anschließend werden die erforderlichen Parameter für den zu verwendenden Indikator übergeben.

4. Eine Parameterliste für den Indikator, der von der iCustom-Funktion gestartet werden soll. Die Anzahl richtet sich danach, wie viele Argumente benötigt werden, um den gewünschten Wert von Ihrem Indikator zu erhalten. Sinnvollerweise nimmt die Funktion eine variable Anzahl von Parametern. Beispielsweise für Alligator (er ist im Installationspaket des MetaTrader-Kundenterminals enthalten):

LiteForex: FAQ zu MQL4 und MQL5

Oder beispielsweise für Ichimoku wird es ein anderer Satz von Variablen sein:

LiteForex: FAQ zu MQL4 und MQL5

Im ersten Fall müssen Sie daher 6 Parameter an die Funktion übergeben, um den richtigen Wert zu erhalten, und im zweiten Fall 3.

5. Es gibt zwei zusätzliche Parameter in MQL4 der vierten Version. Der erste ist ein Integer-Modus, der den Indikator-Zeilenindex bezeichnet und von der Laufzeit für die interne Indizierung von Datenpuffern benutzt wird.

6. Der zweite, integer shift, bezeichnet die Vorwärts- oder Rückwärtsverschiebung des Indikators auf der Zeitachse.

MQL ist der Nachfolger der Sprache C++, in welcher der MetaTrader-Handelsserver und alle zugehörigen Anwendungen, einschließlich Kundenterminal und Language Editor, geschrieben sind. Betrachtet man MQL im Vergleich zu seinem Vorfahren, wird leider deutlich, dass sich die Sprache mit Verzögerung entwickelt. Gegenwärtig entsprechen die Fähigkeiten von MQL denen des C++-Standards von 2003. Es sei angemerkt, dass MQL eine sehr leistungsstarke Sprache ist und 99 % der aktuellen Bedürfnisse von Programmierern und Entwicklern abdecken kann.

Auf den ersten Blick unterscheidet sich der Code der Programme in den Versionen 4 und 5 nur unwesentlich, aber es gibt dennoch Unterschiede. In der fünften Version sind alle Makros aus der vierten Version durch Enumerationen ersetzt worden.

Das Ereignismodell zum Starten von benutzerdefinierten Anwendungen wurde erweitert. Es gibt eine Reihe von Event-Handlern wie OnTrade, OnTradeTransaction, OnTesterInit, OnTesterDeinit, OnTesterPass. Fehlerhaftes Verhalten von OnTick und OnTimer im Strategietester-Modus wurde behoben. Die OnTimer-Funktion kann jetzt mit einer 1000-fach höheren Timer-Abtastrate als in MQL4 laufen. Ein Mal pro Mikrosekunde im Gegensatz zu mehreren Millisekunden.

MQL5 ändert die Logik für das Senden von Handelsaufträgen und den Mechanismus für deren Beantwortung. Mehrere Handelsfunktionen in MQL4 sind zu einer einzigen mit verschiedenen Betriebsmodi namens OrderSend zusammengefasst worden. Der Handelsablauf selbst in MetaTrader 5 begann sich vom Handel auf der vierten Plattform zu unterscheiden. Neben einer Funktion, die Hedge-Transaktionen ermöglicht, wurde ein Positions-Netting-Modus eingeführt. Ergänzend zu den MT4-Orders sind nun auch Positionen und Trades erschienen. Die Sprache verfügt jetzt über die Funktion OrderSendAsync zum Senden von Anfragen an den Handelsserver im asynchronen Modus.

Alle MQL4-Makros in MQL5 wurden durch Enumerationen ersetzt, so dass der Entwickler jetzt vom Compiler auf implizite Typumwandlungen hingewiesen wird.

MetaTrader 5 gibt Ihnen die Möglichkeit, mit 21 Standard-Zeitfenstern zu handeln, verglichen mit 9 Zeitfenstern in MetaTrader 4. Indikatoren in MQL5 haben eine größere Anzahl von Puffern auf dem Chart erhalten.

Das Konvertieren von MQL4 nach MQL5 ist für einen Programmier-Anfänger eine triviale Aufgabe. Es erfordert jedoch Ihre Aufmerksamkeit und Geduld. Der Compiler wird die meisten Dinge, die mit MQL5 inkompatibel sind, von sich aus anzeigen.

Achten Sie auf die Verarbeitung von Handelsaufträgen und deren Übermittlung an den Server.

· In MQL4 wird eine Handelsanfrage mit der Funktion OrderSend und einem Satz von Parametern dafür implementiert. Das Ändern einer Order und das Löschen einer ausstehenden Order werden durch separate Funktionen implementiert. Das Resultat der Abfrage wird durch den booleschen Wert bestimmt, der am Ende der Funktion ausgegeben wird. Die Auswertung des Ergebnisses reduziert sich auf die Ermittlung des Server-Rückgabecodes mit Hilfe der Funktion GetLastError.

· MQL5 hat eine spezielle MqlTradeRequest-Struktur zum Senden von Handelsaufträgen an den Server. Diese müssen Sie mit dem entsprechenden Typ der Operation und dem Ordertyp füllen. Um das Resultat zu erhalten, müssen Sie beim Aufruf von OrderSend eine Instanz der MqlTradeResult-Struktur deklarieren und per Referenz übergeben, um eine Antwort vom Server entgegenzunehmen. Anschließend müssen Sie die verschiedenen Parameter, die zuvor beim Aufruf von OrderSend übergeben wurden, zu einer einzigen MqlTradeRequest-Struktur kombinieren und an den Server übertragen. Wir analysieren die als Antwort erhaltene MqlTradeResult-Struktur. Alle notwendigen Informationen sind in der Antwort des Servers verfügbar.

Achten Sie besonders auf Event-Handler in Ihrem Code. MQL5 besitzt zusätzlich OnTesterTick, OnTesterTimer, OnBookEvent. Als Reaktion auf Ereignisse vom Handelsterminal werden verschiedene Anwendungen gestartet.

Für Experten:

OnInit, OnDeinit, OnTimer, OnTick, OnChartEvent, OnTester

Für Indikatoren:

OnInit, OnDeinit, OnTimer, OnCalculate, OnChartEvent, OnTester

Für Skripte:

OnStart (dieser Handler kann nicht in Indikatoren und Skripten eingesetzt werden).

Für die enthaltenen Bibliotheken gibt es keine Startmöglichkeit, da sie ausschließlich im Rahmen anderer größerer Projekte genutzt werden.

Ein weiterer Unterschied besteht darin, dass die vordefinierten Variablen Ask, Bid, sowie die Arrays Open [], High [], Low [], Close [], Volume [], Time [] in MQL5 fehlen. Der Programmcode muss daher korrigiert werden, um diese Daten mit den integrierten Funktionen für den Zugriff auf die Zeitreihen CopyRates, CopyOpen, CopyHigh, etc. selbständig zu erhalten. Deklarieren Sie ein dynamisches Array und holen Sie sich die Daten in dieses Array. Die Funktion, die das Ergebnis liefert, übernimmt die Größenänderung des Arrays selbständig.


P.S.: Mögen Sie meinen Artikel? Dann wäre ich Ihnen sehr dankbar, wenn Sie ihn in sozialen Netzwerken teilen :)

Hilfreiche Links:

  • Ich empfehle, hier bei einem zuverlässigen Broker zu handeln. Das System ermöglicht es Ihnen, selbst zu handeln oder erfolgreiche Trader aus aller Welt zu kopieren.
  • Telegram-Chat für Trader: https://t.me/litefinance. Wir geben Ihnen Signale und Trading-Tipps
  • Telegram-Kanal mit erstklassigen Analysen, Forex-Berichten, Trainingsartikeln und weiteren nützlichen Ressourcen für Trader https://t.me/litefinance
Metaquotes-Sprachen MQL4 vs. MQL5: Unterschied & Anleitung zur Programmierung

Der vorliegende Artikel gibt die Meinung des Autors wieder und spiegelt nicht unbedingt die Meinung des Brokers LiteForex wider. Die auf dieser Seite veröffentlichten Materialien dienen ausschließlich Informationszwecken und sollten nicht als Anlageberatung im Sinne der Richtlinie 2014/65/EU angesehen werden.
Gemäß dem Urheberrechtsgesetz gilt dieser Artikel als geistiges Eigentum, welches auch das Verbot beinhaltet, ihn ohne Zustimmung zu vervielfältigen und zu verbreiten.

Diesen Artikel bewerten:
{{value}} ( {{count}} {{title}} )
Handel starten
Folgen Sie uns in den sozialen Netzwerken!
Live Chat