Structure des Programmes

 

Dans les premières sections, nous avons appris quelques notions basiques de la programmation avec le langage MQL4. Maintenant, étudions comment un programme est organisé en général.  Dans cet objectif, nous étudierons son schéma structurel.

Comme nous l’avons déjà mentionné, le code principal écrit par un programmeur est placé à l’intérieur des fonctions spéciales et définies par l’utilisateur. Dans la section Fonctions nous avons discuté des notion et des propriétés des fonctions intégrées et définies par l’utilisateur. En résumé: une fonction définie par l’utilisateur dispose d’une description, et l’appel de la fonction est utilisé pour le début de son exécution dans un programme. Toute fonction intégrée ou définie par l’utilisateur peut être exécutée seulement après avoir été appelée. On dit que  la fonction est appelée par le programme pour exécution.

Les propriétés des fonctions spéciales sont décrites en détail dans une section ultérieure. Ici, nous étudierons seulement les principales informations à leur sujet. Une fonction spéciale est une fonction appelée à être exécutée par le terminal client. À la différence des fonctions communes, les fonctions spéciales ont seulement une description et leur appel n’est pas spécifié dans le programme. Les fonctions spéciales sont appelées à être exécutées par le terminal client (il y a aussi une possibilité technique de faire appel aux fonctions spéciales à partir d’un programme, mais nous considérons cette méthode comme étant incorrecte et nous en discuterons donc pas ici). Quand un programme est lancé pour exécution dans une fenêtre de sécurité, le terminal client passe le contrôle à l’une des fonctions spéciales. En conséquence, cette fonction est exécutée.

La règle de programmation en MQL4 est la suivante:

{xtypo_alert}Le code du programme doit être écrit à l’intérieur des fonctions.{/xtypo_alert}

 

Cela signifie que les  lignes de programme (les opérateurs et les appels de fonction) qui sont à l’extérieur de la fonction ne peuvent pas être exécutées. Lors de la tentative de compilation d’un tel programme, lr MetaEditor affiche le message d’erreur correspondant et le fichier exécutable *. ex4 n’apparaît pas comme un résultat de la compilation.

 Considérons les schéma structurel d’un programme classique – Expert Advisor:

 

 

Fig. 31. Schéma fonctionnel d’un programme (Expert Advisor).

Les plus grands blocs d’un programme écrit en MQL4 sont:

1. L’en-tête d’un programme.

2. La fonction spéciale init().

3. La fonction spéciale start().

4. La fonction spéciale deinit().

5. Les fonctions définies par les utilisateurs.

 

Nous analyserons seulement le contenu interne de ces blocs fonctionnels d’un programme, alors que tous les objets externes (par exemple, le domaine d’information du terminal du client ou du matériel) sera hors de notre champ d’intérêt.

 

L’environnement d’information du Terminal Client MetaTrader 4

L’environnement d’information du terminal client MT4 n’est pas une partie composante du programme. L’environnement d’information est un ensemble de paramètres disponibles pour être traités par un programme. Par exemple, c’est le nouveau prix d’un titre arrivant avec le nouveau tick, le volume cumulé à chaque nouveau tick, des informations sur les prix maximum et minimum de l’historique des bars, des paramètres qui caractérisent les conditions commerciales offertes par le centre de traitement (dealing center), etc. L’environnement d’information est toujours sauvegardé et  mis à jour par le terminal client connecté avec le serveur à chaque nouveau tick.

 

Structure du programme

 

Partie d’en-tête

La partie d’en-tête est constituée de plusieurs lignes au début d’un programme (à partir de la première ligne). Ces lignes contiennent des informations générales sur le programme. Par exemple, cette partie comprend des lignes de déclaration et d’initialisation des variables globales ( la nécessité d’inclure telle ou telle information dans l’en-tête sera discutée plus tard). La fin de la partie d’en-tête peut être indiquée lorsque la ligne suivante contient une description de fonction (définie par l’utilisateur ou spéciales).


Fonctions spéciales

Habituellement, après la partie d’en-tête du programme, les fonctions spéciales sont décrites. La description de la fonction spéciale ressemble à la description habituelle d’une fonction définie par l’utilisateur, mais les fonctions spéciales ont des noms prédéfinis : init (), start () et deinit (). Les fonctions spéciales sont un bloc de calculs et sont en relations avec l’environnement d’information du terminal client et les fonctions définies par l’utilisateur. Les fonctions spéciales sont décrites en détail dans une section ultérieure.

Fonctions définies par l’utilisateur

La description des fonctions définies par l’utilisateur est habituellement donnée après la description des fonctions spéciales. Le nombre de fonctions définies par l’utilisateur dans un programme n’est pas limité. Le schéma ne contient que deux fonctions définies par l’utilisateur, mais un programme peut en contenir 10 ou 500, ou aucune. Si aucune fonction définie par l’utilisateur est utilisée dans un programme, le programme aura une structure simplifiée: l’en-tête et la description des fonctions spéciales.


Fonctions standard

Comme indiqué précédemment, les fonctions standard ne peuvent être présentées que comme un appel de fonction. Les fonctions standards, comme les fonctions spéciales et définies par l’utilisateur, ont une description. Cependant, cette description n’est pas donnée dans le programme (c’est la raison pour laquelle ne figurent pas dans le schéma). La description d’une fonction standard est cachée, non visible pour un programmeur et ne peuvent donc pas être changée. Bien qu’elle est disponible pour le MetaEditor. Au cours de la compilation du programme, le MetaEditor fera un fichier exécutable, dans lequel toutes les fonctions standards appelées seront exécutées correctement.

 

Disposition des parties dans un programme

L’en-tête devrait être située dans les premières lignes. La disposition des particuliers et des fonctions définies par l’utilisateur descriptions n’a pas d’importance. Fig. 32 montre une disposition des blocs fonctionnels, à savoir: – la tête part, des fonctions, fonctions définies par l’utilisateur. Fig. 33 montre la structure du programme d’autres variantes. Dans tous les exemples de la tête la première partie, tandis que les fonctions peuvent être décrites dans un ordre aléatoire.

La partie d’en-tête devrait être située dans les premières lignes. La disposition de la description des fonctions spéciales et définies par l’utilisateur descriptions n’a pas d’importance. La Fig. 32 montre une disposition des blocs fonctionnels, à savoir: l’en-tête, les fonctions spéciales et les fonctions définies par l’utilisateur. La Fig. 33 montre d’autres variantes de la structure du programme. Dans tous les exemples, l’en-tête vient en première partie, tandis que les fonctions peuvent être décrites dans un ordre aléatoire.

 

 

Fig. 32. Organisation habituelle des blocs fonctionnels dans un programme (recommandé).

 

 

Fig. 33. Des possibilités d’organiser des blocs fonctionnels dans un programme (ordre aléatoire).

Notez bien :

{xtypo_warning}Aucune fonctions ne peut être décrite dans une autre fonction. Il est interdit d’utiliser dans un programme des fonctions dont la description est située dans une autre fonction.{/xtypo_warning}

 

Voici des exemples de mauvaise disposition des descriptions de fonction.

 

 

Fig. 34. Exemples de mauvaises dispositions de fonctions dans un programme.

 

Si par erreur, un programmeur crée un programme où la description de l’une de ses fonctions est située à l’intérieur de la description d’une autre fonction, à l’étape de compilation, le MetaEditoraffichera un message d’erreur et un fichier exécutable ne sera pas créé pour un tel programme.

 

Séquence d’exécution du code

En-tête et fonctions spéciales


Dès que l’exécution d’un programme a commencé dans une fenêtre du MetaEditor, les lignes de du code de l’en-tête sont exécutées.

Après les préparatifs décrits dans l’en-tête soient exécutés, le terminal client passe commande à la fonction spéciale init() et la fonction est exécutée (le passage du contrôle est indiqué dans le schéma structurel par les grandes flèches jaunes). La fonction spéciale init() est appelée pour être exécutée une seule fois au début du programme. Habituellement, cette fonction contient un code qui doit être exécuté qu’une seule fois avant que l’opération principale du programme commence. Par exemple, lorsque la fonction init() est exécutée, certaines variables globales sont initialisées, des objets graphiques sont affichés dans une fenêtre graphique, des messages peuvent être affichés. Après que toutes les lignesdu code de la fonction init() soient exécutées, la fonction termine son exécution et le contrôle est retourné au terminal client.

Le temps d’exécution du programme principal est la durée d’exécution de la fonction start(). Dans certaines conditions (voir les caractéristiques des fonctions spéciales dans la section s’y rapportant), y compris la réception d’un nouveau tick par le terminal clientl, le terminal client demande l’exécution de la fonction spéciale start(). Cette fonction (comme d’autres fonctions) peuvent se référer à l’environnement d’information du terminal client, effectuer les calculs nécessaires, réaliser l’ouverture et la clôture des ordres, c’est-à-dire effectuer toutes les actions autorisées par MQL4. Habituellement, lorsque la fonction spéciale start() est exécutée, un solution est produite qui est implémentée comme un contrôle d’action (flèche rouge). Ce contrôle peut être mis en œuvre comme une demande de trading pour ouvrir, fermer ou modifier un ordre constitué par le programme.

Après que l’ensemble du code de la fonction spéciale start() de l’EA soit exécuté, la fonction start() termine son fonctionnement et retourne le contrôle au terminal client. Le terminal aura le contrôle pendant un certain temps, ne commençant aucune autre fonction spéciale. Une pause apparaît, au cours de laquelle le programme ne fonctionne pas. Plus tard, quand un nouveau tick arrive, le client passe le contrôle de nouveau à la fonction spéciale start(), qui sera exécutée. Après son exécution terminée, le contrôle sera renvoyé au terminal… jusqu’à l’arrivée du prochain tick.

Le processus d’appel multiple de la fonction spéciale start() par le terminal client sera répété tant que le programme est joint à un graphique, ce qui peut durer des semaines et des mois. Pendant toute cette période, un Expert Advisor peut réaliser du trading automatique, c’est-à-dire réaliser sa mission principale. Ce processus est représenté sur le schéma par plusieurs flèche jaune enveloppant la fonction spéciale start().

Quand un trader enlève un EA d’un graphique, le terminal exécute une fois la fonction particulière deinit(). L’exécution de cette fonction est nécessaire pour la bonne fin de l’opération de l’EA. Pendant son fonctionnement, le programme peut, par exemple, créer des objets graphiques et des variables globales du terminal client. C’est pourquoi le code de la fonction deinit () contient des lignes de code dont l’exécution se traduit par la suppression des objets et variables inutiles. Après l’exécution de la fonction spéciale deinit(), le contrôle est renvoyé au terminal.

L’exécution des fonctions spéciales peut se référer à l’environnement d’information (flèches bleues sur le schéma) et appeler l’exécution des fonctions définies par l’utilisateur (flèches jaunes). Notez que les fonctions spéciales sont exécutées après avoir été appelées par le terminal client dans l’ordre prédéfini de leurs propriétés: d’abord init (), puis des appels multiples de start() et après un appel à deinit ().

Fonctions définies par l’utilisateur

Les fonctions définies par l’utilisateur sont exécutées lorsque l’appel à une fonction définie par l’utilisateur est contenue dans une fonction. Dans ce cas, le contrôle est  passé à la fonction définie par l’utilisateur et lorsque son exécution est terminée, le contrôle est retourné à l’endroit de l’appel (flèches orange sur le schéma). Les appels aux fonctions définies par l’utilisateur peuvent être contenues, non seulement dans la description d’une fonction spéciale, mais aussi dans la description des autres fonctions définies par l’utilisateur. Une fonction définie par l’utilisateur peut appeler d’autres fonctions définies par l’utilisateur – ce qui est largement utilisé en pratique dans la programmation.

Les fonctions définies par l’utilisateur ne sont pas mises en exécution par le terminal client. Les fonctions définies par l’utilisateur sont exécutées à l’intérieur d’une fonction spéciale qui retourne le contrôle au terminal. Elles peuvent aussi demander pour leurs calculs, les valeurs des variables de l’environnement d’information du terminal client (flèches bleues du schéma).

Si un programme contient la description d’une fonction définie par l’utilisateur, mais il n’y a aucun appel à cette fonction, cette fonction sera exclue du programme lors de la compilation et ne sera pas utilisée lors des opérations du programme.

{xtypo_alert}Note: les fonctions spéciales sont appelées pour exécution par le terminal client. Les fonctions définies par l’utilisateur sont exécutées si elles sont appelées par des fonctions spéciales ou d’autres fonctions définies par l’utilisateur, mais ne sont jamais appelées par le terminal client. Les actions de contrôle (comme des ordres de trades) peuvent être formées à la fois par les fonctions spéciales et définies par l’utilisateur.{/xtypo_alert}

 

Retour sommaire cours MQL4

Traduction: Nicolas Vitale
Source: http://book.mql4.com/programm/structure
“MQL4 is a trade mark of MetaQuotes Software Corp. and all related materials are reserved for MetaQuotes”

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>