Assurer le passage des ordres

Les fonctions les plus utilisées et d'importance critique dans un EA sont les fonctions de passage des ordres et en particulier OrderSend() pour ouvrir un ordre et OrderClose() pour fermer un ordre.

Ces fonctions envoient une requête sur le serveur pour être exécutée mais l'exécution de celle-ci n'est pas garantie à 100%, principalement dans le cas d'un marché bougeant rapidement ou si plusieurs ordres sont envoyés simultanément ou dans un intervalle très court.

Si les requêtes ne sont pas exécutées, les fonctions OrderSend() et OrderClose() renvoient un code d'erreur. Cependant, si le cas d'un possible renvoi de l'ordre en cas d'erreur n'est pas traité (ce qui arrive souvent dans les codes d'EA que l'on trouve sur le web) l'ordre est juste «perdu».

Ce genre de problème est parfois difficile à découvrir car ce problème n'est pas visible en backtest et aussi souvent indétectable en test car dans le cas d'un compte démo les ordres sont en général toujours exécutés. Et ce n'est donc que dans le cas d'une utilisation sur un compte «live» que ce problème devient clairement évident.

Ci-dessous la fonction étudiée est OrderSend() mais le même procédé peut-être utilisé pour les autres fonctions telles que OrderClose().

Assurer l'ouverture du trade

Utilisation de OrderSend() sans renvoi de l'ordre

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

L'envoi simple d'un ordre d'achat est par exemple codé de la façon suivante:

int ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,1,0,0,NULL,1234,0,Blue);

Si l'ordre ne peut être passé alors la valeur de ticket sera -1. Dans le cas de l'ordre ci-dessus la valeur du slippage est de 1 et donc la probabilité que l'ordre ne puisse être passé est assez élevée si la paire a une volatilité importante.

Utilisation de OrderSend() avec renvoi de l'ordre

Au lieu d'envoyer simplement une fois l'ordre, il est possible de renvoyer l'ordre tant qu'il n'a pas été exécuté (donc tant que ticket = -1). Pour cela il faut d'une part faire une petite pause entre les requêtes pour ne pas submerger le serveur d'ordres et aussi remettre à jour les valeurs des cours car le marché a bougé depuis le premier appel.

Ceci est réalisé par le code suivant:

int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,1,0,0,NULL,1234,0,Blue);
while (ticket == -1) // tant que l'ordre n'est pas passé
{
Sleep(1000); // on attend une seconde
RefreshRates(); //on rafraichit les valeurs du cours de la paire
ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,1,0,0,NULL,1234,0,Blue);
}

Ce code étant utilisé très fréquemment t étant plus «lourd» qu'un simple appel à une fonction il est préférable de le mettre dans une fonction qui sera par exemple nommée EnvoiOrdre() et aura strictement les mêmes paramètres que OrderSend(). Et donc dans le reste du code il suffit de remplacer OrderSend() par EnvoiOrdre() pour s'assurer que l'ordre soit bien passé.

Note: selon la stratégie de l'EA s'assurer du passage de l'ordre n'est pas nécessairement critique. Par exemple dans le cas de l'ouverture d'un ordre il peut être préférable de rater l'ordre que de le passer à un prix trop éloigné du cours objectif original. Mais dans le cas de la fermeture d'un ordre il est en général plus prudent de fermer l'ordre à tout prix plutôt que le laisser ouvert si cela ne correspond pas à la stratégie désirée.

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