L'appel des fonctions importées

Pour importer des fonctions pendant l'exécution du programme mql5 on utilise un enchaînement . Cela signifie que si dans le programme il y a un appel de la fonction importée, le module correspondant (ex5 ou dll) est chargé en train du chargement du programme. Les bibliothèques MQL5 et DLL sont accomplies dans le thread du module appelant.

Il n'est pas recommandé d'utiliser le nom entièrement qualifié du module chargé comme Drive:\Directory\FileName.Ext. Les bibliothèques MQL5 sont chargées du classeur terminal_dir\MQL5\Libraries. Si la bibliothèque n'était pas trouvée, on produit la tentative de charger la bibliothèque du classeur terminal_dir\experts.

Les bibliothèques systémiques (DLL) sont chargées selon les règles du système opérationnel. Si la bibliothèque est déjà chargée  (par exemple, d'un autre expert et même d'un autre terminal de client lancé parallèlement), l'appel s'adresse à la bibliothèque déjà chargée. Dans le cas contraire la recherche va dans l'héritage suivant:

  1. Le répertoire d'où on lançait le module, important dll. Sous le module on considère l'expert, le script, l'indicateur ou la bibliothèque EX5;
  2. Le répertoire le répertoire_du_terminal_données\MQL5\Libraries (TERMINAL_DATA_PATH\MQL5\Libraries);
  3. Le répertoire, d'où on lançait le terminal de client MetaTrader 5;
  4. Le répertoire systémique;
  5. Le répertoire Windows;
  6. Le répertoire courant;
  7. Les répertoires, énumérés dans une variable de système de l'entourage PATH.

Si la bibliothèque DLL utilise dans le travail l'autre DLL, en cas de l'absence de la deuxième DLL, la première ne pourra pas être chargé.

Avant le chargement de l'expert (le script, l'indicateur) on forme le répertoire total de toutes les modules de bibliothèque EX5, qu'on suppose d'utiliser comme de l'expert récupéré (le scénario, l'indicateur), et des bibliothèques de cette liste. On assure ainsi le chargement unique des modules plusieurs fois utilisées de bibliothèque EX5. Les bibliothèques se servent des variables prédéterminées de l'expert qui les a provoqué (le script, l'indicateur).

La recherche de la bibliothèque importée EX5 est produite dans la séquence suivante:

  1. Le répertoire, le chemin vers lequel est donné par rapport au répertoire important EX5 de l'expert (le script, l'indicateur);
  2. Le répertoire le répertoire_du terminal\MQL5\Libraries;
  3. Le répertoire MQL5\Libraries dans le répertoire commun de tous les terminaux de client MetaTrader 5(Common\MQL5\Libraries).

Les fonctions importées de DLL au programme mql5, doivent assurer l'accord sur les liens, accepté pour les fonctions Windows API. Pour la garantie d'un tel accord dans le texte initial des programmes écrits dans les langages C ou C ++ on utilise le mot-clé __stdcall, qui est spécifique pour les compilateurs de la compagnie Microsoft(r). L'accord est caractérisé par:

  • la fonction appelante (dans notre cas c'est le programme mq5) doit "voir" le prototype de la fonction appelée (importée de DLL), pour mettre correctement les paramètres à la pile;
  • la fonction appelante (dans notre cas c'est le programme mq5) met les paramètres sur la pile dans l'ordre inverse, de droite à gauche - notamment en tel ordre la fonction importée lit les paramètres transmis à elle;
  • les paramètres sont transmis selon la valeur, à l'exception de ceux qui sont transmis évidemment selon le lien (dans notre cas des lignes)
  • la fonction importée, en lisant les paramètres transmis à elle, nettoie la pile.

A la description du prototype de la fonction importée on peut utiliser les paramètres avec les valeurs par défaut.

En cas si la bibliothèque correspondante n'a pas pu être chargée, ou on établit l'interdiction à l'utilisation DLL, ou la fonction importée n'était pas trouvée — l'expert arrête le travail avec le message correspondant "expert stopped" au journal. Ainsi l'expert ne fonctionnera pas avant que on ne le réinitialise pas. L'expert peut être réinitialisé à la suite de la recompilation ou après l'ouverture du tableau des propriétés de l'expert et la pression du bouton  OK.

La transmission des paramètres.

Tous les paramètres des types simples sont transmis selon la valeur, si n'est pas indiqué évidemment qu'ils sont transmis selon le lien. A la transmission de la ligne on transmet l'adresse du tampon de la ligne copiée; si la ligne est transmise selon le lien, à la fonction importée de DLL, on transmet l'adresse du tampon notamment de cette ligne sans copiage.

Les structures, contenant les tableaux dynamiques, les lignes, les classes, d'autres structures complexes, ainsi que les tableaux dynamiques ou statiques des objets énumérés, ne peuvent pas être transmises à titre du paramètre à la fonction importée.

A la transmission à DLL du tableau toujours (indépendamment du drapeau AS_SERIES) on transmet l'adresse du début du tampon des données. La fonction au-dedans de DLL ne sait rien du drapeau AS_SERIES, le tableau transmis est le tableau statique de la longueur inconnue, pour l'indication de la grandeur du tableau il faut utiliser  une paramétrisation supplémentaire.