# MetaQuotes Language MQL4/MQL5

MQL4 (MetaQuotes Language 4) und MQL5 (MetaQuotes Language 5) sind integrierte Programmiersprachen für die Entwicklung von Handelsrobotern, technischen Marktindikatoren, Skripten und Funktionen-Bibliotheken innerhalb der MetaTrader-Software.
Das Hauptziel von MQL4 und MQL5 ist der automatisierte Handel und das Erleichtern von fortlaufenden Auswertungen. MQL4 und MQL5 verfügen über umfangreiche codebase-Bibliotheken mit Quellcodes für das Entwickeln von Handelsrobotern.

## Entwicklung

Am 1. Juli 2005 veröffentlichte MetaQuotes Software den MetaTrader 4 – eine Handelsplattform für den Finanzmarkt. MQL4 – eine objektorientierte Programmiersprache – wurde speziell für diese Plattform entwickelt. Ursprünglich basiert dessen Syntax auf C. Die andere Plattform, MetaTrader 5, wurde 2010 zusammen mit MQL5 – dessen neue Sprache – veröffentlicht.
Die Freigabe des MetaTrader 4 build 600 im Jahr 2014 umfasste eine umfangreiche Weiterentwicklung seiner Sprache. Sie brachte sie auf das Niveau der moderneren MQL5. Die Entwicklungsumgebung MetaEditor wurde für beide Sprachen vereinheitlicht.
MQL4 verfügt seitdem über neue Grafikobjekte und Funktionen aus MQL5 für die Chartanalyse. Der Systemschutz wurde für die ausführbaren Dateien EX4 komplett modifiziert. Die Standardbibliotheken von MQL5 wurden, mit Ausnahme des Handelssystems, fast komplett mit den notwendigen Anpassungen übertragen. Es wurden neue Datentypen und eine erweiterte Mikrosubstitution (bedingte Kompilierung #ifdef, #ifndef, #else, #endif) eingeführt, die das Verwenden des Codes anderer Programmiersprachen auf der Basis von С/C++ erlaubt. Strukturen, Klassen und Zeiger auf Objekte wurden auch übernommen (die Zeiger auf Objekte in MQL4/MQL5 entsprechen nicht ganz denen von С++). Das aktualisierte MQL4 bietet den Modus des strikten Kompilierens, der viele mögliche Programmierfehler vermeidet. In MQL5 ist dieser Modus voreingestellt und kann nicht deaktiviert werden.
Beide Sprachen unterstützen nahezu alle Standards der objektorientierten Programmierung mit Ausnahme der Mehrfachvererbung: Datenkapselung und Typenerweiterung, Vererbung, Polymorphie, Überladen, Virtuelle Methoden.

## Compiler

Für die Programmentwicklung in MQL4 und MQL5 mit dem MetaEditor wurde ein Compiler in die Entwicklungsumgebung integriert. Er ist Teil der Handelsterminals von MetaTrader 4/MetaTrader 5. Der MetaEditor ermöglicht ein komfortables Editieren des Programm-Quellcodes, ein automatisches Erzeugen von Projekten anhand einer Vorlage, ein Erstellen von Profilen und das gemeinsame Entwickeln von Anwendungen mit anderen Personen an unterschiedlichen Orten.

## Unterschiede zwischen MQL4 und MQL5

Einer der grundlegenden Unterschiede ist die Einrichtung des Handelssystems. In MQL4 werden Handelsprogramme auf der Basis von Handelsaufträgen entwickelt, in MQL5 wird stattdessen ein Positionierungssystem implementiert. Im Handelsterminal des MetaTrader 5 gibt es eine strikte Trennung zwischen dem Konzept der Position, Auftrag und dem Abschluss (deal). Ein Auftrag (order) ist eine Aufforderung zur Ausführung einer Handelstätigkeit, die zu einem Handelsgeschäft führen kann. Eine Position ist die Summe der Abschlüsse eines bestimmten Finanzinstruments.
MQL5 enthält eine erweiterte Liste von Handelsfunktionen für die Arbeit mit offenen Aufträgen, eine Liste offener Positionen, die Auftragshistorie und den Verlauf der Abschlüsse. In MQL4 werden die verschiedenen integrierten Funktionen, wie OrderSend, OrderClose, OrderCloseBy, OrderModify, OrderDelete, für die Durchführung der einzelnen Handelsoperationen verwendet. Diese Funktionen werden auch zum Öffnen, Schließen und Löschen schwebender Aufträge verwendet.
In MQL5 werden alle Handelsvorgänge durch das Senden von Handelsanfragen mit nur einer Funktion ausgeführt: OrderSend. Der Funktion werden die Aufträge – sei es einen schwebenden Auftrag zu platzieren, eine Marktorder zu öffnen oder eine bereits platzierte Order zu stornieren – als Parameter übergeben. Mit der Einführung der neuen Funktion OrderSendAsync verfügt MQL5 jetzt auch über asynchrone Handelstätigkeiten.
Eine wichtige Neuheit von MQL5 ist die Markttiefe (Depth of Market) und ein neuer Ereignistyp für die Behandlung der Informationen der Markttiefe.

## Möglichkeiten

MQL4/MQL5 zielen direkt auf die Erfüllung der Bedürfnisse und Anforderungen von Händlern. Sie wurden für das Schreiben von Handelsprogrammen entwickelt und werden nur zu diesem Zweck verwendet. Funktionen für die Durchführung von Handelsoperationen OrderSend, OrderClose, OrderCloseBy, OrderModify, OrderDelete sind von Anfang an Bestandteil der Sprachen und werden zum Ändern des Status des Handelskontos verwendet.
Es gibt vier Programmtypen, die mit MQL4/MQL5 erstellt werden können:
* Expert Advisor. Automatische Systeme, die mit bestimmten Parametern handeln und einem programmierten Algorithmus folgen. Das Auftreten eines vorher festgelegten Ereignisses, wie z. B. das Empfangen eines neuen Kurses, die Benachrichtigung über einen neuen Handelsvorgang oder auch das Drücken einer Taste oder eines Mausklicks, löst beim Expert Advisor die Ausführung einer programmierten Aktion aus.
* Nutzerindikatoren. Vom Anwender geschrieben, können sie zusammen mit den im Terminal integrierten Indikatoren verwendet werden. Ihre Funktion ist rein analytisch. Indikatoren führen keinen Handel und keine Operationen aus, die den Datenstrom der Schnittstelle verlangsamen, wie z. B. das Versenden von E-Mails oder zufällige Verzögerungen. Die Hauptaufgabe von Indikatoren besteht darin, eine Situation zu überwachen, sie zu reflektieren und zu interpretieren und sie dann einem Händler für die Analyse darzustellen.
* Skripte. Ein Skript ist ein Programm zur einmaligen Ausführung einer Aktion. Der Start ist der einzige Ereignistyp, der vom Skript verarbeitet wird.
* Benutzerdefinierte Funktionen-Bibliotheken. Darüber hinaus besteht die Möglichkeit, eigene Include-Dateien (#include) zu erstellen. Mit Include-Dateien können Anwender die am häufigsten verwendeten Funktionen und Klassen einbinden, ohne deren Quellcode direkt in das Programm einfügen zu müssen. Die Verwendung von Funktionen und Klassen vereinfacht das Anlegen, Debuggen und Kompilieren, da die Funktionen bei der Verwendung dynamischer Bibliotheken nur dann geladen werden, wenn sie direkt aufgerufen werden.

## Die Syntax von MQL4 und MQL5 und ihr Unterschied zu С++

Die Syntax der Sprachen ist ähnlich der von C++, allerdings gibt es Ausnahmen. MQL4 und MQL5 verfügen über keine Pointerarithmetik. Auch gibt es weder goto-Anweisungen in den MQL-Sprachen noch die Möglichkeit, anonyme Enumerationen zu definieren oder eine Mehrfachvererbung.
* Textformatierung: Beliebig viele Leerzeichen wie das Leerzeichen selbst, Tabulatorzeichen und leere Zeichenketten können verwendet werden, um den Code lesbarer und leichter bearbeitbar zu machen. Es gibt allerdings auch Ausnahmen. Ein Zeilenumbruch darf nicht unmittelbar nach einem Hash verwendet werden; und Leerzeichen können nicht innerhalb von Konstanten, Bezeichnern und Schlüsselwörtern stehen.
* Kommentare: Wie in C/C++, können Kommentare in MQL4/MQL5 ein- oder mehrzeilig sein. Ein einzeiliger Kommentar beginnt mit // und endet mit dem Zeilenendzeichen. Mehrzeilige Kommentare beginnen mit /* und enden mit */. Sie können nicht verschachtelt werden.
* Bezeichner: Bezeichner können als Namen für Variablen und Funktionen verwendet werden. Die Länge eines Bezeichners darf 63 Zeichen nicht überschreiten. Folgende Zeichen können beim Schreiben eines Bezeichners verwendet werden: Die Zahlen 0–9, lateinische Groß- und Kleinbuchstaben a–Z und das Unterstreichungszeichen (_) werden als unterschiedliche Zeichen erkannt. Eine Zahl kann nicht als erstes Zeichen verwendet werden.

## Datentypen

Die wichtigsten Datentypen in MQL4/MQL5 sind:
* Ganze Zahlen (char, short, int, long, uchar, ushort, uint, ulong);
* Boolescher oder logischer Typ (bool);
* Einzelzeichen (ushort);
* Zeichenkette (string);
* Gleitkommazahlen (double, float);
* Farben (color);
* Datum und Zeit (datetime);
* Enumeration (enum).
Strukturen und Klassen sind komplexe (abstrakte) Datentypen, die in MQL4/MQL5 verwendbar sind. Klassen unterscheiden sich von Strukturen in folgenden Punkten:
* Das Schlüsselwort class bei der Deklaration;
* Alle Mitglieder einer Klasse können standardmäßig auf als 'private' deklarierte Elemente zugreifen, wohingegen die Mitglieder einer Struktur nur auf die, die als 'public' deklariert sind, zugreifen können;
* Klassenobjekte haben immer eine Tabelle mit virtuellen Funktionen, etwas, das Strukturen nicht haben;
* Die Anweisung new kann nur auf Klassenobjekte angewendet werden, nicht aber auf Strukturen;
* Vererbung: Eine Klasse kann nur von einer Klasse abgeleitet werden (erben), eine Struktur nur von einer Struktur.

## Anweisungen und Ausdrücke

Alle gewöhnlichen Anweisungen – arithmetische, logische, binäre etc. – existieren in MQL4/MQL5. Die Rangfolge der Anweisungen entspricht der in C++.

## Kritik

Der Hauptnachteil der Sprachen der MQL-Familie ist die Unmöglichkeit, unabhängige Anwendungen zu erstellen, da jede Sprache mit ihrer entsprechenden Plattform (MetaTrader 4/MetaTrader 5) verbunden ist und die Programme EX4/EX5 nur in ihnen funktionieren.