Gérer la concurrence des ordres en MQL4

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 courset 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);

Voir notre avis sur le test du broker AvaTrade qui propose la plateforme MT4

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);
}

Plus d'information sur le même thème

Photo of Arnaud Jeulin

Arnaud Jeulin Responsable de la publication, Trader

Après un diplôme d'ingénieur, Arnaud a commencé une carrière de développeur. Il a travaillé avec des traders et des services de back office pour mettre en place des prototypes et des outils de trading. Il a ensuite créé sa propre entreprise en 2003.

Il a été responsable du webmarketing pour la Banque en ligne Suisse Synthesis, depuis rachetée par Saxo Bank. Il a aussi fait des audits pour différents brokers et participé à plusieurs salons professionnels pour les courtiers à Londres, Paris et Chypre.

Depuis 21 ans Arnaud a approfondi sa connaissance des brokers et des marchés, il utilise son expérience pour améliorer Mataf afin d'éviter d'orienter les visiteurs vers des brokers malhonnêtes ou des stratégies de trading dangeureuses.

Vous pouvez le joindre via les réseaux sociaux suivants ou par email :

.
  Se connecter