Chiamata delle funzioni importate

Per importare le funzioni durante l'esecuzione di un programma MQL5, il terminale client utilizza l'associazione anticipata. Ciò significa che se un programma ha chiamata di una funzione importata, il modulo corrispondente (ex5 o dll) viene caricato durante il caricamento del programma. MQL5 e librerie DLL vengono eseguite nel thread di un modulo chiamante.

Si raccomanda di non utilizzare il nome completo specificato del modulo da caricare come Unità:\Directory\FileName.Ext. Le librerie MQL5 vengono caricate dalla cartella terminal_dir\MQL5\Libraries. Se la libreria non è stata trovata, il terminale client esegue un tentativo di caricamento dalla cartella terminal_dir\experts.

Le librerie di sistema (DLL) vengono caricatee dalle regole del sistema operativo. Se la libreria è già caricata (per esempio, un altro Expert Advisor, e anche da un altro terminale client, in parallelo), allora utilizza richieste alla libreria già caricata. Altrimenti, esegue una ricerca nella seguente sequenza:

  1. La directory, da cui il modulo importazione dll è stato avviato. Il modulo qui è un Expert Advisor, uno script, un indicatore o una libreria ex5;
  2. Directory terminal_data_directory\MQL5\Libraries (TERMINAL_DATA_PATH\MQL5\Libraries);
  3. Directory, da cui è stato avviato il terminale client MetaTrader 5;
  4. Directory di sistema
  5. Directory di Windows;
  6. Directory corrente;
  7. Directory elencate nella variabile di sistema PATH.

Se la libreria DLL utilizza un'altra DLL nel suo lavoro, la prima non può essere caricata nel caso in cui non vi è alcuna seconda DLL.

Prima che un Expert Advisor (script, direzione) venga caricato, viene formata una lista comune di tutti i moduli di libreria EX5. Va utilizzato sia da un Expert Advisor caricato (script, indicatore) che da librerie di questa lista. Quindi è necessario caricamento, una volta, di moduli EX5 utilizzati molte volte. Le librerie utilizzano le variabili predefinite degli Expert Advisor (script, indicatore) dal quale sono state chiamate.

La libreria importata EX5 viene cercata nella seguente sequenza:

  1. Directory, percorso che è impostato relativelativamente alla directory di Expert Advisor (script, indicatore) che importa EX5);
  2. Directory terminal_directory\MQL5\Libraries;
  3. Directory MQL5\Libraries nella directory comune a tutti i terminali client di MetaTrader 5 (Common\MQL5\Libraries).

Funzioni importate DLL in un programma-mql5 devono garantire l'accordo delle chiamate Windows API. Per garantire tale accordo, nel testo sorgente dei programmi scritti in C o C++, utilizzare la parola chiave __ stdcall, che è specifico per i compilatori Microsoft(r). Questo accordo è caratterizzato dal seguente:

  • il chiamante (nel nostro caso è un programma-mql5) dovrebbe "vedere" un prototipo di una funzione chiamata (importata dalla DLL), al fine di combinare opportunamente i parametri ad uno stack;
  • il chiamante (nel nostro caso è un programma mql5) mette i parametri nello stack in ordine inverso, da destra a sinistra - in questo modo una funzione importata legge i parametri passati ad essa;
  • i parametri vengono passati per valore, ad eccezione di quelli esplicitamente passati per riferimento (nel nostro caso le stringhe)
  • una funzione importata pulisce lo stack in modo indipendente con la lettura dei parametri passati.

Quando si descrive il prototipo di una funzione importata, possono essere utilizzati i parametri di default.

Se la libreria corrispondente non è in grado di caricare, o vi è un divieto di utilizzare la DLL o la funzione di importazione non è stata trovata - l'Expert Advisor arresta il suo funzionamento con l'apposito messaggio "Expert Advisor fermato" nella Journal (file di log). In questo caso l'Expert Advisor non verrà eseguito fino a quando non viene reinizializzato. Un Expert Advisor può essere reinizializzato a seguito di ricompilazione o dopo che la tabella delle sue proprietà si apre e si preme OK.

Passaggio di parametri

Tutti i parametri di tipi semplici vengono passati per valori a meno che non sia espressamente indicato che siano passati per riferimento. Quando viene passata una stringa, viene passato l'indirizzo del buffer della stringa copiata, se una stringa viene passata per riferimento, l'indirizzo del buffer di questa stringa senza copiarla, viene passato alla funzione importata da DLL.

Le Strutture che contengono gli array dinamici, le stringhe, le classi, le altre strutture complesse, così come array dinamici o statici degli oggetti enumerati, non possono essere passati come parametro ad una funzione importata.

Quando si passa un array ad una DLL, l'indirizzo di inizio del buffer di dati viene sempre passato (indipendentemente dal flag AS_SERIES). Una funzione all'interno di una DLL non sa nulla della bandiera AS_SERIES, l'array passato è un array statico di una lunghezza indefinita, dovrebbe essere utilizzato un parametro aggiuntivo per specificare la dimensione dell'array.