L'exécution des programmes

Chaque script et chaque expert travaille dans son propre thread séparé. Tous les indicateurs calculés sur un symbole travaillent dans un thread, même s'ils sont lancés sur les graphiques différents. Ainsi tous les indicateurs sur un symbole divisent entre eux-mêmes les ressources d'un thread.

Aussi dans un thread avec les indicateurs on accomplit successivement les autres actions du symbole donné - le traitement des ticks et la synchronisation de l'histoire. Cela signifie que si l'action infinie est accomplie dans l'indicateur, tous les autres événements selon son symbole ne seront jamais accomplis.

Au lancement de l'expert il faut assurer à lui environnement commercialactuel, l'accessibilité de l'histoire selon le symbole donné et la période, ainsi que produire la synchronisation entre le terminal et le serveur. Sur ces procédures le terminal accorde le délai du lancement à l'expert pas plus qu'à 5 secondes, après quoi l'expert sera lancé avec ces données qu'on a réussi à préparer. Voilà pourquoi en absence de communication avec le serveur, ça peut retarder le lancement de l'expert.

Un bref résumé selon les programmes MQL5 est amené dans un tableau:

Programme

Exécution

Note

Script

Dans son propre thread, tant de scripts existent - autant de threads d'exécution il y a pour eux.

Le script avec une boucle infinie ne peut pas perturber le travail des autres programmes

Expert

Dans son propre thread, tant d'experts existent - autant d'experts d'exécution il y a pour eux.

L'expert avec une boucle infinie ne peut pas perturber le travail des autres programmes

Indicateur

Le thread de l'exécution pour tous les indicateurs sur un symbole. Tant de symboles avec indicateurs existent - autant de threads d'exécution il y a pour eux

Une boucle infinie dans un indicateur arrêtera le travail de tous les autres indicateurs sur ce symbole

Directement après qu'un programme est attaché à un graphique on produit son chargement à la mémoire du terminal de client et l'initialisation des variables globales. Si quelque variable globale comme la classe a le constructeur, cet constructeur sera appellé en train de l'initialisation des variables globales.

Après cela le programme se trouve dans l'état de l'attente de l'événement du terminal de client. Chaque programme mql5 avoir être quand même une fonction-gestionnaire de l'événement, dans le cas contraire programme chargé ne sera pas accompli. Les fonctions-gestionnaires des événements ont les noms prédéterminés, les ensembles prédéterminés des paramètres et les types prédéterminés du retour.

Ty-

pe

Nom de la fonction

Paramètres

Application

Commentaires

int

OnInit

non

Experts et Indicateurs

Le gestionnaire de l'événement Init. On admet le type de la valeur rendue void.

void

OnDeinit

const int reason

Experts et Indicateurs

Le gestionnaire de l'événement Deinit.

void

OnStart

non

Scripts et Services

Le gestionnaire de l'événement Start.

int

OnCalculate

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[]

Indicateurs

Le gestionnaire de l'événement Calculate sur toutes les données de prix.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const int begin,

const double &price[]

Indicateurs

Le gestionnaire de l'événement Calculate sur un tableau des données. Dans l'indicateur ne peut pas simultanément assister 2 gestionnaires Calculate. Dans ce cas travaillera seulement un gestionnaire de l'événement Calculate sur un tableau des données.

void

OnTick

non

Experts

Le gestionnaire de l'événement NewTick. Pendant le traitement de l'événement de l'arrivée du nouveau tick les autres événements de ce type ne viennent pas.

void

OnTimer

non

Experts et Indicateurs

Le gestionnaire de l'événement Timer.

void

OnTrade

non

Experts

Le gestionnaire de l'événement Trade.

void

OnTester

non

Experts

Le gestionnaire de l'événement Tester.

void

OnChartEvent

const int id,

const long &lparam,

const double &dparam,

const string &sparam

Experts et Indicateurs

Le gestionnaire de l'événement ChartEvent.

void

OnBookEvent

const string &symbol_name

Experts et Indicateurs

Le gestionnaire de l'événement BookEvent.

Le terminal de client envoie les événements apparaissant aux graphiques correspondants ouverts. Aussi les événements peuvent être générés par les graphiques (les événements du graphique) ou par les programmes mql5 (les événements d'utilisateur). On peut activer et désactiver la génération des événements de la création et de la suppression des objets graphiques sur le graphique en spécifiant des propriétés du graphique CHART_EVENT_OBJECT_CREATE et CHART_EVENT_OBJECT_DELETE. Chaque programme MQL5 et chaque graphique a sa propre file d'attente d'événements, où sont ajoutés tous les nouveaux événements entrants.

Le programme reçoit les événements seulement du graphique, où il est lancé. Tous les événements sont traités l'un après l'autre dans l'ordre reçu. Si l'événement NewTick se trouve déjà dans la file d'attente ou cet événement est en état du traitement, on ne met pas un nouvel événement NewTick dans la file d'attente du programme mql5. Analogiquement, si l'événement ChartEventest déjà dans la file d'attente du programme mql5 ou cet événement est en état du traitement, on ne met pas un nouvel événement de ce type dans la file d'attente. Le traitement des événements de la minuterie est produit selon le même schéma — si l'événement Timerest au tour ou est déjà traité, un nouvel événement de la minuterie n'est pas mis au tour.

Les tours des événements ont la taille limitée, mais suffisante, c'est pourquoi le débordement pour les programmes correctement écrits est peu probable. Au débordement du tour les nouveaux événements sont rejetés sans mise dans la file d'attente.

Il n'est pas recommandé d'utiliser des boucles infinies pour traiter les événements.  Seulement les scripts qui traitent un seul événement Start peuvent être l'exception de cette règle.

Les bibliothèques ne traitent pas aucuns événements.

L'interdiction à l'utilisation des fonctions dans les indicateurs et les experts

Les indicateurs, les scripts et les experts sont les programmes exécutés de MQL5 et sont destinés aux différents types des tâches. C'est pourquoi il y a une limitations sur l'utilisation des fonctions définies en fonction de type du programme. Les fonctions suivantes sont interdites dans les indicateurs:

 

A son tour, toutes les fonctions, destinées aux indicateurs sont interdites dans les experts et les scripts:

La bibliothèque n'est pas le programme indépendant et elle s'exécute dans le contexte du programme MQL5 qui l'a appelée: le script, l'indicateur ou l'expert. En conséquence, toutes les limitations indiquées ci-dessus se répandent à la bibliothèque appelée.

 

Les fonctions sont interdites dans les services

Les services n'acceptent pas d'évènements puisqu'ils ne sont pas liés à un graphique. Les fonctions suivantes sont interdites dans les services :

ExpertRemove();

EventSetMillisecondTimer();

EventSetTimer();

EventKillTimer();

SetIndexBuffer();

IndicatorSetDouble();

IndicatorSetInteger();

IndicatorSetString();

PlotIndexSetDouble();

PlotIndexSetInteger();

PlotIndexSetString();

PlotIndexGetInteger();

 

Le chargement et le déchargement des indicateurs

Les indicateurs sont chargés dans les cas suivants :

  • l'indicateur est attaché à un graphique;
  • le lancement du terminal (si l'indicateur était attaché au graphique avant la clôture du terminal);
  • le chargement d'un modèle (si l'indicateur attaché à un graphique est spécifié dans le modèle);
  • le changement d'un profil (si l'indicateur est attaché à un des graphiques de profil);
  • le changement d'un symbole et/ou la période du graphique, auquel l'indicateur est attaché;
  • le changement du compte, auquel le terminal est connecté;
  • après la recompilation réussie d'un indicateur, si cet indicateur était attaché à un graphique.
  • le changement des paramètres d'entrée de l'indicateur.

 

Les indicateurs sont déchargés dans les cas suivants :

  • en détachant un indicateur du graphique;
  • la clôture du terminal (si l'indicateur était attaché au graphique);
  • le chargement d'un modèle, si un indicateur est attaché au graphique ;
  • la fermeture d'un graphique, auquel l'indicateur a été attaché;
  • le changement d'un profil, si l'indicateur est attaché à un de graphiques du profil changé;
  • le changement d'un symbole et/ou la période  du graphique, auquel l'indicateur est attaché;
  • le changement du compte, auquel le terminal est connecté;
  • le changement les paramètres d'entrée de l'indicateur.

 

Le chargement et le déchargement des experts

L'expert est chargé dans les cas suivants:

  • un expert est attaché à un graphique;
  • le lancement du terminal (si l'expert était attaché au graphique avant la clôture du terminal);
  • le chargement d'un modèle (si l'expert attaché au graphique est spécifié dans le modèle);
  • après la recompilation réussie d'un expert, si cet expert était attaché à un graphique;
  • le changement d'un profil, si l'expert est attaché à un de graphiques du profil changé);
  • la connexion au compte, même si le numéro du compte n'a pas changé (si l'expert a été fixé au graphique avant l'autorisation du terminal sur le serveur).

Le déchargement de l'expert attaché au graphique, est produit dans les cas suivants:

  • en détachant un expert du graphique;
  • si un nouvel Expert est attaché à un graphique, si un autre expert a été déjà attaché, cet expert est déchargé;
  • la clôture du terminal (si l'expert était attaché au graphique);
  • le chargement d'un modèle, si un expert est attaché au graphique;
  • la clôture d'un graphique, auquel l'expert est attaché;
  • le changement d'un profil, si l'expert est attaché à un de graphiques du profil changé;
  • le changement du compte, auquel le terminal est connecté (si l'expert a été fixé au graphique avant l'autorisation du terminal sur le serveur);

Au changement du caractère ou du temps trame du graphique, auquel l'expert est attaché le déchargement et le chargement de l'expert n'est pas produit. Dans ce cas les gestionnaires OnDeinit() sont appelés successivement sur un ancien symbole/temps trame et OnInit() au nouveau symbole/temps trame (s'ils existent), les valeurs des variables globales et des variables statiques ne sont pas réinitialisées. Tous les événements qui sont entrés pour l'expert jusqu'à l'achèvement de l'initialisation (les fonctions OnInit()) se sont manqués.

 

Le chargement et le déchargement des scripts

Les scripts sont chargés immédiatement après qu'ils sont attachés à un graphique et déchargé immédiatement après qu'ils accomplissent leur opération. En cela les fonctions OnInit() et OnDeinit() ne sont pas appelées pour les scripts.

Au déchargement du programme (supprimer le programme du graphique) se passe la déinitialisation des variables globales et l'annulation du tour des messages. Dans ce cas  la déinitialisation signifie la désallocation des variables du type string, la libération des objets des tableaux dynamiques et l'appel des destructeurs à leur présence.

 

Chargement et Déchargement des services

Les services sont chargés directement après le lancement du terminal s'ils n'étaient pas en cours d'exécution au moment de la fermeture du terminal. Les services ne sont pas déchargés immédiatement après la fin de leur utilisation.

Les services ont un gestionnaire unique OnStart(), dans lequel vous pouvez implémenter une boucle infinie de réception et de traitement des données, par exemple pour créer et mettre à jour des symboles personnalisés en utilisant les fonctions réseau.

Contrairement aux Expert Advisors, indicateurs et scripts, les services ne sont pas liés à un graphique spécifique, un mécanisme spécifique est donc fourni pour les lancer. Une instance d'un nouveau service est créée dans le Navigateur en utilisant la commande "Ajouter un Service". Une instance de service peut être lancée, stoppée et supprimée en utilisant le menu correspondant de l'instance. Pour gérer toutes les instances, utilisez le menu du service.

 

Pour la meilleure compréhension du travail de l'expert il est recommandé de compiler le code de l'expert amené dans l'exemple et produire les actions du chargement/déchargement des experts, le remplacement de la modèle, le caractère, le temps trame etc.

Exemple:

//+------------------------------------------------------------------+
//|                                                   TestExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
class CTestClass
  {
public:  
   CTestClass() { Print("CTestClass constructor"); }
   ~CTestClass() { Print("CTestClass destructor"); }
  };
CTestClass global;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Initialisation");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print("Deinitialisation with reason ",reason);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+

Les scripts sont chargés directement après avoir fixé le graphique et déchargé immédiatement après la fin de ses travaux.

Voir aussi

Les événements du terminal de client, Les fonctions de traitement des événements