Comment traiter les erreurs 146: Trade Context is busy

 

Si vous programmez ou utilisez des EA ou scripts MQL4 sous Metatrader vous êtes probablement déjà tombé sur la fameuse erreur 146: “Trade Context is busy”. Et cette erreur peut être un véritable casse tête pour le néophyte car son apparition semble aléatoire… ce qui est la pire des choses pouvant arriver à un programmeur.

Je me suis rendu compte au détours de forums que beaucoup de choses fausses sont dites à son propos. Non cette erreur 146 n’est pas une fatalité. Pas mal de monde l’attribue à une manipulation de leur broker senser faire échouer leur trade. Alors, certes je n’ai pas la preuve que cette situation n’arrive jamais, mais une chose est sure, vous pourrez éliminer à 99% l’apparition de cette erreur si vous comprenez son origine et prenez les mesures nécessaires.

Fonctionnement de la plateforme Metatrader

Pour cela il faut comprendre le fonctionnement de la plateforme Metatrader. Lorsque votre EA ou script MQL4 passe un ordre au sens large (ouverture, fermeture, modification, etc), il passe la main à la plateforme (terminal client) qui va elle même passer l’ordre, attendre sa confirmation puis repasser la main au programme de trading, à savoir votre EA ou script. Vous pouvez déjà en déduire que l’exécution de votre EA ou script s’arrête tant que le terminal client n’a pas terminé la séquence de passage d’ordre se terminant par un acquittement positif ou négatif (ordre ayant échoué) venant du serveur de votre broker.

Le deuxième point important à noter est que le terminal client ne peut fonctionner en multi-threading, c’est à dire ne peut exécuter plusieurs ordres en parallèle. Si il reçoit deux ordres en même temps venant de deux EAs différents (puisqu’un EA ne peut pas envoyer deux ordres en même temps), il ne pourra en exécuter un. Qu’arrivera-t-il au deuxième? Vous aurez deviné, il recevra la fameuse erreur 146, “trade context is busy”.

La solution est donc de trouver un moyen d’empêcher le passage d’un ordre par un EA ou script si le termnal client est déjà occupé à traiter un autre ordre. Pour cela il existe deux solutions. La manière forte, brute, et la manière élégante. Vous aurez compris que la manière brute est la plus facile à mettre en place et l’élégante la plus compliquée.

La manière forte pour résoudre l’erreur 146

Commençons par la manière forte. Etant donné que votre EA recevra cette erreur tant que le trade précédant ne sera pas exécuté complètement par la plateforme, il suffit de continuer à demander à la plateforme d’exécuter le trade jusqu’à ce qu’il soit enfin exécuté. Vous pouvez obtenir le résultat d’un passage d’ordre grâce à la valeur retournée par la fonction. Grâce à cela, il suffit de faire une boucle demandant le passage d’ordre tant qu’il ne sera pas éxécuté en faisant attention toutefois à limité le nombre de demande et à introduire une temporisation grâce à la fonction Sleep.

La manière élégante pour résoudre l’erreur 146

Les manières élégantes visent à ne pas utiliser la force brute des demandes en boucle. On ne passe un ordre seulement si le terminal client est disponible, ce qui peut être déduit grâce à la fonction IsTradeContextBusy. Pour étudier de manière approfondie des solutions élégantes à ce problème, je vous conseille cet article de la communauté MQL4 qui fera éventuellement l’objet d’un traduction si cela vous intéresse (à vos commentaires…).

 

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>