Guide MetaTrader
Gérer la concurrence des ordres
Il est possible que plusieurs instances d’un même EA placées sur plusieurs graphes, ou plusieurs EA essaient de passer des ordres simultanément (d’autant plus si par exemple ces EAs travaillent sur plusieurs paires à l’ouverture de la bougie sur des unités de temps identiques). Le serveur ne peut exécuter plusieurs requêtes simultanées venant de la même plateforme.
Pour ne pas surcharger le serveur avec de nombreux ordres qui ne pourront être exécutés, il convient de vérifier si d’autres ordres sont en cours de passage et si le serveur est disponible.
Vérification si un ordre est en cours
Pour pouvoir vérifier si le passage d’un ordre est en cours et cela sur plusieurs EA, il est nécessaire d’utiliser une variable globale MT4 (ce qui est différent d’un variable globale à l’intérieur d’un programme). MT4 propose des fonctions pour créer et gérer des variables globales qui sont globales à l’ensemble de la plateforme et donc peuvent être échangées entre différents EA ou entre plusieurs instances du même EA.
Dans le cas présent nous pouvons créer une variable globale avant de lancer un ordre :GlobalVariableSet("OrdreEnCours", 1);
Et la détruire une fois que l’ordre a été passé par la fonction suivante.
GlobalVariableDel("OrdreEnCours");
De plus coté la fonction IsTradeAllowed() permet de vérifier si l’EA est autorisé à passer des ordres.
On peut ainsi vérifier si un ordre en cours de passage, et si c’est le cas attendre la fin du passage de l’ordre en cours. Le code ci-dessous fait cette vérification avec une attente de 1 seconde entre les vérifications et en gérant un temps maximum de réponse fixé à 30 secondes.
datetime start_time = TimeCurrent(); // temps de référence de la vérification
int time_out=30; // durée maximum de la vérification
while (GlobalVariableCheck("OrdreEnCours") || !IsTradeAllowed()) {
if(start_time + time_out <= TimeCurrent()) {
Print("Timeout");
return(0);
}
Sleep(1000);
}
A lire dans le Guide MetaTrader
| MetaTrader : Leçon 9 à 16 |
|---|
|


