- Programmausführung
- Handelserlaubnis
- Eregnisse des Client-Terminals
- Ressourcen
- Aufruf der Importfunktionen
- Ausführungsfehler
- Testen von Handelsstrategien
Durchführung der Programme
Jedes Skript, jeder Dienst und jeder Expert Advisor läuft in einem separaten Thread. Alle Indikatoren, die auf einem Symbol berechnet werden, auch wenn sie verschiedenen Charts zugeordnet sind, arbeiten im gleichen Thread. Somit teilen sich alle Indikatoren auf einem Symbol die Ressourcen eines Threads.
Alle anderen Aktionen, die mit einem Symbol verbunden sind, wie die Verarbeitung von Ticks und die Synchronisation der Geschichte werden auch konsequent in dem selben Thread mit Indikatoren durchgeführt. Dies bedeutet, dass, wenn der Indikator hält unendliche Aktion, alle anderen Ereignisse in diesem Symbol nie durchgeführt werden.
Beim Starten eines Expert Advisors, stellen Sie sicher dass er aktuelle Handelsumwelt hat und Geschichte des Symbols für die Periode, und synchronisieren Sie Daten zwischen dem Terminal und dem Server. Für alle diese Verfahren stellt das Terminal eine Startverzögerung von nicht mehr als 5 Sekunden, wonach der Expert Advisor mit verfügbaren Daten gestartet wird. Daher, wenn es kein Verbindung zum Server gibt, kann dies zu einer Verzögerung des Starts des Expert Advisors führen.
Eine kurze Zusammenfassung des MQL5-Programmen ist in der Tabelle dargestellt:
Programm |
Durchführung |
Bemerkung |
---|---|---|
Service (Dienst) |
Ein separater Thread, die Anzahl der Threads für Dienste ist gleich der Anzahl der Dienste. |
Ein Dienst mit einer Schleife kann den Betrieb anderer Programme nicht unterbrechen. |
Skript |
In einem eigenen Thread, wie viele Skripte, so viele Ausführungsthreads für sie |
Ein endloses Skript kann nicht Ausführung andere Programme brechen |
Expert Advisor |
In einem eigenen Thread, wie viele Expert Advisors, so viele Ausführungsthreads für sie |
Ein endloser Expert Advisor nicht Ausführung andere Programme brechen |
Indikator |
Ein Thread für alle Indikatoren auf ein Symbol. Wie viele Symbole mit Indikatoren, so viele Ausführungsthreads für sie |
Eine Endlosschleife in einem des Indikators wird Ausführung aller anderen Indikatoren auf diesem Symbol stoppen |
Sofort nach Anhängen des Programms zum Chart Erfolgt sein Einspeichern in Client-Terminal und in Speicher des Client-Terminals und Initialisierung der globalen Variablen. Wenn eine der globalen Variablen des Typen Klasse Konstrukteur hat, wird dieser Konstrukteur während der Initialisierung der globalen Variablen aufgerufen werden.
Danach wartet das Programm auf das Ereignis vom Client-Terminal. Jedes mql5-Programm muss wenigstens eine Funktion-Bearbeiter des Ereignisses haben, sonst wird das Programm nicht durchgeführt werden. Funktionen-Bearbeiter haben vorbestimmte Namen, vorbestimmte Parametervorraete und vorbestimmte Rückkehrtypen.
Typ |
Funktionsname |
Parameter |
Anwendung |
Bemerkung |
---|---|---|---|---|
int |
keine |
Experten und Anzeiger |
Bearbeiter des Ereignisses Init. Zugelassen Typ des Rückgabewertes void. |
|
void |
const int reason |
Experten und Anzeiger |
Bearbeiter des Ereignisses Deinit. |
|
void |
keine |
Skripte und Dienste |
Start Ereignisbehandlung. |
|
int |
const int rates_total, const int prev_calculated, const datetime &Time[], const double &Open[], const double &High[], const double &Low[], const double &Close[], const long &TickVolume[], const long &Volume[], const int &Spread[] |
Anzeiger |
Bearbeiter des Ereignisses Calculate für alle Preisdaten. |
|
int |
const int rates_total, const int prev_calculated, const int begin, const double &price[] |
Anzeiger |
Ereignisbearbeiter Calculate in einem Datenfeld. In Indikator können nicht 2 Bearbeiter Calculate gleichzeitig sein. In diesem Fall wird nur ein Ereignisbearbeiter Calculate in einem Datenfeld funktionieren. |
|
void |
keine |
Experten |
Ereignisbearbeiter NewTick. Wenn das Ereignis des neuen Ticks verarbeitet wird, werden andere Ereignisse dieses Typs nicht aufgenommen. |
|
void |
keine |
Experten und Anzeiger |
Ereignisbearbeiter Timer. |
|
void |
keine |
Experten |
Ereignisbearbeiter Trade. |
|
double |
keine |
Experten |
Ereignisbearbeiter Tester. |
|
void |
const int id, const long &lparam, const double &dparam, const string &sparam |
Experten und Indikatoren |
Ereignisbearbeiter ChartEvent. |
|
void |
const string &symbol_name |
Experten und Indikatoren |
Ereignisbearbeiter BookEvent. |
Der Client-Terminal sendet die neuen Ereignisse in die entsprechende offene Charts. Darüber hinaus können die Ereignisse durch Charts (Chartsereignisse) oder MQL5-Programme (benutzerdefinierte Ereignisse) generiert werden. Generierung von Ereignisse der Erstellung oder Löschen von graphischen Objekten auf einen Chart kann durch CHART_EVENT_OBJECT_CREATE und CHART_EVENT_OBJECT_DELETE Chartseigenschaften aktiviert oder deaktiviert werden. Jedes MQL5-Programm und jeder Chart hat eine eigene Warteschlange von Ereignissen, in die alle neu eingehenden Ereignisse hinzugefügt werden.
Ein Programm erhält Ereignisse nur aus dem Chart, auf dem es läuft. Alle Ereignisse werden nacheinander in der Reihenfolge des Eingangs bearbeitet. Wenn eine Warteschlange bereits eine NewTick Ereignis hat, oder dieses Ereignis ist gerade in Bearbeitung, dann wird nicht die neue NewTick Ereignis in der Warteschlange des MQL5 Programms platziert. Auch wenn ChartEvent bereits in der Warteschlange ist, oder dieses Ereignis in Bearbeitung ist, wird kein neues Ereignis dieser Art eingerichtet werden. Die Timer-Ereignisse werden auf die gleiche Weise behandelt – wenn ein Timer-Ereignis in der Warteschlange ist oder behandelt wird, die neue Timer-Ereignis wird nicht in der Warteschlange platziert.
Ereignis-Warteschlangen haben eine begrenzte, aber ausreichende Größe, so dass die Warteschlange-Überlauf für gut geschriebene Programme unwahrscheinlich ist. Im Falle einer Warteschlange-Überlauf, werden neue Ereignisse ohne Wartezeiten verworfen.
Es wird dringend empfohlen, keine Endlosschleifen zur Behandlung von Ereignissen zu verwenden. Mögliche Ausnahmen sind Skripte und Dienste, die ein einzelnes Start-Ereignis behandeln.
Bibliotheken verarbeiten keine Ereignisse.
Das Verbot der Verwendung von Funktionen in Indikatoren und Experten
Indikatoren, Skripte und Expert Advisors sind in MQL5 geschriebene ausführbare Programme. Sie sind für verschiedene Arten von Aufgaben ausgelegt. Deshalb gibt es einige Beschränkungen für die Verwendung bestimmter Funktionen, abhängig von der Art des Programms. Die folgenden Funktionen werden in Indikatoren verboten:
- OrderCalcMargin();
- OrderCalcProfit();
- OrderCheck();
- OrderSend();
- SendFTP();
- Sleep();
- ExpertRemove();
- MessageBox().
Alle Funktionen für Indikatoren sind in Expert Advisors und Skripte verboten:
- SetIndexBuffer();
- IndicatorSetDouble();
- IndicatorSetInteger();
- IndicatorSetString();
- PlotIndexSetDouble();
- PlotIndexSetInteger();
- PlotIndexSetString();
- PlotIndexGetInteger.
Die Bibliothek ist kein eigenständiges Programm und wird im Rahmen des Programms MQL5, die sie aufgerufen hat, ausgeführt: Skript, Indikator oder Expert Advisor. Dementsprechend werden die oben genannten Beschränkungen für die genannte Bibliothek angewendet.
Die in den Diensten verbotenen Funktionen
Die Dienste akzeptieren keine Ereignisse, da sie nicht an ein Chart gebunden sind. Die folgenden Funktionen sind bei Diensten verboten:
Laden und Ausladen der Indikatoren
Indikatoren werden in folgenden Fällen ausgeladen:
- Anhängen des Indikators zum Chart;
- Start des Terminals (wenn Indikator vor dem früheren Terminalschliessen zum Chart angehängt wurde);
- Laden der Schablone (wenn in der Schablone Indikator angegeben wird, angehängt zum Chart);
- Profilwechsel (wenn Indikator zum einen der Profilcharts angehängt wird);
- Wechsel des Symbols und/oder Chartperiode, zu dem der Indikator angehängt wird;
- Änderung des Kontos, zu dem das Terminal verbunden ist;
- nach erfolgreicher Neucompilierung des Indikators, wenn dieser Anzeiger zum Chart angehängt wurde.
- Wechsel der Eingabeparameter des Indikators.
Indikatoren werden in folgenden Fällen ausgeladen:
- bei Abtrennung des Indikators vom Chart;
- Terminalschliessen (wenn Indikator zum Chart angehängt wurde);
- Laden der Schablone, Indikator zum Chart angehängt wird;
- Schliessen des Charts, zu dem Indikator angehängt wurde;
- Profilwechsel, wenn Indikator zu einem der Charts des Wechselprofils angehängt wird;
- Wechsel des Symbols und/oder Chartperiode, zu dem Indikator angehängt wird;
- Änderung des Kontos, zu dem das Terminal verbunden ist;
- Wechsel der Eingabeparameter des Indikators.
Laden und Ausladen der Experte
Laden des Experten erfolgt in folgenden Fällen:
- Anhängen von Experten zum Chart;
- Start des Terminals (wenn Expert vor dem früheren Terminalabschluss zum Chart angehängt wurde);
- Laden der Schablone (wenn in der Schablone Expert angegeben wird, angehängt zum Chart);
- nach erfolgreicher Neucompilierung des Experten, wenn dieser Expert zum Chart angehängt wurde.
- Profilwechsel (Wenn Expert zum einen der Profilcharts angehängt wird);
- Verbindung zu einem Konto, auch wenn die Kontonummer nicht geändert wurde (wenn der Expert Advisor wurde um den Chart, bevor die Zulassung des Terminals auf dem Server, verbunden).
Ausladen des Experten, angehängt zum Chart erfolgt in folgenden Fällen:
- bei Abtrennung des Experten vom Chart;
- beim Anhängen des Experten zum Chart - wenn auf dem Chart einen anderen Experten gab, wird dieser Expert ausgeladen;
- Terminalschliessen, wenn der Expert zum Chart angehängt wurde;
- Laden der Schablone, wenn der Expert zum Chart angehängt wird;
- Schliessen des Charts, zu dem Expert angehängt wurde;
- Profilwechsel, wenn der Expert zum einen der Charts der Wechselprofile angehängt wird;
- Änderung des Kontos, zu dem das Terminal verbunden ist (wenn der Expert Advisor wurde um den Chart, bevor die Zulassung des Terminals auf dem Server, verbunden);
- Aufruf der Funktion ExpertRemove().
Beim Wechsel des Symbols oder Timeframe des Charts, zu dem Expert angehängt wird, erfolgt Laden und Ausladen des Experten nicht. Dabei werden Bearbeiter OnDeinit() auf altem Symbol/Timeframe und OnInit() auf neuem Symbol/Timeframe (wenn es die solchen geben) serienweise aufgerufen, Werte der globalen Variablen und statischer Variablen werden nicht auf Null gesetzt. Alle Ereignisse, die vor dem Initialisierungsende (Funktion OnInit()) erscheinen, werden weggelassen.
Laden und Ausladen von Scripts
Scripts werden sofort nach Anhängen zum Chart geladen und sofort nach Operationsende ausgeladen. Dabei werden die Funktionen OnInit() und OnDeinit() für Scripts nicht aufgerufen.
Beim Programmausladen (Programmenfernen vom Chart) erfolgt Deinitialisierung der globalen Variablen und Entfernung der Queue von Ereignissen. In diesem Fall bedeutet Deinitialisierung Freigabe der Variablen des Typs string, Freigabe der Objekte der dynamischen Felder und Aufruf der Destruktors, wenn sie es geben.
Laden und Löschen von Diensten
Dienste werden unmittelbar nach dem Start des Terminals geladen, wenn sie zum Zeitpunkt der Terminalabschaltung gestartet wurden. Das Löschen der Dienste erfolgt unmittelbar nach Beendigung ihrer Arbeit.
Dienste haben nur eine einzige Funktion, OnStart(), in der Sie eine Endlosschleife für Empfang und Behandeln der Daten implementieren können, z.B. um nutzerdefinierte Symbole mit Hilfe der Netzwerkfunktionen zu erstellen und zu aktualisieren.
Im Gegensatz zu Expert Advisors, Indikatoren und Skripten sind Dienste nicht an ein bestimmtes Chart gebunden, daher wird ein separater Mechanismus bereitgestellt, um sie zu starten. Im Navigator wird mit dem Befehl "Dienst starten" eine neue Instanz des Dienstes angelegt. Eine Dienst-Instanz kann über das entsprechende Menü der Instanz gestartet, gestoppt und entfernt werden. Um alle Instanzen zu verwalten, verwenden Sie das Menü der Dienste.
Für bessere Verständigung der Expertenarbeit ist es empfehlenswert, Kode des im Beispiel angeführten Experten zu kompilieren und Operationen von Laden/Ausladen der Experten, Schablonen-, Symbol-, Timeframewechsel usw. durchführen.
Beispiel:
//+------------------------------------------------------------------+ |
Scripts werden sofort nach Anhängen zum Chart geladen und sofort nach Operationsende ausgeladen.
Sehen Sie auch