Aufruf der Importfunktionen

für Import der Funktionen während der Ausführung des mql5-Programmes wird frühe Bindung verwendet. Das bedeutet wenn es im Programm Aufruf der Importfunktion gibt, wird der entsprechende Modul (ex5 oder dll) beim Programmladen geladen. Bibliotheken MQL5 und DLL Werden im Thread des Aufrufmoduls durchgeführt.  

Es ist nicht empfehlenswert, den vollstaendig bestimmten Namen des geladenen Moduls der Art Drive:\Directory\FileName.Ext verwenden. Bibliotheken MQL5 werden vom Ordner terminal_dir\MQL5\Libraries ausgeladen. Wenn Bibliothek nicht gefunden wurde, versucht man, Bibliothek vom Ordner terminal_dir\experts herunterzuladen.

Systembibliotheken werden nach Regeln (DLL) des Operationssystems geladen. Wenn die Bibliothek schon geladen wird (zB. von anderen Experten oder aus anderem Client-Terminal, das parallel startet) wird die schon  geladene Bibliothek aufgerufen.Anderenfalls erfolgt die Suche in der Folge:  

  1. Verzeichnis, von dem das dll importierende Modul abgelaufen wurde. Unter Modul wird Expert, Script, Indikator oder Bibliothek EX5 verstanden;
  2. Verzeichnis Katalog_Data_Terminals\MQL5\Libraries (TERMINAL_DATA_PATH\MQL5\Libraries);
  3. Verzeichnis, von dem das Client-Terminal MetaTrader 5 gestartet wurde;
  4. Systemverzeichnis;
  5. Verzeichnis Windows;
  6. Laufendes Verzeichnis;
  7. Verzeichnisse, die in Systemvariable PATH aufgelistet sind.

Wenn die Bibliothek  DLL eine andere DLL in ihrer Arbeit verwendet, dann kann die erste DLL beim Fehlen der zweiten DLL nicht geladen werden.

Vor dem Laden des Experten (Script, Indikator) wird die gesamte Liste aller Bibliothekmoduln EX5 gebildet, die sowohl von dem geladenen Experten(Script, Indikator), als auch von der Bibliothek dieser Liste zu verwenden gedacht. So erfolgt das einmalige Laden der mehrmalig verwendeten Bibliothekmoduln EX5. Bibliotheken verwenden vorbestimmte Variablen des Experten (Script, Indikator), der sie aufgerufen hat.  

Suche der importierten Bibliothek wird in der Folge durchgeführt:

  1. Verzeichnis, Pfad zu dem in Bezug auf Verzeichnis des importierenden EX5 Experten (Script, Indikator)  vorgegeben wird;
  2. Verzeichnis Katalog_Terminals\MQL5\Libraries;
  3. Verzeichnis MQL5\Libraries im Gesamtverzeichnis aller Client-Terminals MetaTrader 5(Common\MQL5\Libraries).

Funktionen, die aus DLL in mql5-Programm , importiert werden, müssen Windows API Abkommen garantieren. Für Garantieren dieses Abkommens wird im Ausgangstext der Programme, die mit den Sprachen  C oder C++ geschrieben werden, das Schluesselwort  __stdcall verwendet, das für Compiler der Gesellschaft  Microsoft(r) spezifisch ist. Das Abkommen ist dadurch charakterisiert:

  • ausrufende Funktion (hier mq5-Programm) muss "sehen" Prototyp der aufgerufenen Funktion (importierten aus DLL), um Parameter zum Stack richtig zusammenzustellen;  
  • ausrufende Funktion (hier mql5-Programm) stellt Parameter auf Stack in umgekehrter Reihenfolge, von rechts nach links - gerade in dieser Reihenfolge liest die importierte Funktion die ihr übertragenen Parameter ein;
  • Parameter werden nach Wert übertragen ausser deneb, die explizit durch Referenz übertragen werden (in diesem Fall sind es Zeilen)
  • Importfunktion, klaert Stack selbst ab beim Einlesen der ihr übertragenen Parameter.

Beim Beschreiben des Prototyps der Importfunktion können Parameter mit Defaultwerten verwendet werden.

Falls die entsprechende Bibliothek nicht in der Lage war, geladen zu werden oder es ist untersagt,  DLL zu verwenden oder die importierte Funktion nicht gefunden war - stoppt Expert seine Arbeit mit der entsprechenden Nachricht  "expert stopped" im Journal. Dabei wird Expert nicht ablaufen lassen, bevor er neuinitialisiert wird. Expert kann neuinitialisiet werden im Ergebnis der Umcompilierung oder der Öffnung der Eigenschaften der Tabelle und Drücken der Schaltfläche OK.

Parameterübertragung

Alle Parameter der einfachen Typen werden nach Wert übertagen, wenn nicht explizit angegeben wird, dass sie durch Refernz übertragen werden. Bei der Übertragung einer Zeile wird Pufferadresse der kopierten Zeile übertragen; wenn eine Zeile durch Refenz übertragen wird, wird in die aus DLL importierte Funktion Pufferadresse gerader dieser Zeile Zeile ohne Kopieren übertragen.

Strukturen, die dynamische Felder, Zeilen, Klassen, andere komplizierte Strukturen, aber auch statische oder dynamische Felder der aufgelisteten Objekte enthalten, können nicht als Parameter in eine importierte Funktion übertragen werden.

Bei der Übertragung des Feldes in  DLL wird immer (unabhängig von der Flagge AS_SERIES) die Adresse des Pufferanfangs übertragen. Funktion innerhalb DLL weiss nichts von der Flagge  AS_SERIES, das übertragene Feld ist ein statisches Feld der unbekannten Laenge, für Spezifizieren der Feldgroesse verwenden Sie einen zusätzlichen Parameter.