English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Trading bidirectionnel et couverture des positions dans MetaTrader 5 à l’aide du panneau HedgeTerminal, Partie 1

Trading bidirectionnel et couverture des positions dans MetaTrader 5 à l’aide du panneau HedgeTerminal, Partie 1

MetaTrader 5Trading | 13 janvier 2022, 16:07
533 0
Vasiliy Sokolov
Vasiliy Sokolov

Table des matières


Introduction

Au cours des 18 derniers mois, MetaQuotes a mené des travaux approfondis sur la consolidation des plateformes MetaTrader 4 et MetaTrader 5 dans un écosystème de trading unifié. Maintenant, les deux plates-formes partagent un marché commun de solutions de programme - Market, offrant différents produits provenant de développeurs externes. Les compilateurs des deux plates-formes étaient également réunis. En conséquence, les deux plates-formes ont un compilateur commun basé sur MQL5 et un langage de programmation - MQL avec un ensemble de fonctions différent en fonction de la plate-forme utilisée. Tous les codes sources accessibles au public situés dans la base de code ont également été révisés et certains d’entre eux ont été ajustés pour être compatibles avec le nouveau compilateur.

Cette unification majeure des plateformes a laissé de côté l’unification de leurs parties de trading. Les modèles de trading de MetaTrader 4 et MetaTrader 5 sont toujours fondamentalement incompatibles malgré le fait que la majeure partie de l’environnement de trading est partagée. MetaTrader 4 facilite la gestion individuelle des positions de trading grâce au système d’ordres - entités de programmes spéciaux rendant le trading bidirectionnel dans ce terminal simple et facile. MetaTrader 5 est destiné au trade d’échange où la principale représentation des obligations d’un trader est sa position nette agrégée. Les ordres dans MetaTrader 5 sont simplement des instructions pour acheter ou vendre un instrument financier.

La différence entre les performances de trading de ces deux plateformes a provoqué de nombreuses discussions et débats houleux. Toutefois, des discussions sont restées des discussions. Malheureusement, depuis la sortie de MetaTrader 5, pas une seule solution de travail n’a été publiée qui pourrait permettre de présenter les obligations d’un trader en tant que des positions bidirectionnelles comme dans MetaTrader 4. Bien que de nombreux articles publiés suggèrent diverses solutions, celles-ci ne sont pas assez flexibles pour être utilisées à grande échelle. En outre, aucune de ces décisions ne convient au trading en bourse, ce qui implique de nombreuses nuances à prendre en considération.

Cet article devrait régler les controverses entre les fans des quatrième et cinquième versions de la plateforme MetaTrader. Cela va fournir une solution universelle sous la forme d’une spécification de programme approfondie et de la solution de programme exacte mise en œuvre par cette spécification. Cet article traite d’un panneau visuel et de la bibliothèque de virtualisation HedgeTerminal, qui permettent de présenter l’obligation d’un trader sous forme de positions bidirectionnelles comme dans MetaTrader 4. Dans le même temps, le modèle sous-jacent à HedgeTerminal prend en compte le caractère de l’exécution des ordres de trading. Cela signifie qu’il peut être mis en œuvre avec succès à la fois sur le marché FOREX de gré à gré et sur des bourses centralisées comme, par exemple, la négociation de titres dérivés dans la section des produits dérivés de Bourse de Moscow.

HedgeTerminal est un terminal de trading complet à l’intérieur du terminal MetaTrader 5. Grâce au mécanisme de virtualisation, il modifie la représentation des positions actuelles afin qu’un trader ou un robot de trading puisse gérer ses positions de trading individuelles. Ni le nombre de postes, ni leur direction n’ont d’importance. Je voudrais insister sur le fait que nous parlons de virtualisation, c’est-à-dire un mécanisme spécifique qui transforme la présentation des obligations d’un trader, mais pas leurs caractéristiques qualitatives.

Il ne s’agit pas de fausser les résultats de l’activité financière du trader, mais de transformer la représentation de cette activité. HedgeTerminal est basé sur l’environnement de trading MetaTrader 5 et le langage de programmation MQL5. Il n’apporte pas de nouvelles informations de trading au terminal, il fait simplement que l’environnement de trading actuel est vu sous un angle différent. Cela signifie que HedgeTerminal est essentiellement MetaTrader 5 et est son application native. Même si, nous pourrions mettre un signe d’identité entre eux, un signe d’inclusion est plus approprié car HedgeTerminal n’est qu’une petite et l’une des nombreuses applications de MetaTrader 5.

La possibilité de virtualisation et l’existence de HedgeTerminal reposent sur trois paradigmes :

  1. Conceptuellement, une convertibilité complète et garantie de la représentation nette de la position dans les transactions de trading bidirectionnel individuelles est possible. Cette déclaration prouve le fait que sur certaines plates-formes de trading externes, y compris les plates-formes conçues pour le trading en bourse, il existe un moyen de gérer les positions bidirectionnelles ;
  2. Le modèle de trading de MetaTrader 5 au niveau de l’utilisateur permet de créer des ordres liés les uns aux autres dans un seul sens. Les calculs ont montré que les liaisons conçues d’une certaine manière seront résistantes aux collisions. De plus, même dans le cas d’un historique corrompu ou de toute situation de force majeure, les transactions bidirectionnelles pourraient être corrigées rétrospectivement et ramenées à un résultat financier calculé à la représentation nette ;
  3. L’API avancée dans MQL5 permet de mettre le signe d’identité entre MQL5 et le terminal MetaTrader 5. En d’autres termes, presque tout dans MetaTrader 5 est accessible via l’interface du programme et le langage de programmation MQL5. Par exemple, votre propre version du terminal peut être écrite à l’intérieur du terminal MetaTrader 5 comme HedgeTerminal.

Cet article traite des algorithmes sous-jacents et du fonctionnement de HedgeTerminal. Les spécifications et les algorithmes assurant un trading bidirectionnel cohérent sont discutés en profondeur dans cet article. Que vous décidiez d’utiliser HedgeTerminal ou de créer votre propre bibliothèque pour gérer vos propres algorithmes de trading, vous trouverez des informations utiles dans cet article et sa suite.

Cet article ne cible pas spécifiquement les programmeurs. Si vous n’avez aucune expérience en programmation, vous allez quand même le comprendre. Le code source MQL n’est pas inclus délibérément dans cet article. Tout le code source a été remplacé par des diagrammes, des tables et des images plus illustratifs représentant schématiquement le principe de fonctionnement et l’organisation des données. Je peux dire par expérience que même en ayant une bonne compréhension des principes de programmation, il est beaucoup plus facile de voir un modèle commun du code que de l’analyser.

Dans la deuxième partie de cet article, nous allons parler de l’intégration d’Expert Advisors avec la bibliothèque de visualisation HedgeTerminalAPI, puis la programmation sera impliquée. Cependant, même dans ce cas, tout a été fait pour simplifier la perception du code, en particulier pour les programmeurs novices. Par exemple, les constructions orientées objet comme les classes ne sont pas utilisées bien que HedgeTerminal soit une application orientée objet.


Comment lire cet article

Cet article est plutôt long. D’une part, c’est bien car la réponse à pratiquement toutes les questions concernant ce sujet peut être trouvée ici. D’autre part, de nombreux utilisateurs préféreraient ne lire que les informations les plus importantes revenant à la section pertinente chaque fois que la nécessité s’en fait sentir. Cet article couvre dans son intégralité une présentation cohérente du matériel. Semblable aux livres, nous allons donner un bref résumé de chaque chapitre afin que vous puissiez voir si vous avez besoin de le lire ou non.

  • Partie 1, Chapitre 1. Théorie de l’organisation du trading bidirectionnel. Ce chapitre contient les idées principales de HedgeTerminal. Si vous ne voulez pas d’informations détaillées sur l’organisation du trading bidirectionnel, ce chapitre est suffisant pour avoir une idée des principes généraux du fonctionnement de HedgeTerminal. Ce chapitre est recommandé pour tous les lecteurs.

  • Partie 1, Chapitre 2. Installation de HedgeTerminal, premier lancement. Ce chapitre décrit le lancement et la configuration du panneau visuel de HedgeTerminal. Si vous n’allez pas utiliser un panneau visuel de HedgeTerminal, vous pouvez ignorer ce chapitre. Si, cependant, vous allez utiliser la bibliothèque HedgeTerminalAPI, vous devrez passer par les sections 2.1 et 2.2 de ce chapitre. Ils sont dédiés au programme d’installation de HedgeTerminal. Le programme d’installation est le composant commun à tous les produits HedgeTerminal.

  • Partie 1, Chapitre 3. Sous le capot de HedgeTerminal. Spécification et principe d’exploitation. Ce chapitre met en évidence la disposition interne de HedgeTerminal, son algorithme et son organisation interne des données. Ceux qui s’intéressent au trading bidirectionnel peuvent trouver ce chapitre instructif. Les traders algorithmiques professionnels développant leurs propres bibliothèques de virtualisation et utilisant simultanément de nombreux robots peuvent également trouver ce chapitre utile.

  • Partie 2, Chapitre 1. Communication d’Expert Advisors avec HedgeTerminal et son panneau. Ce chapitre sera apprécié par ceux qui ne font qu’explorer cet aspect et ceux qui sont dans le trading algorithmique professionnellement. Il décrit les principes communs de travail avec la bibliothèque de HedgeTerminal et l’architecture du robot de trading.

  • Partie 2, Chapitre 2. Documentation de l’API HedgeTerminal. Contient de la documentation sur l’utilisation des fonctions de la bibliothèque HedgeTerminalAPI. Le chapitre est écrit comme une liste de documents auxquels on pourrait se référer de temps à autre. Il n’y a pas de discussions inutiles et de texte excessif. Ce chapitre ne contient que des prototypes de fonctions, de structures et d’énumérations ainsi que de brefs exemples de leur utilisation.

  • Partie 2, Chapitre 3. Bases des opérations de trading asynchrones. HedgeTerminal utilise des opérations asynchrones dans son travail. Ce chapitre comprend l’expérience de leur utilisation. Ce chapitre a été inclus dans cet article afin que tout lecteur puisse trouver des informations utiles indépendamment de son intention d’utiliser le HedgeTerminal dans son travail.

  • Partie 2, Chapitre 4. Bases de la programmation multi-thread dans l’environnement MetaTrader. Ce chapitre explique ce qu’est le multithreading, comment l’organiser et quels modèles d’organisation des données peuvent être utilisés. Comme le chapitre 3, il partage l’expérience du développement d’applications multithread avec tous les utilisateurs de MetaTrader.

J’espère que cet article est suffisamment intéressant pour que vous le lisiez jusqu’à la fin.


Chapitre 1. Théorie de l’organisation du trading bidirectionnel

1.1. Opportunités de MetaTrader 5 dans l’organisation du trading bidirectionnel

L’article « Principes de tarification de la bourse à travers l’exemple du marché des produits dérivés de la Bourse de Moscou » décrit soigneusement les nuances de la formation des prix d’échange et les méthodes de calcul des résultats financiers des acteurs du marché. Il souligne que les prix et les calculs à la Bourse de Moscou diffèrent considérablement des concepts et des méthodes de calcul acceptés dans le trading FOREX.

Dans l’ensemble, la formation des prix en bourse est plus complexe et contient beaucoup de détails importants cachés lors du trading Forex et dans le terminal MetaTrader 4.

Par exemple, dans MetaTrader 4, les transactions qui ont exécuté l’ordre du trader sont cachées alors que dans MetaTrader 5, de telles informations sont disponibles. D’autre part, des informations de trading détaillées dans MetaTrader 5 ne sont pas toujours nécessaires. Cela peut rendre le travail difficile pour un utilisateur inexpérimenté ou un programmeur novice et causer des malentendus. Par exemple, dans MetaTrader 4, pour connaître le prix de l’ordre exécuté, il vous suffit de rechercher la valeur correspondante dans la colonne « Prix ». Dans le langage de programmation MQL4, il suffit d’appeler la fonction OrderOpenPrice() . Dans MetaTrader 5, il est nécessaire de trouver toutes les transactions qui ont exécuté l’ordre, puis de les passer en revue et de calculer leur prix moyen pondéré. Ce prix lui-même est le prix de l’exécution de l’ordre.

Il existe d’autres situations où la représentation étendue de l’environnement de trading dans MetaTrader 5 nécessite des efforts supplémentaires pour analyser ces informations. Cela soulève des questions logiques :

Existe-t-il un moyen de rendre le processus de trading dans MetaTrader 5 aussi simple et clair que dans MetaTrader 4 et de conserver un accès pratique à tous les détails de trading requis ? S’il existe un moyen d’organiser le trading d’échange bidirectionnel en utilisant MetaTrader 5 de la même manière simple que MetaTrader 4 ? - La réponse à ces questions est la suivante : « Oui, il y en a » !

Référons-nous au diagramme des capacités des terminaux MetaTrader 4 et MetaTrader 5 pour comprendre comment cela est possible :

Fig. 1 Capacités de MetaTrader 4 et MetaTrader 5

Fig. 1 Capacités de MetaTrader 4 et MetaTrader 5

Comme nous pouvons le voir, l’ensemble « MetaTrader 5 » inclut le sous-ensemble « MetaTrader 4 ». Cela signifie que tout ce qui est possible dans MetaTrader 4 peut être fait dans MetaTrader 5 bien que l’inverse soit faux. Les nouvelles fonctionnalités de MetaTrader 5 augmentent inévitablement le montant et la complexité de la présentation des informations relatives au trade. Cette difficulté peut être déléguée à des programmes d’assistants spéciaux fonctionnant dans l’environnement MetaTrader 5. Ces programmes peuvent traiter la complexité, laissant les capacités du terminal au même niveau. L’un de ces programmes HedgeTerminal est au centre de ce chapitre.

HedgeTerminal est un terminal de trading à part entière à l’intérieur du terminal MetaTrader 5. Il utilise l’environnement de trading MetaTrader 5, le transforme avec le langage MQL5 et le représente comme une interface graphique pratique - panneau HedgeTerminalUltimate et interface spéciale HedgeTerminalAPI pour l’interaction avec des algorithmes indépendants (Expert Advisors, scripts et indicateurs).

MetaTrader 4 offre la possibilité d’utiliser des positions bidirectionnelles ou des ordres de verrouillage. Dans MetaTrader 5, il y a aussi une telle capacité, mais ce n’est pas explicite. Cela peut être activé à l’aide d’un programme complémentaire spécifique, ce que HedgeTerminal est essentiellement. HedgeTerminal est intégré dans MetaTrader 5 et utilise son environnement, rassemblant des informations par transactions et ordres dans des positions intégrées ressemblant beaucoup aux ordres de MetaTrader 4 et ayant toutes les capacités de MetaTrader 5.

Ces positions peuvent être dans un ordre de verrouillage complet ou partiel (lorsque des positions longues et courtes actives existent en même temps). La possibilité de maintenir de telles positions n’est pas un objectif en soi pour HedgeTerminal. Son objectif principal est d’unir l’information de trade en groupes unifiés (positions) qui seraient faciles à analyser, à gérer et à accéder. Les positions bidirectionnelles ne peuvent exister dans HedgeTerminal que parce que c’est très pratique. Dans le cas où plusieurs traders négocient sur un compte, ou si plus d’une stratégie est utilisée, la séparation des actions de trading doit être organisée.

En outre, un certain nombre de nuances doivent être prises en considération lors du trading en bourse, telles que l’exécution partielle des ordres, le roulement de position, le calcul de la marge de variation, les statistiques et bien d’autres. HedgeTerminal a été développé pour relever ces défis. Il fournit à l’utilisateur ou à un Expert Advisor une interface de haut niveau régulière ressemblant à MetaTrader 4 et fonctionnant en même temps correctement dans l’environnement d’échange.


1.2. Ordres d’appariement - Base de couverture et statistiques

Pour pouvoir gérer les techniques et les algorithmes de trading de manière cohérente, il est nécessaire de savoir avec certitude quelle action de trading appartient à quel algorithme.  J’ai souligné les mots « avec certitude » parce que s’il y a ne serait-ce que la plus petite probabilité d’échec, un crash de la gestion de position est inévitable tôt ou tard. À son tour, cela endommagera les statistiques et sapera l’idée de gérer différents algorithmes sur un même compte.

Une séparation fiable des activités de trade repose sur deux possibilités fondamentales :

  1. La possibilité d’unir ou «d’apparier» deux ordres de trading ensemble afin que l’on puisse toujours définir lequel des deux ordres ouvre la position individuelle (virtuelle) et lequel d’entre eux ferme cette position ;
  2. L’algorithme, analysant les ordres pour leur appariement doit être complètement déterministe et unifié pour tous les modules du programme.

La deuxième exigence pour le déterminisme de l’algorithme sera examinée en détail ci-dessous. Nous allons maintenant nous concentrer sur le premier.

Un ordre est une instruction de vente ou d’achat. Un ordre est une entité définie, qui comprend beaucoup plus de « champs » d’informations en plus des informations principales telles que le nombre magique et le numéro d’ordre, le prix requis et les conditions d’ouverture.

L’un de ces champs dans MetaTrader 5 s’appelle «Order Magic» . Il s’agit d’un champ spécifié utilisé pour qu’un robot de trading ou un Expert Advisor puisse marquer cet ordre avec son numéro unique individuel également appelé « nombre magique ». Ce champ n’est pas utilisé dans le trade manuel bien qu’il soit très important pour les algorithmes de trading car lorsqu’un algorithme de trading analyse les valeurs de ce champ, il peut toujours voir si l’ordre en question a été placé par lui ou tout autre algorithme.

Prenons un exemple. Supposons que nous devions ouvrir une position longue classique puis, dans un certain temps, la fermer. Pour cela, nous devons exécuter deux ordres. Le premier ordre ouvrira cette position et le second ordre la fermera :

Fig. 2. Ordres formant une position nette historique

Fig. 2. Ordres formant une position nette historique

Et si nous écrivions le nombre magique du premier ordre dans le champ « Order Magic » du deuxième ordre au moment de son envoi sur le marché ?

Plus tard, le champ de cet ordre peut être lu et si la valeur est égale au nombre du premier ordre, alors nous pouvons certainement dire que le deuxième ordre est lié au premier et est opposé à celui-ci, c’est-à-dire un ordre de fermeture.

Sur un diagramme, ce couplage ressemblerait à ceci :

Fig. 3. Ordres d’appariement

Fig. 3. Ordres d’appariement

De façon symbolique, ces ordres peuvent être appelés appariés car le deuxième ordre contient un lien vers le premier. Le premier ordre ouvrant une nouvelle position peut être appelé ordre d’initiation ou d’ouverture. Le deuxième ordre peut être appelé ordre de fermeture.

Une paire de ces ordres peut être appelée position. Pour éviter toute confusion avec le concept de « position » dans MetaTrader 5, nous allons appeler ces positions appairées des positionsbidirectionnelles, de couverture ou des positions HedgeTerminal. Les positions dans MetaTrader 5 seront appelées positions nettes ou positions classiquesde MetaTrader 5.

Apparemment, le nombre de positions HedgeTerminal et leurs directions, contrairement aux positions classiques, peuvent être n’importe lesquels. Que se passe-t-il s’il y a un ordre exécuté qui n’est mentionné par aucun autre ordre ? Un tel ordre peut être présenté comme une position bidirectionnelle active. En fait, si un ordre opposé qui contient un lien vers cet ordre est exécuté, il deviendra un ordre qui ferme le premier ordre. Ces ordres seront appariés et feront une position bidirectionnelle fermée car le volume de deux ordres sera égal et leur direction opposée.

Alors, définissons ce que l’on entend dans HedgeTerminal par position :

Si un ordre exécuté n’est mentionné par aucun autre ordre, HedgeTerminal traite cet ordre comme une position bidirectionnelle active.

Si un ordre exécuté est désigné par un autre ordre exécuté, alors deux de ces ordres font une paire et sont traités par HedgeTerminal comme une position bidirectionnelle unifiée historique ou fermée.

En réalité, l’appariement des ordres dans HedgeTerminal est plus compliqué, car chaque ordre génère au moins une transaction et dans le trade en bourse, il peut y avoir beaucoup de telles transactions. En général, le processus de trading peut être présenté comme suit : un trader passe un ordre pour ouvrir une nouvelle position via le terminal MetaTrader 5. La bourse exécute cet ordre par le biais d’une ou plusieurs transactions.

Les transactions, similaires aux ordres, contiennent des champs pour plus d’informations. L’un de ces champs contient l’identifiant de l’ordre, sur la base duquel la transaction a été exécutée. Ce champ contient des informations sur l’ordre auquel appartient une certaine transaction. L’inverse est faux. L’ordre lui-même ne sait pas quelles transactions lui appartiennent. Cela se produit parce qu’au moment d’exécuter l’ordre, on ne peut pas savoir quelles transactions exécuteront l’ordre et si l’ordre va être exécuté du tout.

De cette façon, la causalité ou le déterminisme des actions est observé. Les transactions font référence aux ordres et les ordres se réfèrent les uns aux autres. Une telle structure peut être présentée comme une liste liée séparément.

Les transactions exécutées de l’ordre d’ouverture génèrent une position classique dans MetaTrader 5 et les transactions qui appartiennent à un ordre de fermeture, au contraire, ferment cette position. Ces paires sont présentées dans la figure ci-dessous :

Fig. 4. Diagramme d’une relation entre les ordres, les transactions et l’échange

Fig. 4. Diagramme d’une relation entre les ordres, les transactions et l’échange

Nous allons revenir à l’analyse détaillée de ce diagramme car la direction des relations est très importante pour la construction d’un système strictement déterminé d’enregistrement des actions du trader, qui est HedgeTerminal.


1.3. Relation entre les positions nettes de MetaTrader 5 et les positions HedgeTerminal

Du point de vue de HedgeTerminal, deux ordres opposés avec les mêmes volumes peuvent être deux positions différentes. Dans ce cas, leur position nette sera nulle. C’est pourquoi HedgeTerminal n’utilise pas d’informations sur les positions nettes factuelles ouvertes dans MetaTrader 5. Par conséquent, les positions dans HedgeTerminal ne sont pas liées aux positions dans MetaTrader 5. Le seul moment où les positions nettes actuelles sont vérifiées est le moment du lancement de HedgeTerminal. Les volumes totaux des positions actives opposées doivent être identiques aux valeurs des positions nettes factuelles.

Si ce n’est pas le cas, un point d’exclamation d’avertissement dans un cadre apparaîtra sur le HedgeTerminal, Les positions ne sont pas égalesindiquant que les positions dans HedgeTerminal et les positions dans MetaTrader 5 ne sont pas égales. Cette asymétrie n’affecte pas l’efficacité de HedgeTerminal, bien que pour un travail correct ultérieur, elle doive être éliminée.

Dans la majorité des cas, elle peut apparaître lorsque les utilisateurs font des erreurs en modifiant les fichiers des ordres exclus ExcludeOrders.xml, bien que la corruption de l’historique des ordres et des transactions sur le serveur puisse également provoquer l’apparition de ce signe. Dans tous les cas, ces écarts peuvent être supprimés par le mécanisme d’exclusion mis en œuvre via le fichier ExcludeOrders.xml.


1.4. Exigences des algorithmes mettant en œuvre le trading bidirectionnel

Des exigences assez strictes sont imposées aux algorithmes mettant en œuvre le trading bidirectionnel. Ils doivent être respectés lors du développement de HedgeTerminal. Sinon, HedgeTerminal se transformerait rapidement en un programme fonctionnant de manière stochastique. Le programme serait « encore une autre solution qui pourrait fonctionner ou ne pas le faire avec la même probabilité »

Voici quelques exigences spécifiées pour son développement:

  1. La représentation des positions bidirectionnelles des traders doit être fiable. Toute idée implémentée dans HedgeTerminal ne doit pas conduire à une ambiguïté ou à des erreurs potentielles dans la logique du métier. Si une propriété ou une opportunité ne répond pas à ces exigences, cette idée ne sera pas utilisée malgré sa commodité et sa demande ;
  2. Tous les algorithmes doivent être basés sur l’environnement de trading MetaTrader 5 autant que possible. Le stockage d’informations supplémentaires dans les fichiers est autorisé dans les cas où cela est strictement nécessaire. Les algorithmes de virtualisation doivent recevoir la majeure partie des informations de l’environnement de trading. Cette propriété améliore le niveau total de fiabilité car la majorité des modifications sont transmises via le serveur et sont donc accessibles depuis n’importe quel point du monde ;
  3. Toutes les actions sur la transformation de l’environnement de trading doivent être effectuées en coulisses. Une configuration et une initialisation complexes de la bibliothèque API HedgeTerminal ne doivent pas être requises. Un utilisateur doit être en mesure de lancer l’application « out of the box » et de recevoir le résultat attendu ;
  4. Le panneau visuel HedgeTerminal doit s’adapter à l’interface générale de MetaTrader 5 de la manière la plus transparente possible, en donnant des outils visuels simples et compréhensibles pour travailler avec des positions bidirectionnelles familières à tous les utilisateurs de MetaTrader 4 et 5. En d’autres termes, le panneau visuel doit être intuitivement clair et simple pour tous les utilisateurs;
  5. Le panneau visuel de HedgeTerminal doit être conçu en tenant compte des exigences élevées des traders algorithmiques. Par exemple, le panneau doit être configurable, l’utilisateur doit pouvoir changer son apparence et même ajouter des modules personnalisés ;
  6. Il doit fournir l’interface de programme intuitive et simple (API) des interactions avec des Experts externes. La partie programme des interactions entre les Experts externes et les algorithmes de HedgeTerminal doit s’adapter de manière transparente à la norme existante de l’interaction du programme des Experts personnalisés avec les fonctions du système MetaTrader 4/5. En fait, l’API HedgeTerminal semble être un hybride des API MetaTrader 4 et MetaTrader 5 ;
  7. HedgeTerminal doit assurer un travail fiable dans l’environnement d’échange, en tenant compte de toutes les nuances de l’exécution des ordres de l’échange. HedgeTerminal est écrit sur la base de l’article canonique Principes de la tarification des changes à travers l'exemple du marché des dérivés de la Bourse de Moscou». Initialement, cet article faisait partie d’un long article sur HedgeTerminal, qui a ensuite été divisé en plusieurs articles indépendants en raison de son volume. On peut dire que HedgeTerminal est une implémentation de programme des idées discutées dans cet article.

Beaucoup de ces idées ne sont pas tout à fait liées les unes aux autres. Par exemple, l’abondance des informations d’échange qui doivent être reflétées dans le trading d’échange est difficile à relier à la simplicité de cette représentation d’information.

Une autre difficulté était de créer un panneau qui pourrait être facile à utiliser pour les traders débutants tout en offrant de nombreuses opportunités pour les traders algorithmiques professionnels. Néanmoins, en évaluant le résultat, il est clair que ces propriétés mutuellement exclusives ont été mises en œuvre avec succès dans HedgeTerminal.


Chapitre 2. Installation de HedgeTerminal, premier lancement

2.1. Installation de HedgeTerminal

Nous savons que tous les ordres exécutés dans HedgeTerminal sont considérés comme des positions. Les positions peuvent être constituées de deux ordres appariés, qui font une position historique fermée, soit d’un ordre non lié, ce qui fait une position ouverte ou active.

Si avant l’installation de HedgeTerminal, il y avait des actions sur le compte de trading et que l’historique de trading contient beaucoup d’ordres exécutés, alors du point de vue de HedgeTerminal, tous ces ordres seront des positions ouvertes car les liens entre eux n’ont pas été créés. Peu importe si l’historique du compte contient 2-3 ordres exécutés. S’il y en a des milliers, HedgeTerminal générera des milliers de positions ouvertes. Que peut-on en faire ? Ces ordres peuvent être « fermés » en passant des ordres opposés contenant des liens vers les ordres d’initiation via HedgeTerminal. Il y a cependant un inconvénient. Si au moment de l’installation de HedgeTerminal il y en a trop, cela peut ruiner le trader car les frais de courtage et les frais de glissement doivent être payés.

Pour éviter cela, HedgeTerminal lance un assistant d’installation dédié au début de son installation, où différentes solutions à ce problème sont suggérées. Lançons HedgeTerminal, appelons cet assistant et décrivons son travail en détail. Pour cela, téléchargez et installez HedgeTerminalDemo à partir du marché MetaTrader 5.

Semblable à HedgeTerminalUltimate, il a une forme d’Expert Advisor et tout ce qu’il faut pour le lancer est de faire glisser son icône disponible dans le dossier « Navigator » vers un graphique gratuit.

Faire glisser cette icône fera apparaître une fenêtre standard suggérant de lancer l’Expert Advisor sur le graphique :


Fig. 5. La fenêtre HedgeTerminal avant le lancement

À ce stade, il suffit de définir le drapeau « Autoriser le commerce automatique », permettant à l’EA d’effectuer des actions de trade. HedgeTerminal suivra vos ordres car il n’a pas sa propre logique de trading, mais pour exécuter des transactions, il aura toujours besoin de votre autorisation.

Pour qu’un Expert Advisor commence à trader, l’autorisation générale de trading via Expert Advisors doit être activée sur le panneau en plus de l’autorisation personnelle de trader dans MetaTrader 5.

Fig. 6. Activation du trading automatisé

Fig. 6. Activation du trading automatisé

HedgeTerminal a été conçu pour que l’utilisateur puisse éviter une configuration longue et complexe.

C’est pourquoi tous les paramètres disponibles sont inclus dans un fichier texte XML spécial. Le seul paramètre explicite pour HedgeTerminal est le nom réel de ces fichiers de paramètres :

Fig. 7. Fenêtre Paramètres du panneau HedgeTerminal

Fig. 7. Fenêtre Paramètres du panneau HedgeTerminal

La nature de ces paramètres et la façon de les modifier seront discutées plus tard.

Après avoir appuyé sur « OK », l’assistant d’installation de HedgeTerminal se lance en suggérant de démarrer le processus d’installation. Le processus d’installation se résume à la création de quelques fichiers dans le répertoire partagé pour les terminaux MetaTrader 4 et MetaTrader 5.

HedgeTerminal demande l’autorisation d’installer ces fichiers :


Fig. 8. Boîte de dialogue du démarrage de l’installation

Si vous ne souhaitez pas que certains fichiers soient installés sur votre ordinateur, appuyez sur « Annuler ». Dans ce cas, HedgeTerminal terminera les travaux. Pour poursuivre l’installation, appuyez sur « OK ».

L’apparence de la boîte de dialogue suivante dépendra du compte avec lequel vous lancez HedgeTerminal. Si aucune transaction n’a été exécutée sur le compte de trading, HedgeTerminal terminera son travail.

Si certaines transactions ont déjà été exécutées, HedgeTerminal affichera la boîte de dialogue suivante :


Fig. 9. Boîte de dialogue détectant le premier lancement de HedgeTerminal

Sur la figure ci-dessus, HedgeTerminal a identifié 5 ordres actifs. Dans votre cas, leur nombre sera différent (il est susceptible d’être grand et égal au nombre total d’ordres exécutés de la durée de vie du compte). Ces ordres ne font pas une paire avec un ordre de fermeture car du point de vue de HedgeTerminal, ce sont des positions actives.

HedgeTerminal suggère plusieurs options.

  1. Excluez ces ordres de HedgeTerminal : « Vous pouvez les cacher dans HedgeTerminal ... Pour masquer ces ordres, cliquez sur « OUI » et passez à l’étape suivante ». Si vous choisissez cette option et appuyez sur « OUI »,, HedgeTerminal les placera dans une liste spécifiée et cessera alors de comptabiliser leur contribution à la position nette agrégée ainsi que leur résultat financier. Ces ordres ne peuvent être placés dans la liste que s’il n’y a pas de position nette actuellement ouverte. Si vous avez une position ouverte sur un ou plusieurs symboles, HedgeTerminal appellera une boîte de dialogue supplémentaire suggérant de fermer les positions existantes.
  2. Laissez les ordres telles quelles et fermez-les plus tard si nécessaire : « Vous pouvez ... fermer manuellement plus tard... Cliquez sur « Non » si vous souhaitez fermer ces ordres manuellement plus tard. Dans ce cas, vous devez effectuer 5 transactions de direction opposée ». Dans ce cas, si vous appuyez sur « Non »,, HedgeTerminal reflétera après le lancement tous ces ordres dans l’onglet « Actif » (c’est-à-dire en tant que positions actives). Plus tard, ces ordres peuvent être fermées avec d’autres ordres via le panneau HedgeTerminal. Après cela, ils se transformeront en positions fermées et seront transférés dans l’onglet « Historique » (positions historiques). Si ces ordres sont très nombreux, il est préférable de les cacher plutôt que de fermer à nouveau tous les ordres exécutés et de payer des frais de courtage.
  3. Vous pouvez arrêter l’installation : « Si vous n’êtes pas prêt à continuer, appuyez sur Annuler. Dans ce cas, HedgeTerminal achève son travail». Si vous choisissez cette option et appuyez sur « Annuler », HedgeTerminal arrêtera son travail.

S’il n’y a pas de positions actives au moment de l’installation de HedgeTerminal, l’installation sera arrêtée à ce stade.

Si vous avez sélectionné la deuxième option et que vous avez actuellement une ou plusieurs positions ouvertes, HedgeTerminal appellera une boîte de dialogue supplémentaire suggérant de les fermer:


Fig. 10. Boîte de dialogue suggérant de fermer automatiquement les positions nettes

HedgeTerminal exige la fermeture de toutes les positions existantes car tous les ordres exécutés doivent être placés dans la liste des ordres exclus. S’il n’y a pas de positions nettes, tout ordre suivant initialise une nouvelle position nette. La direction et le volume dans ce cas sont les mêmes que dans HedgeTerminal et cela permet d’éviter la désynchronisation des positions nettes avec les positions totales dans HedgeTerminal.

HedgeTerminal peut fermer automatiquement toutes les positions nettes pour vous : « Le HedgeTerminal peut fermer automatiquement toutes les positions actives ». Si cela vous convient, appuyez sur « OK ». Dans ce cas, il essaiera de fermer des positions et, en cas de succès, terminera le travail. Si les positions ne peuvent pas être fermées pour une raison quelconque, il passera à la boîte de dialogue de fermeture manuelle de la position. Si vous sélectionnez la fermeture manuelle de la position, « Cliquez sur 'Annuler' si vous souhaitez fermer une position manuellement », appuyez sur « Annuler ».

La boîte de dialogue de fermeture manuelle de position est appelée soit lorsque le type de fermeture manuelle a été choisi dans la fenêtre de dialogue précédente, soit lorsque la fermeture automatique de position est impossible.


Fig. 11. Boîte de dialogue suggérant de fermer manuellement les positions nettes

À ce stade, toutes les positions actives doivent être fermées manuellement via MetaTrader 5 ou l’installation doit être annulée en appuyant sur « Annuler ». Une fois toutes les positions fermées, appuyez sur « Réessayer ».


2.2. Installation en trois étapes. Schéma d’installation et solution aux problèmes éventuels

Si nous simplifions autant que possible le processus d’installation, il peut être réduit à trois étapes :

  1. Avant d’installer HedgeTerminal, fermez toutes les positions nettes actuellement actives dans le terminal MetaTrader 5 ;
  2. Lancez HedgeTerminal sur le graphique et appuyez sur « Oui » dans la fenêtre apparue de l’assistant d’installation pour démarrer l’installation. HedgeTerminal dans ce cas installera tous les fichiers nécessaires à son fonctionnement ;
  3. Dans la fenêtre suivante, si cela apparaît, sélectionnez la deuxième option et appuyez sur « Oui ». Dans ce cas, les positions actives n’apparaîtront pas lorsque HedgeTerminal sera lancé et les informations sur les ordres précédemment exécutés seront automatiquement transférées dans le fichier ExcludeOrders.xml car aucune position active ne nécessite une fermeture.

La façon la plus simple de décrire cela est la suivante : fermez toutes les positions avant de lancer Hedge Terminal, puis appuyez deux fois sur « Oui » dans l’assistant d’installation de HedgeTerminal.

Le modèle complet de l’assistant d’installation est représenté sur le diagramme ci-dessous. Cela aidera à répondre aux questions et à effectuer l’installation correctement:


Fig. 12. Assistant d’installation

Quelle est la ligne de conduite si l’installation n’a pas été effectuée correctement ou si HedgeTerminal doit être supprimé de l’ordinateur ? Dans le cas où l’installation était incorrecte, supprimez simplement tous les fichiers installés. Pour cela, allez dans le dossier où les programmes de MetaTrader stockent les informations partagées (en règle générale, il se trouve à l’emplacement suivant : c:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\). Si vous souhaitez supprimer des informations sur l’installation de HedgeTerminal de tous les comptes, recherchez le dossier « HedgeTerminal » dans ce répertoire et supprimez-le. Si vous souhaitez supprimer des informations sur l’installation de HedgeTerminal uniquement pour un certain compte, accédez au répertoire \HedgeTerminal\Brokers et sélectionnez le dossier contenant le nom de votre broker et le numéro de compte qui ressemble à «Nom du broker - numéro de compte». Supprimez ce dossier. La prochaine fois, l’assistant d’installation se lancera à nouveau lorsque HedgeTerminal sera démarré sur ce compte.

Installation sur le terminal connecté au compte fonctionnant déjà avec HedgeTerminal. Il peut arriver que HedgeTerminal doive être installé sur le terminal connecté au compte où HedgeTerminal fonctionne déjà. Comme vous le savez déjà, le processus d’installation consiste à créer et à configurer des fichiers système. Si tous ces fichiers sont déjà créés sur un autre ordinateur et correctement configurés, il n’est pas nécessaire d’installer HedgeTerminal. En règle générale, ces fichiers sont stockés à l’emplacement c:\Users\<your_user_name>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. Il suffit de reporter ce dossier au même endroit sur votre ordinateur. Après avoir copié le répertoire, relancez HedgeTerminal. L’assistant d’installation ne sera pas appelé car tous les fichiers sont présents et configurés. Dans ce cas, les positions actives seront similaires à l’affichage sur d’autres terminaux et ordinateurs.

Installation de HedgeTerminalAPI et utilisation de la bibliothèque en mode test. HedgeTerminal est implémenté à la fois comme un panneau visuel et une bibliothèque de fonctions de programme - HedgeTerminalAPI. La bibliothèque contient un assistant d’installation similaire appelé au premier lancement de HedgeTerminalAPI en temps réel. L’installation de fichiers lors de l’utilisation de la bibliothèque est similaire. Au premier appel d’une fonction, l’Expert affichera un MessageBox pertinent suggérant de démarrer l’installation. Dans ce cas, l’utilisateur doit faire la même chose - fermer toutes les positions avant d’appeler HedgeTerminalAPI et effectuer l’installation en trois étapes.

Il n’est pas nécessaire d’installer HedgeTerminal lors du lancement de la bibliothèque en mode test. Comme en mode test, l’Expert commence à travailler chaque fois avec un nouveau compte virtuel, il n’est pas nécessaire de masquer l’ordre précédemment exécuté et d’installer les fichiers. Les paramètres stockés dans le fichier Paramètres.xml, dans la bibliothèque peuvent être définis grammaticalement en appelant les fonctions pertinentes.


2.3. Premiers pas avec HedgeTerminal, premier lancement

Une fois que HedgeTerminal a installé tous les fichiers nécessaires à son travail, il se lancera sur le graphique et affichera son panneau :

Fig. 13. Premier lancement de HedgeTerminal, apparition

Fig. 13. Premier lancement de HedgeTerminal, apparition

Comme toutes les ordres existants sont masqués, il n’y a pas de positions actives affichées. Le panneau supérieur contient un bouton du menu HedgeTerminal sur le côté gauche et des icônes dédiées affichant l’état du panneau. Les boutons ont les fonctions suivantes :

  •  - Indique que la version de démonstration du panneau a été lancée. Cela ne prend pas en charge le trade sur les comptes réels et affiche les positions uniquement sur les symboles AUDCAD et VTBR *. Dans ce mode, l’historique des positions est également limité par les 10 dernières positions fermées.
  •  - Indique que les positions dans HedgeTerminal ne sont pas égales à la position nette totale dans MetaTrader 5. Il ne s’agit pas d’une erreur critique, mais elle doit être éliminée. Si l’installation de HedgeTerminal est correcte, reportez-vous à la section de cet article décrivant comment éliminer l’erreur.
  •  - L’icône signifie que le trade est impossible. Passez la souris sur cette icône et découvrez à partir de l’astuce pop-up quel est le problème. Raisons possibles : pas de connexion avec le serveur ; il est interdit à l’Expert Advisor de négocier ; le trading avec Expert Advisors n’est pas autorisé dans MetaTrader 5.
  • - Une icône indiquant que le trade est autorisé ; HedgeTerminal peut effectuer n’importe quelle action de trade.

Maintenant, lorsque HedgeTerminal est lancé et prêt pour le travail, effectuez plusieurs transactions et voyez comment elles sont affichées. Si HedgeTerminal est lancé sur le Forex, les actions de trading doivent être exécutées sur le symbole AUDCAD. Il ne devrait pas y avoir de positions nettes ouvertes car l’installation de HedgeTerminal ne pourrait réussir que dans ce cas. Si ce n’est pas le cas pour une raison quelconque, fermez toutes les positions actives.

Si HedgeTerminal est lancé sur un compte connecté à la Bourse de Moscou, le trading doit être exécuté sur l’un des contrats à terme du groupe VTBR*, par exemple VTBR-13.15 ou VTBR-06.15. À titre d’illustration, achetez 0,4 lot d’AUDCAD au prix actuel via la fenêtre standard « NewOrder ». Dans quelques instants, l’ordre et la transaction qui l’a exécuté apparaîtront dans l’historique des ordres du terminal :

Fig. 14. Ordre historique et sa transaction dans MetaTrader 5

Fig. 14. Ordre historique et sa transaction dans MetaTrader 5

L’onglet positions actives contiendra une position longue correspondante de 0,4 lot :

Fig. 15. Position nette active dans MetaTrader 5

Fig. 15. Position nette active dans MetaTrader 5

Dans le même temps, HedgeTerminal affichera l’ordre historique en tant que position active :

Fig. 16. Position bidirectionnelle active dans HedgeTerminal et sa transaction

Fig. 16. Position bidirectionnelle active dans HedgeTerminal et sa transaction

Comme nous pouvons le voir, les résultats sont les mêmes, car une position dans HedgeTerminal correspond à 1 position nette dans MetaTrader 5.

Veuillez noter qu’en plus de l’ordre, la position dans HedgeTerminal contient une transaction qui a exécuté cette position (pour la voir, maximisez la chaîne de position en appuyant sur )

Une partie d’une position active peut être masquée. Pour cela, entrez simplement une nouvelle valeur de volume dans le champ « Vol ». (Volume). Le nouveau volume doit être inférieur au volume actuel. La différence entre les volumes actuels et les nouveaux volumes sera couverte par le nouvel ordre qui forme une position historique et est affiché dans l’onglet correspondant des positions historiques. Entrez la valeur 0,2 dans ce champ, puis appuyez sur Entrée. Dans un certain temps, le volume de la position active sera de 0,2 et l’onglet positions historiques comportera la première transaction historique avec le volume de 0,2 lot (0,4 - 0,2 = 0,2) :

Fig. 17. Position bidirectionnelle historique dans HedgeTerminal

Fig. 17. Position bidirectionnelle historique dans HedgeTerminal


En d’autres termes, nous avons fermé la moitié de notre position active. Le résultat financier commun de la position historique et active sera identique au résultat dans le terminal.

Maintenant, nous allons fermer le reste de la position active. Pour cela, appuyez sur le bouton de fermeture d’une position dans HedgeTerminal:

Fig. 18. Bouton de fermeture d’une position bidirectionnelle dans HedgeTerminal

Fig. 18. Bouton de fermeture d’une position bidirectionnelle dans HedgeTerminal

Après avoir appuyé sur ce bouton, la position restante doit être fermée par l’ordre inverse et transférée dans l’onglet de position historique. De cette façon, les positions actives (à la fois dans MetaTrader 5 et dans HedgeTerminal) seront fermées.


2.4. Couverture et calcul des opérations financières

Dans cette section, nous allons décrire les méthodes de travail avec HedgeTerminal en utilisant plusieurs positions bidirectionnelles à titre d’exemple.

Nous n’avons donc actuellement aucune position active. Ouvrez une nouvelle position longue avec un volume de 0,2 lot sur AUDCAD. Pour cela, il suffit d’ouvrir la fenêtre de dialogue « nouvel ordre » et d’exécuter un ordre correspondant. Une fois la position ouverte, verrouillez-la par la position opposée - vendez 0,2 lot via le terminal MetaTrader 5.

Cette fois, le résultat du trade dans HedgeTerminal et dans la fenêtre du terminal MetaTrader 5 sont différents. HedgeTerminal affiche deux positions :

Fig. 19. Positions bidirectionnelles opposées dans HedgeTerminal(verrouiller)

Fig. 19. Positions bidirectionnelles opposées dans HedgeTerminal (verrouiller)

Dans MetaTrader 5, elles ne sont pas présentes du tout :

Fig. 20. Absence de position nette active dans MetaTrader 5

Fig. 20. Absence de position nette active dans MetaTrader 5

Évaluons le résultat. 4 transactions ont été exécutées. Elles sont dans le cadre rouge sur la capture d’écran ci-dessous :

Fig. 21. Résultat des transactions exécutées dans MetaTrader 5

Fig. 21. Résultat des transactions exécutées dans MetaTrader 5

Mettez ces transactions dans une table :

TypeDirectionPrixVolumeProfit, pips
Achat   in0,980880,2
Vente   out0,980890,21
Achat   in0,982070,2
Vente   out0,982080,21

Table 1. Affichage des transactions dans le terminal MetaTrader 5

Il est évident que 2 points ont été gagnés sur 4 transactions. La valeur de chaque point est d’environ 0,887 dollar lors du trading d’un lot. Ainsi, le résultat financier est de 0,18 dollar par position (0,887 * 0,2 * 1) ou 34 cents pour les deux positions. La colonne « Profit » indique que ce résultat est correct. Le bénéfice net est de 34 cents.

Maintenant, regardez le résultat dans HedgeTerminal:

 Fig. 22. Résultat des positions bidirectionnelles historiques dans HedgeTerminal

Fig. 22. Résultat des positions bidirectionnelles historiques dans HedgeTerminal

Au début, ils semblent différer considérablement. Calculons le résultat pour nos deux positions bidirectionnelles :

DirectionPrix d’entréePrix de sortieProfit, pipsProfit, $
Achat0,980880,982080.0012021,28
Vente0,980890,98207-0.00118-20,92

Table 2. Affichage des positions dans HedgeTerminal

La différence entre elles est de 0.34$ (21,28$ -20,92$), ce qui est exactement le même que le résultat obtenu dans le trading net.


2.5. Trading en un clic

HedgeTerminal utilise un système de gestion particulier. Ceci est basé sur la saisie directe des valeurs requises dans le champ de position active. Il n’y a pas d’autre gestion.

Par exemple, pour exécuter StopLoss pour une position active, entrez simplement la valeur requise dans le champ StopLoss, puis appuyez sur Entrée :

Fig. 23. Entrée du niveau StopLoss directement dans la table

Fig. 23. Entrée du niveau StopLoss directement dans la table

De même, de cette façon, un trader peut modifier le volume, exécuter TakeProfit ou modifier son niveau, changer le commentaire initial.

En général, la ligne de position dans HedgeTerminal est similaire à l’affichage de position dans MetaTrader 4/5. Les colonnes de la table avec les positions ont des noms et des valeurs identiques utilisés dans les terminaux MetaTrader. Il y a aussi des différences. Ainsi, une position dans HedgeTerminal a deux commentaires alors que dans MetaTrader une position n’a qu’un seul commentaire. Cela signifie qu’une position dans HedgeTerminal est formée par deux ordres et que chacun d’eux a son propre champ de commentaire. Comme HedgeTerminal n’utilise pas ces commentaires pour stocker des informations techniques, il est possible de créer une position avec un commentaire d’ouverture et de fermeture.

HedgeTerminal offre la possibilité d’ajouter des colonnes qui ne sont pas affichées par défaut. Par exemple, une colonne reflétant le nom de l’Expert Advisor qui a ouvert la position. La section dédiée à la configuration du fichier Paramètres.xml décrit la façon de procéder.


2.6. Exécuter les StopLoss et TakeProfit, Trailing Stop

HedgeTerminal permet de fermer des positions selon les niveaux StopLoss ou TakeProfit.

Pour voir comment cela se passe, introduisez les niveaux StopLoss et TakeProfit en position active, puis attendez que l’un de ces niveaux se déclenche. Dans notre cas, TakeProfit s’est déclenché. Il a fermé la position et l’a déplacée vers la liste des transactions historiques :

Fig. 24. Position bidirectionnelle historique et ses niveaux StopLoss et TakeProfit

Fig. 24. Position bidirectionnelle historique et ses niveaux StopLoss et TakeProfit

La marque verte dans le niveau TakeProfit indique que TakeProfit s’est déclenché et que la position a été fermée par ce niveau. En plus de TakeProfit, une position contient des informations sur le niveau StopLoss qui a également été utilisé lorsque la position était active. De même, si le niveau StopLoss se déclenchait, la cellule StopLoss serait surlignée en rose et TakeProfit ne serait pas coloré.

HedgeTerminal prend en charge le TrailingStop et les versions futures permettront d’écrire un module personnalisé spécifique contenant la logique de report du StopLoss. Actuellement, le travail avec le Trailing Stop dans HedgeTerminal est différent du même Trailing Stop dans le terminal MetaTrader. Pour l’activer, il est nécessaire d’entrer le niveau StopLoss dans la cellule StopLoss de la position correspondante. Lorsque le StopLoss est exécuté, l’option de prix suivante peut être signalée dans la cellule marquée d’un signe :

Fig. 25. Exécuter le Trailing Stop dans HedgeTerminal

Fig. 25. Exécuter le Trailing Stop dans HedgeTerminal

Après le signalement, HedgeTerminal fixe la distance entre le prix actuel et le niveau de StopLoss. S’il augmente, StopLoss suivra le prix afin que la distance reste la même. Le Trailing Stop ne fonctionne que lorsque HedgeTerminal fonctionne et est dégagé à la sortie.

Dans HedgeTerminal, le StopLoss est mis en œuvre avec les ordres BuyStop et SellStop. Chaque fois qu’un StopLoss est exécuté, un ordre correspondant avec un nombre magique lié à la position active est également exécuté. Si cet ordre en attente est supprimé dans le terminal MetaTrader, le niveau StopLoss dans HedgeTerminal disparaîtra. La modification du prix de l’ordre en attente déclenchera le changement du StopLoss dans HedgeTerminal.

Le TakeProfit fonctionne un peu différemment. Ceci est virtuel et il cache son niveau de déclenchement au broker. Cela signifie que HedgeTerminal ferme une position par TakeProfit de manière autonome. Par conséquent, si vous voulez que votre TakeProfit se déclenche, vous devez garder votre HedgeTerminal en état de fonctionnement.


2.7. Génération de rapports

HedgeTerminal permet d’enregistrer les informations sur ses positions bidirectionnelles dans des fichiers désignés, qui peuvent être chargés dans des programmes statistiques d’analyse tiers, par exemple dans Microsoft Excel.

Étant donné que HedgeTerminal ne dispose actuellement pas d’un système d’analyse et de collecte de statistiques, cette fonctionnalité est particulièrement importante. À l’heure actuelle, un seul format d’enregistrement de rapport est pris en charge - CSV (valeurs séparées par des virgules). Voyons comment cela fonctionne. Pour enregistrer les positions bidirectionnelles dans le fichier CSV, sélectionnez l’option « Enregistrer le rapport CSV » dans le menu après avoir lancé HedgeTerminal :


Fig. 26. Enregistrement d’un rapport via le menu « Enregistrer le rapport CSV »

Après avoir sélectionné ces points dans le menu, HedgeTerminal générera deux fichiers au format CSV. L’un d’eux comprendra les informations sur les postes actifs et un autre sur les postes historiques et terminés. La raison pour laquelle deux fichiers différents sont générés est que chacun d’eux a un ensemble différent de colonnes. En outre, le nombre de positions actives peut varier constamment, il est donc plus pratique de les analyser séparément. Les fichiers générés sont disponibles par chemin d’accès relatif .\HedgeTerminal\Brokers\<Nom du broker - numéro de compte> \. Il doit y avoir deux fichiers à la fin : Historique.csv et Actif.csv. Le premier contient des informations sur les positions historiques et le second sur les positions actives.

Les fichiers peuvent être chargés dans les programmes statistiques pour analyse. Examinons cette procédure en utilisant Microsoft Excel comme exemple. Lancez ce programme et sélectionnez « Données » « À partir du texte ». Dans l’assistant d’exportation de données qui apparaît, sélectionnez le mode avec séparateurs. Dans la fenêtre suivante, sélectionnez le point-virgule comme séparateur. Appuyez sur « Suivant ». Dans la fenêtre suivante, modifiez le format général de la représentation numérique à virgule flottante. Pour ce faire, appuyez sur « Détails ». Dans la fenêtre qui apparaît, sélectionnez le caractère de point comme séparateur des parties entière et fractionnaire :

Fig. 27. Exporter le rapport CSV vers Microsoft Excel

Fig. 27. Exporter le rapport CSV vers Microsoft Excel

Appuyez sur « ОК », puis sur « Terminer ». La table qui apparaît contient des informations sur les positions actives :

Fig. 28. Informations sur les positions actives exportées vers Excel

Fig. 28. Informations sur les positions actives exportées vers Excel

Les données sur les positions historiques peuvent être chargées dans la feuille suivante de la même manière. Le nombre de colonnes correspondra au nombre factuel de colonnes dans HedgeTerminal. Si l’une des colonnes est supprimée du panneau HedgeTerminal, elle ne sera pas incluse dans le rapport. Il s’agit d’un moyen pratique de former un rapport basé uniquement sur les données requises.

Les versions ultérieures du programme permettront d’enregistrer un rapport aux formats XML et HTML. Ajouté à cela, un rapport enregistré en HTML sera similaire à un rapport HTML standard dans MetaTrader 5, bien qu’il se compose de positions bidirectionnelles terminées.


2.8. Présentation des swaps de devises

Le swap de devises est une combinaison de deux transactions de conversion bidirectionnelles pour la même somme avec des dates d’évaluation différentes.

En termes simples, le swap est une opération dérivée sur l’accumulation de la différence des taux d’intérêt payés pour détenir deux devises formant une position nette.

Il n’y a pas d’historique des positions nettes dans MetaTrader 5. Il y a des ordres et des transactions historiques qui ont formé et fermé des positions nettes historiques à la place. Comme il n’y a pas de positions historiques, l’échange est affecté à l’ordre qui ferme une position historique :

 Fig. 29. Swap de devises en tant que transaction indépendante

Fig. 29. Swap de devises en tant que transaction indépendante

Il serait plus exact de présenter le swap comme une opération dérivée indépendante apparaissant à la suite d’une prolongation nette de la position.

La version actuelle de HedgeTerminal ne prend pas en charge la représentation d’échange, bien que les versions ultérieures comportent une telle option. Là, un swap sera affiché en tant que position historique distincte dans l’onglet position historique. L’identificateur d’échange correspondra à l’identificateur de la position nette sur laquelle il a été accumulé. Le swap comprendra le nom de la paire de devises et son résultat financier.


2.9. Rangée du bas

Semblable à MetaTrader, HedgeTerminal affiche la dernière ligne avec des caractéristiques communes pour l’ensemble du compte dans la table des transactions. Pour la table des positions actives et historiques, ces caractéristiques et leurs valeurs sont énumérées ci-dessous :

    Solde – Solde total. Égal à la valeur similaire «Profit» dans la fenêtre des positions actives dans MetaTrader. Cela ne tient pas compte du profit ou de la perte flottante des positions ouvertes.
    P/P flottant - Profit/perte flottant. Ceci est égal à la somme du profit de toutes les positions actuellement actives.
    Marge - Contient une part des fonds de nantissement du solde du compte en pourcentage. Peut varier de 0 % à 100 %. Indique un degré de la charge sur le dépôt.
    Total P/P- Contient une somme de tous les profits et pertes pour les positions fermées.
    Pos.:# - Affiche le nombre de positions historiques.

Pour un affichage correct de la ligne du bas, il est nécessaire d’ajouter la police « Arial Rounded MT Bold » au système.


2.10. Modification de l’apparence des tables de HedgeTerminal

Comme mentionné précédemment, HedgeTerminal n’a qu’un seul paramètre explicite dans la fenêtre du lancement Expert. Il s’agit du nom si le fichier de paramètres. Il en est ainsi car les paramètres HedgeTerminal ne peuvent pas être exécutés dans la fenêtre des paramètres Expert. Il y en a beaucoup et ils sont trop spécifiques pour une telle fenêtre. C’est pourquoi tous les paramètres sont placés dans le fichier de configuration désigné Paramètres.xml. Pour chaque version lancée de HedgeTerminal, il peut y avoir son propre fichier de paramètres. Cela donne la possibilité de configurer chaque version lancée de HedgeTerminal individuellement.

HedgeTerminal n’autorise actuellement pas la modification de ce fichier via les fenêtres visuelles des paramètres. Par conséquent, la seule façon de modifier le comportement de HedgeTerminal est de modifier le fichier manuellement. Le fichier de paramètres est configuré de manière optimale par défaut et donc la plupart du temps, il n’est pas nécessaire de modifier le contenu. Il peut y avoir des situations où une telle modification peut être nécessaire. Une telle modification est nécessaire pour affiner et personnaliser l’apparence du panneau. Par exemple, lorsqu’un fichier a été modifié, des colonnes inutiles peuvent être supprimées ou, au contraire, les colonnes non affichées par défaut peuvent être ajoutées.

Voyons le contenu de ce fichier et voyons comment le personnaliser. Pour ce faire, recherchez ce fichier dans le répertoire où HedgeTerminal a installé ses fichiers. Ce répertoire, comme mentionné précédemment, se trouve à l’adresse c:\Users\<votre nom d’utilisateur>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\HedgeTerminal. Le fichier Paramètres.xml doit se trouver à l’intérieur. Ouvrez-le à l’aide de n’importe quel éditeur de texte :

<!--This settings valid for HedgeTerminal only. For settings HedgeTerminalAPI using API function and special parameters.-->
<Hedge-Terminal-Settings>
        <!--This section defines what columns will be showed on the panel.-->
        <Show-Columns>
                <!--You can change the order of columns or comment not using columns.-->
                <!--You can change the value of 'Width' for a better scaling of visual table.-->
                <!--You can change the value of 'Name' to install your column name.-->
                
                <!--This columns for tab 'Active'-->
                <Active-Position>       
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="80"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="EntryPrice" Name="EntryPrice" Width="50"/>
                        <Column ID="TralStopLoss" Name="TralSL" Width="20"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="CurrentPrice" Name="Price" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="60"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="100"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="100"/>
                </Active-Position>
                <!--This columns for tab 'History'-->
                <History-Position>
                        <Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
                        <!-- Unset this comment if you want auto trading and want see name of your expert:
                        <Column ID="Magic" Name="Magic" Width="100"/>-->
                        <Column ID="Symbol" Name="Symbol" Width="70"/>
                        <Column ID="EntryID" Name="Entry ID" Width="80"/>
                        <Column ID="EntryDate" Name="Entry Date" Width="110"/>
                        <Column ID="Type" Name="Type" Width="40"/>
                        <Column ID="EntryPrice" Name="Entry Price" Width="50"/>
                        <Column ID="Volume" Name="Vol." Width="30"/>
                        <Column ID="ExitPrice" Name="Exit Price" Width="50"/>
                        <Column ID="ExitDate" Name="Exit Date" Width="110"/>
                        <Column ID="ExitID" Name="Exit ID" Width="80"/>
                        <Column ID="StopLoss" Name="S/L" Width="50"/>
                        <Column ID="TakeProfit" Name="T/P" Width="50"/>
                        <Column ID="Commission" Name="Comm." Width="40"/>
                        <Column ID="Profit" Name="Profit" Width="50"/>
                        <Column ID="EntryComment" Name="Entry Comment" Width="90"/>
                        <Column ID="ExitComment" Name="Exit Comment" Width="90"/>
                </History-Position>
        </Show-Columns>
        <Other-Settings>
                <Deviation Value="30"/>
                <Timeout Seconds="180"/>
                <!-- If your computer is not fast enough - set a value 'Milliseconds' greater than 200, such as 500 or 1000. -->
                <RefreshRates Milliseconds="200"/>
        </Other-Settings>
</Hedge-Terminal-Settings>

Ce fichier contient un document spécial écrit en le langage de balisage xml, décrivant le comportement et l’apparence de HedgeTerminal.

La principale chose à faire avant le début de l’édition est de créer une copie de sauvegarde au cas où le fichier serait accidentellement corrompu. Le fichier a une structure hiérarchique et se compose de plusieurs sections enfermées les unes dans les autres. La section principale s’appelle <Hedge-Terminal-Settings>et contient deux sous-sections principales : <Show-Columns> et <Other-Settings>. Comme l’indique leurs noms, la première section ajuste les colonnes affichées et leur largeur conditionnelle et la deuxième section possède les paramètres du panneau lui-même et de la bibliothèque HedgeTerminalAPI.

Modification de la taille et du nom des colonnes. Référons-nous à la section <Show-Columns> et considérons sa structure. Essentiellement, cette section contient deux ensembles de colonnes : l’une pour la table des positions actives dans l’onglet « Actif » et l’autre pour la table des positions historiques dans l’onglet « Historique ». Chaque colonne de l’un des ensembles ressemble à ceci :

<Column ID="Symbol" Name="Symbol" Width="70"/>

La colonne doit contenir un identificateur (ID= « Symbole »), le nom de la colonne (Nom= « Symbole »)et une largeur conditionnelle (Largeur= « 70 »).

L’identificateur contient un nom interne unique de la colonne. Il invite HedgeTerminal à afficher cette colonne et la valeur à y placer. L’identificateur ne peut pas être modifié et doit être pris en charge par HedgeTerminal.

Le nom de la colonne définit le nom avec lequel la colonne sera affichée dans la table. Si le nom est changé pour un autre, comme : Nom= «Paire de devises», puis au prochain lancement de HedgeTerminal, le nom de la colonne affichant le symbole changera :


Fig. 30. Modification des noms de colonne dans le panneau HedgeTerminal

Cette propriété permet de créer une version localisée du panneau où le nom de chaque colonne sera affiché dans la langue préférée, par exemple en russe :

 Fig. 31. Localisation du panneau HedgeTerminal

Fig. 31. Localisation du panneau HedgeTerminal

La balise suivante contient la largeur conditionnelle de la colonne. Le fait est qu’un moteur graphique aligne automatiquement la taille de la table avec la largeur de la fenêtre où le panneau est lancé. Plus la fenêtre est large, plus chaque colonne est large. Il est impossible de configurer la largeur de la colonne avec précision, mais les proportions peuvent être spécifiées en configurant la largeur de base de la colonne. La largeur de base est la largeur de la colonne en pixels lorsque la largeur de la fenêtre est de 1280 pixels.

Si votre affichage est plus large, la taille factuelle de la colonne est plus grande. Pour voir comment fonctionne la mise à l’échelle uniforme, définissez la largeur de la colonne Symbole sur 240 pixels conditionnels : Largeur= « 240 ». Enregistrez ensuite le fichier et réinitialisez le panneau:

Fig. 32. La largeur de la colonne Symbole est définie sur 240 pixels.

Fig. 32. La largeur de la colonne Symbole est définie sur 240 pixels.

La largeur de la colonne avec des symboles a considérablement augmenté. Cependant, il convient de noter que sa largeur a été gagnée au détriment de la largeur des autres colonnes («ID d’entrée »  et « Date d’entrée »).

D’autres colonnes ont maintenant l’air moins bien, les dernières valeurs ne rentrent pas dans la largeur autorisée. La taille des colonnes doit être modifiée avec soin, en trouvant la meilleure taille pour chacune d’elles. Les paramètres standard ont des valeurs précises pour la majorité des écrans et il n’est normalement pas nécessaire de modifier leur taille.

Suppression de colonnes. En plus de modifier la taille des colonnes et leurs en-têtes, les colonnes peuvent également être ajoutées ou supprimées. Par exemple, essayons de supprimer la colonne « Symbole » de la liste. Pour ce faire, il suffit de commenter la balise de la colonne dans le fichier Paramètres.xml (surligné en jaune) :

<Column ID="CollapsePosition" Name="CollapsePos." Width="20"/>
<!-- Unset this comment if you want auto trading and want see name of your expert:
<Column ID="Magic" Name="Magic" Width="100"/>-->
<!--<Column ID="Symbol" Name="Symbol" Width="70"/>-->
<Column ID="EntryID" Name="Entry ID" Width="80"/>

En xml, une balise spécifiée <!-- contenu du commentaire a un rôle de commentaire. La colonne commentée doit se trouver dans la balise. Une fois que les modifications apportées au fichier ont été enregistrées et que HedgeTerminal a été relancé, son ensemble de colonnes pour les positions historiques changera. Il ne contiendra pas de colonne affichant le symbole :

Fig. 33. Suppression de la colonne Symbole de la table des positions actives

Fig. 33. Suppression de la colonne Symbole de la table des positions actives

Plusieurs colonnes peuvent être supprimées à la fois.

Commentons toutes les colonnes à l’exception du nom du symbole et de la taille du profit, puis relançons HedgeTerminal sur le graphique:

Fig. 34. Suppression des colonnes principales du panneau HedgeTerminal

Fig. 34. Suppression des colonnes principales du panneau HedgeTerminal

Comme nous pouvons le voir, la table HedgeTerminal a considérablement diminué. Il faut faire attention à la suppression des colonnes car dans certains cas, elles contiennent des éléments de gestion de position. Dans notre cas, la colonne qui permet d’inverser les positions et d’afficher leurs transactions a été supprimée. Même la colonne « Profit » de la table des positions actives peut être supprimée. Cette colonne, cependant, contient un bouton de position de fermeture. Dans ce cas, une position ne sera pas fermée car le bouton de fermeture est manquant.

Ajout de colonnes et affichage des alias d’Experts. Les colonnes peuvent être supprimées en les modifiant et ajoutées, si HedgeTerminal a été programmé pour fonctionner avec elles. À l’avenir, un utilisateur pourra créer ses propres colonnes et calculer ses propres paramètres. Ces colonnes peuvent être connectées via l’interface de l’indicateur externe iCustom et le manifeste d’interaction avec les modules d’extension, écrits en xml.

Actuellement, il n’existe pas une telle fonctionnalité et seules les colonnes prises en charge par HedgeTerminal sont disponibles. La seule colonne prise en charge par le panneau mais non affichée par défaut dans les paramètres est la colonne qui contient le nombre magique de l’Expert.

La position peut être ouverte non seulement manuellement, mais aussi à l’aide d’un robot. Dans ce cas, l’identifiant du robot, qui a ouvert une position, peut être affiché pour chaque position. La balise de colonne commentée incluant le numéro de l’Expert Advisor est déjà présente dans le fichier de paramètres. Retirons-en le commentaire :

<Column ID="Magic" Name="Magic" Width="100"/>

Enregistrez les modifications et relancez le panneau :

Fig. 35. Ajout de la colonne Magique à la table HedgeTerminal

Fig. 35. Ajout de la colonne Magique à la table HedgeTerminal

Comme nous pouvons le voir sur l’image ci-dessus, une colonne appelée « Magique » est apparue. Il s’agit de l’identifiant de l’Expert Advisor qui a ouvert une position. La position a été ouverte manuellement et donc l’identifiant est égal à zéro. Une position ouverte par un robot contient en règle générale un identifiant différent de zéro. Dans ce cas, un numéro magique correspondant de l’Expert sera affiché dans la colonne.

Il est cependant plus pratique de voir les noms des Expert Advisors au lieu de leurs numéros. HedgeTerminal possède cette option. Il prend les alias (noms) des EA tirés du fichier ExpertAliases.xml et les affiche à la place des nombres magiques correspondants.

Par exemple, si vous avez un Expert appelé « ExPro 1.1 » et que vous tradez sous le nombre magique 123847, il suffit de placer la balise suivante dans le fichier ExpertsAliases.xml dans la section <Expert-Aliases> :

<Expert Magic="123847" Name="ExPro 1.1"></Expert>

Désormais, lorsque votre robot ouvre une nouvelle position, il aura son nom :

Fig. 36. Affichage du nom de l’Expert dans la colonne Magique

Fig. 36. Affichage du nom de l’Expert dans la colonne Magique

Le nombre de robots et leurs noms ne sont pas limités. La seule condition ici est que leur nombre diffère.

Autres paramètres de HedgeTerminal. Nous avons décrit tous les paramètres du panneau visuel actuellement disponibles. La section suivante <Autres-Paramètres> contient les paramètres définissant le travail interne du terminal. Veuillez noter que la bibliothèque d’appels de programme HedgeTerminalAPI utilise ces paramètres comme valeurs par défaut. L’Expert Advisor, cependant, peut modifier les valeurs actuelles de ces paramètres à l’aide des fonctions spéciales Définir... Pour obtenir les valeurs de ces paramètres, l’Expert n’a qu’à appeler des fonctions spéciales Obtenir... . Nous allons décrire les balises avec des paramètres plus en détail.

<Deviation Value="30"/>

Contient la valeur de l’écart extrême par rapport au prix requis en unités de variation de prix minimale. Ainsi, pour la paire EURUSD cotée à la cinquième décimale, ce sera 0,0003 point. Pour le contrat à terme sur indice RTS, cette valeur sera de 300 points car l’étape minimale du changement de prix est de 10 points. Si l’écart de prix est plus important, l’ordre de fermeture ou de modification du prix ne sera pas exécuté. Ceci est en place pour la protection contre les dérapages défavorables.

<Timeout Seconds="180"/>

Cette balise contient la valeur de la réponse maximale autorisée du serveur. HedgeTerminal fonctionne en mode asynchrone. Cela signifie que HedgeTerminal envoie un signal de trading au serveur sans attendre de recevoir une réponse de ce dernier. Au lieu de cela, HedgeTerminal contrôle la séquence d’événements pointant vers le fait que l’ordre a été passé avec succès. L’événement peut ne pas avoir lieu du tout. C’est la raison pour laquelle il est si important de définir le délai d’attente, pendant lequel HedgeTerminal attendra la réponse du serveur. S’il n’y a pas de réponse pendant ce temps, la tâche sera annulée, HedgeTerminal débloquera la position et poursuivra son travail.

Le délai d’attente peut être raccourci ou prolongé. Par défaut, il s’agit de 180 secondes.

Il est important de comprendre que dans le trading réel, cette limitation n’est jamais atteinte. Les réponses aux signaux de trading reviennent rapidement, la majorité d’entre eux sont exécutés dans les 150 à 200 millisecondes.

Plus de détails sur le travail de HedgeTerminal et sur les particularités du travail en mode asynchrone peuvent être trouvés dans la troisième section de cet article : « Sous le capot de HedgeTerminal ».

<RefreshRates Milliseconds="200"/>

Cette balise définit la fréquence des mises à jour du panneau. Elle contient le temps en millisecondes entre deux mises à jour de panneau conséquentes. Moins cette valeur est élevée, plus la fréquence de mise à jour du panneau est élevée et plus les ressources CP sont utilisées. Si votre processeur n’est pas très puissant et qu’il ne peut pas faire face à la fréquence de mise à jour de 200 millisecondes (valeur par défaut), vous pouvez l’augmenter jusqu’à 500 ou même jusqu’à 1000 millisecondes en éditant la balise.

Dans ce cas, la charge CP diminuera considérablement. Les valeurs inférieures à 100 millisecondes ne sont pas recommandées. En augmentant la fréquence de mise à jour, la charge CP augmentera de manière non linéaire. Il est important de comprendre que la fréquence de mise à jour définit la discrétion du terminal. Certaines de ses actions sont définies par cette minuterie et se produisent à une certaine vitesse.


2.11. Fonctionnalités planifiées mais non mises en œuvre

HedgeTerminal a une architecture flexible et non triviale grâce à laquelle de nouvelles capacités non triviales de ce programme deviennent réalisables. Aujourd’hui, ces capacités n’ont pas été mises en œuvre, bien qu’elles puissent apparaître à l’avenir en cas de demande. Voici les principaux :

Utilisation de schémas et skins de couleurs. HedgeTerminal utilise son propre moteur graphique. Ceci est basé sur les éléments primitifs du graphique comme une étiquette rectangulaire ou un texte habituel. Les graphiques basés sur des images ne sont pas utilisés du tout. Cela donne la possibilité de changer la couleur, la taille et la police de tous les éléments affichés dans HedgeTerminal. De cette façon, il est facile de créer une description des polices et du schéma de couleurs sous forme de skin et de le charger au lancement de HedgeTerminal, en changeant son apparence.

Connexion de modules personnalisés Trailing Stop. Chaque Expert, et HedgeTerminal est essentiellement un Expert, peut initier un calcul d’un indicateur arbitraire via une interface de programme spécifique (fonction iCustom()). Il permet d’appeler le calcul de l’indicateur, qui dépend de l’ensemble des paramètres arbitraires. Trailing Stop est un algorithme qui place un nouveau ou conserve l’ancien niveau de prix en fonction du prix actuel. Cet algorithme et ses niveaux de prix peuvent être implémentés comme indicateur. Si les paramètres passés sont convenus, HedgeTerminal peut appeler un tel indicateur et calculer le niveau de prix requis. HedgeTerminal peut s’occuper de la mécanique de transfert du Trailing Stop. De cette façon, tout utilisateur de HedgeTerminal peut écrire son propre module (même le plus inhabituel) de gestion de Trailing Stop.

Ajout de nouvelles colonnes pour la table des positions. Cela inclut les colonnes personnalisées. Les tables HedgeTerminal sont conçues de manière à permettre l’ajout de nouvelles colonnes. La prise en charge de nouvelles colonnes peut être programmée dans HedgeTerminal et implémentée de manière familière via l’interface iCustom() . Chaque cellule de la ligne d’une position représente un paramètre (par exemple, le prix d’ouverture ou le niveau Take Profit). Ce paramètre peut être calculé par un indicateur et cela signifie qu’un nombre illimité d’indicateurs peuvent être écrits afin que chacun d’eux calcule un paramètre pour une position. Si les paramètres de transmission sont coordonnés pour ces indicateurs, il deviendra possible d’ajouter un nombre illimité de colonnes personnalisées à une table dans HedgeTerminal.

Connexion de modules d’extension. D’autres algorithmes de calcul peuvent être calculés via le mécanisme de l’appel d’indicateur personnalisé. Par exemple, le système de rapport comprend de nombreux paramètres de calcul tels que le gain attendu et le ratio de Sharpe. Beaucoup de ces paramètres peuvent être reçus en déplaçant leur bloc de calcul vers l’indicateur personnalisé.

Copier des transactions, recevoir et transmettre des transactions à partir d’autres comptes. HedgeTerminal est essentiellement un gestionnaire de position. Cela peut facilement être une base pour un copieur de transaction car les fonctionnalités principales ont déjà été implémentées. Un tel copieur aura des capacités non triviales pour copier des positions MetaTrader 4 bidirectionnelles sur le terminal MetaTrader 5. Le copieur affichera ces positions en tant que positions bidirectionnelles comme dans MetaTrader 4 avec la possibilité de gérer chaque position individuellement.

Rapports et statistiques. Le graphique des actions et l’onglet « Résumé ». Le comptage des positions bidirectionnelles permet d’analyser la contribution au résultat de chaque stratégie ou trader. Parallèlement aux statistiques, une analyse de portefeuille peut être effectuée. Ce rapport peut notamment différer du rapport dans MetaTrader 5 et s’y ajouter. Dans le rapport de l’onglet Résumé, en plus des paramètres généralement acceptés tels que le gain attendu, le prélèvement maximal, le facteur de profit, etc., d’autres paramètres seront également inclus. Les noms et les valeurs de ces derniers peuvent être obtenus à partir des modules d’extension personnalisés. Au lieu du graphique de solde familier sur une image, le graphique d’équité sous la forme d’un graphique d’échange en chandelier personnalisé peut être utilisé.

Tri des colonnes. Habituellement, lorsque vous appuyez sur l’en-tête de la table, les lignes sont triées dans l’ordre croissant ou décroissant (deuxième pression). La version actuelle de HedgeTerminal ne prend pas en charge cette option car le tri est connecté au filtre de transaction et à l’ensemble personnalisé de colonnes, qui ne sont pas disponibles pour le moment. Les versions ultérieures comporteront cette option.

Envoi d’un rapport de trade par e-mail, ftp. Notifications Push. HedgeTerminal peut utiliser les fonctions du système pour envoyer des e-mails, des fichiers ftp et même des notifications push. Par exemple, il peut former un rapport html une fois par jour et l’envoyer à la liste des utilisateurs. Étant donné que HedgeTerminal est un gestionnaire d’Expert Advisors et qu’il connaît toutes les actions de trading d’autres EA, il peut informer les utilisateurs des actions de trading d’autres Expert Advisors. Par exemple, si l’un des EA ouvre une nouvelle position, HedgeTerminal peut envoyer une notification push informant les utilisateurs qu’un certain expert a entré une nouvelle position. HedgeTerminal précisera également la direction de l’entrée, sa date, son heure et son volume. L’EA lui-même n’aura pas besoin d’être configuré, il suffira d’ajouter son nom dans le fichier d’alias.

Filtrage des positions avec la console d’expressions régulières. C’est le plus puissant des développements prévus. Cela portera le travail de HedgeTerminal à un tout autre niveau. Les expressions régulières peuvent être utilisées pour filtrer les positions historiques et actives afin que seules celles répondant aux exigences de ce filtre soient affichées. Les expressions régulières peuvent être combinées et saisies dans une console dédiée au-dessus de la table des positions actives et historiques. Voici à quoi pourrait ressembler cette console dans les futures versions de HedgeTerminal :

Fig. 37. Demander une console dans la future version de HedgeTerminal

Fig. 37. Demander une console dans la future version de HedgeTerminal

Les expressions régulières peuvent former des conditions très flexibles pour filtrer les positions suivies d’un calcul statistique sur elles. Par exemple, pour afficher les positions historiques uniquement par le symbole AUDCAD, il suffit d’entrer le symbole « AUDCAD » dans la cellule « Symbole ». Les conditions peuvent être combinées. Par exemple, les positions AUDCAD exécutées par un robot particulier peuvent être affichées pour la période du 01.09.2014 au 01.10.2014. Tout ce que vous avez à faire pour cela est d’entrer des conditions dans les cellules correspondantes. Une fois que le filtre affiche les résultats, le rapport de l’onglet « Résumé » changera en fonction des nouvelles conditions de filtre.

Les expressions régulières seront constituées d’un petit nombre d’opérateurs simples. Cependant, utilisées ensemble, elles permettront de créer des filtres très flexibles.

La présence des opérateurs ci-dessous est nécessaire et suffisante dans la console :

    Opérateur= - Égalité stricte. Si le mot AUDСAD est entré dans le champ « Symbole », tous les symboles contenant cette sous-chaîne, par exemple AUDCAD_m1 ou AUDCAD_1, seront trouvés. Cela signifie qu’un opérateur d’insertion implicite sera utilisé. L’égalité stricte « = » nécessite une correspondance complète de l’expression et donc tous les symboles sauf AUDCAD seront exclus. AUDCAD_m1 ou EURUSD seront exclus.

    Opérateur > - Affiche uniquement les valeurs supérieures à celle spécifiée.

    Opérateur < - Affiche uniquement les valeurs inférieures à celle spécifiée.

    Opérateur! - Négation logique. Reflète uniquement les valeurs qui ne sont pas égales à celle spécifiée.

    Opérateur | - Logique « OU ». Permet de spécifier deux conditions ou plus dans une ligne en même temps. Dans le même temps, pour répondre au critère, il suffit de remplir au moins une stipulation. Par exemple, l’expression «> 10106825|=10106833 » entré dans la cellule « Ordre d’entrée » de la console d’expression affichera toutes les positions dont l’identificateur d’ordre entrant est supérieur à 10106825 ou égal à 10106833. 

    Opérateuret - Logique « ET ». Permet de spécifier deux ou plusieurs conditions dans une ligne en même temps et chacune d’entre elles doit être remplie. L’expression «>10106825et<10105939» saisie dans la cellule « Ordre d’entrée » affiche toutes les positions dont l’identificateur entrant est supérieur à 10106825 ou inférieur à 10105939. Les positions avec des identifiants entre ces deux numéros, par exemple 10106320, seront filtrées.

Correction et gestion des positions à l’aide d’ordres spéciaux. Des symboles supplémentaires peuvent être saisis dans les cellules reflétant le volume ou les niveaux StopLoss et TakeProfit. Cela rend possible une gestion de position plus complexe. Par exemple, pour fermer la moitié du volume de position actuel, entrez la valeur « 50 % » correspondant à la position active dans le champ « Volume ».

Au lieu d’exécuter les niveaux StopLoss et TakeProfit, une valeur, par exemple « 1% », peut être entrée dans ces cellules. HedgeTerminal calculera automatiquement le niveau StopLoss et TakeProfit afin qu’ils soient placés à une distance de 1 % du prix d’entrée. Les nombres avec le postfixe « p » peuvent être saisis dans ces cellules. Par exemple, « 200p » signifiera l’ordre :« placez les niveaux StopLoss et TakeProfit à 200 points du prix d’entrée de position». À l’avenir, si un moins est placé avant le volume dans la colonne « Volume », le volume se fermera par la valeur spécifiée après ce signe. Par exemple, si vous avez une position avec le volume 1.0 et que nous voulons fermer une partie du volume (par exemple 0.3), il suffit d’entrer « -0.3 » dans la cellule de volume.


Chapitre 3. Sous le capot de HedgeTerminal. Spécification et principe d’exploitation

3.1. Contours globaux et locaux. Contexte, transfert et stockage des informations

L’apparence de HedgeTerminal et le processus de trading ressemblent au familier MetaTrader 4. Cela est possible grâce à la virtualisation et à la transformation de l’affichage des données, lorsque les informations de trading disponibles via MetaTrader 5 sont affichées par le panneau d’une manière plus pratique. Ce chapitre décrit les mécanismes qui permettent de créer une telle virtualisation et les mécanismes de traitement des données de groupe.

Comme vous le savez, HedgeTerminal est représenté dans plusieurs produits différents. Les principaux d’entre eux sont le panneau visuel et la bibliothèque avec interface de programme. Cette dernière permet de mettre en œuvre la gestion des positions bidirectionnelles dans n’importe quel Expert Advisor externe et elle l’intègre également dans le panneau visuel HedgeTerminal. Par exemple, une position active d’un EA peut être fermée directement à partir du panneau. L’Expert Advisor obtiendra l’information et la traitera en conséquence.

Apparemment, une telle structure nécessite une interaction de groupe entre les Expert Advisors. Le panneau, qui est essentiellement un Expert Advisor, doit connaître toutes les actions de trading qui ont lieu. Inversement, chaque Expert Advisor utilisant la bibliothèque HedgeTerminal doit connaître les actions de trading exécutées manuellement (par des programmes tiers ou à l’aide du panneau HedgeTerminal).

En général, les informations sur les actions de trading peuvent être reçues de l’environnement de trading. Par exemple, lorsque l’utilisateur ouvre une nouvelle position, le nombre d’ordres change. Le dernier ordre peut dire pour quel symbole la position a été ouverte et quel volume elle avait. Les informations sur les ordres et les offres sont stockées sur le serveur. C’est pourquoi elles sont disponibles pour tout terminal connecté au compte de trading. Ces informations peuvent être qualifiées de globales car elles sont disponibles pour tout le monde et sont distribuées via le canal de communication global. La communication avec le serveur de trading a le format « Demande - réponse ».

Par conséquent, une telle communication peut être présentée comme un contour global. « Contour » est un concept de la théorie des graphiques. En termes simples, un contour est une ligne fermée avec quelques nœuds interagissant les uns avec les autres. Cette définition n’est peut-être pas suffisante mais nous laisserons la précision aux mathématiciens. L’important pour nous est de présenter le processus de trading comme une séquence fermée d’actions.

Toutes les informations requises ne peuvent pas être transmises à travers le contour global. Une partie des informations ne peut pas être transmise car MetaTrader 5 ne prend pas en charge une telle transmission ; en plus, ces informations n’existent pas explicitement. La séquence des actions de trading est :

  1. Un trader passe un ordre d’achat.
  2. L’ordre est exécuté dans un certain temps.
  3. L’environnement de trading change. L’ordre exécuté entre dans la liste des ordres historiques. La position agrégée du symbole change.
  4. Le trader ou un Expert Advisor détecte le changement dans l’environnement de trading et prend la décision suivante.

Un certain temps s’écoule entre la première et la quatrième action. Cela peut être important. Si un seul trader trade sur le compte, il sait quelles actions sont entreprises et attend la réponse appropriée du serveur. S’il y a quelques traders ou Expert Advisors qui tradent sur le compte en même temps, il peut y avoir des erreurs de gestion.

Par exemple, le deuxième trader peut passer un ordre pour fermer une position existante entre la première et la quatrième étape. Voyez-vous un problème potentiel ? Le deuxième ordre est placé lorsque le premier est en cours d’exécution. En d’autres termes, un ordre de fermeture d’une position sera envoyé deux fois.

Cet exemple semble tiré par les cheveux et peu probable si le trader trade sur le compte seul et manuellement et utilise des méthodes synchrones pour passer des ordres. Lorsqu’il y a plusieurs robots qui tradent sur le compte et exécutent des opérations de trading indépendantes, il existe une forte probabilité de telles erreurs.

Comme HedgeTerminal est un gestionnaire de poste, travaillant en mode asynchrone et assurant le travail parallèle simultané d’un certain nombre d’experts, il peut être très proche de ces erreurs. Pour éviter cela, HedgeTerminal synchronise les actions entre toutes ses copies lancées (qu’il s’agisse de la bibliothèque HedgeTerminalAPI ou du panneau visuel) via le mécanisme du contour local implémenté en tant que lecture et modification multithread du fichier ActivePositions.xml. L’interaction avec le fichier ActivePositions.xml est au cœur du contour local, la partie la plus importante de HedgeTerminal. Ce mécanisme est décrit ci-dessous.

De manière simpliste, le travail de HedgeTerminal se résume à la coopération avec un contour local et global comme sur la figure ci-dessous:

Fig. 38. Un schéma simplifié d’échange d’informations entre le contour global et local

Fig. 38. Un schéma simplifié d’échange d’informations entre le contour global et local

Toute action de trading (l’étiquette démarrer sur le diagramme) dans HedgeTerminal commence par l’écriture d’une balise spéciale dans ActivePositions.xml, qui bloque d’autres changements de position en cours de modification.

Une fois que le bloc de position a été défini et que le contour local a été passé avec succès, HedgeTerminal envoie un ordre de trading au serveur. Par exemple, un contre-ordre pour fermer la position. Dans un certain temps, l’ordre est exécuté et l’environnement de trading est modifié. HedgeTerminal traite cette modification et détecte que le contour global est passé avec succès et que l’ordre est exécuté. Il débloque la position et revient à l’état initial (étiquette fin sur le diagramme).

Il peut y avoir une situation où un ordre ne peut pas être exécuté. Dans ce cas, HedgeTerminal débloque également la position et enregistre la raison de l’échec dans le journal du terminal MetaTrader 5.

En réalité, le modèle de communication de l’information est plus complexe. Comme nous l’avons déjà mentionné, dans un terminal MetaTrader 5, plusieurs copies HedgeTerminal peuvent être en cours d’exécution. Il peut s’agir de la bibliothèque ou du panneau visuel. Chaque copie peut agir comme un auditeuret un rédacteur. Lorsque HedgeTerminal effectue une action de trading, il s’agit d’un rédacteur car il bloque la position des modifications à l’aide des enregistrements de la balise xml désignée. Toutes les autres copies de HedgeTerminal sont des auditeurs car elles lisent le fichier ActivePositions.xml avec une certaine périodicité et bloquent une position pour les modifications ayant rencontré la balise de blocage.

Ce mécanisme assure la diffusion des informations entre des threads indépendants. Il facilite le travail parallèle entre plusieurs panneaux et Experts à l’aide de la bibliothèque HedgeTerminalAPI.

Un diagramme réaliste, montrant le travail de HedgeTerminal dans les conditions de la coopération multi-thread :

Fig. 39. Modèle quasi naturel de l’échange d’informations entre les copies de HedgeTerminal

Fig. 39. Modèle quasi naturel de l’échange d’informations entre les copies de HedgeTerminal

L’efficacité d’une telle organisation des données est très élevée. Les opérations de lecture et d’écriture du fichier ActivePositions.xml prennent normalement moins d’une milliseconde, tandis que la transmission du contour global avec l’envoi et l’exécution de l’ordre peut prendre jusqu’à 150 à 200 millisecondes. Pour voir la différence entre l’échelle de ces valeurs, jetez un coup d’œil au diagramme.

La largeur du rectangle vert indique le temps de transmission du contour local et la largeur du contour bleu est le moment de l’exécution de l’ordre du trading :

Fig. 40. Échelle de temps pour effectuer un enregistrement dans le fichier et le temps requis pour l’exécution de l’ordre

Fig. 40. Échelle de temps pour effectuer un enregistrement dans le fichier et le temps requis pour l’exécution de l’ordre

Comme vous pouvez le voir, le rectangle vert ressemble plus à une ligne verticale. En réalité, la différence entre les échelles est encore plus grande.

Des opérations rapides de lecture et d’enregistrement peuvent faciliter un échange de données complexe entre Experts et la création de systèmes de trading à haute fréquence distribués.


3.2. Stockage des informations globales et locales

Classiquement, toutes les informations de trading utilisées par HedgeTerminal peuvent être divisées en deux parties :

  • Informations locales. Celles-ci sont stockées dans les fichiers de l’ordinateur et transmises exclusivement à travers le contour local ;
  • Informations globales. Ces informations sont stockées sur le serveur de trading. Elles sont transmises à travers le contour global et sont disponibles à partir de n’importe quel terminal connecté au compte.

Les ordres, les transactions et les informations sur le compte appartiennent aux informations globales. Ces informations sont disponibles via des fonctions spécifiques de MetaTrader 5, comme HistoryOrderGetInteger() ou AccountInfoInteger(). HedgeTerminal utilise principalement ces informations. Pour cette raison, HedgeTerminal affiche les données suivantes :

  • Positions actives et historiques de HedgeTerminal ;
  • StopLoss des ordres actives et historiques ;
  • Niveaux de positions historiques déclenchés par TakeProfit ;
  • Commentaires entrants d’un poste actif, commentaires entrants et sortants de postes historiques ;
  • Toutes les autres propriétés des postes actifs et historiques ne sont pas incluses dans la liste des informations locales.

Comme toutes ces propriétés sont globales, leur affichage est unique pour toutes les copies de HedgeTerminal, exécutées sur différents ordinateurs. Par exemple, si une position bidirectionnelle est fermée dans l’un des terminaux, cette position sera fermée dans l’autre HedgeTerminal même si elle est lancée sur un autre ordinateur.

En plus des données globales, HedgeTerminal utilise des informations locales dans son travail. Les informations locales ne sont disponibles que sur un seul ordinateur. Ces informations constituent la base des propriétés suivantes :

  • Niveaux TakeProfit de positions actives ;
  • Niveaux TakeProfit de positions historiques qui ne se sont pas déclenchées ;
  • Commentaire sortant d’un poste actif ;
  • Indicateur de service, bloquant un changement de position bidirectionnelle.

Les niveaux Take profit qui ne se sont pas déclenchés sont stockés dans le fichier HistoryPositions.xml. Le reste des informations locales est stocké dans le fichier ActivePositions.xml.

Le stockage local des données signifie que si vous placez un TakeProfit, il ne sera visible que dans les copies HedgeTerminal exécutées sur votre ordinateur. Personne d’autre que vous ne connaîtra ce niveau.


3.3. Niveaux du Stop Loss et du Take Profit Problèmes liés au système des ordres et les ordres OCO (One-Cancels-the-Other)

Dans MetaTrader 5 ainsi que dans MetaTrader 4, il existe un concept de niveaux de StopLoss et de TakeProfit. Ce sont des arrêts de protection. Semblable à MetaTrader 4, ils ferment une position dans le cas où elle atteint le niveau certain de perte (StopLoss) ou de profit (TakeProfit). Dans MetaTrader 4, cependant, de tels arrêts sont actifs pour chaque ordre ouvert individuellement. Dans MetaTrader 5, ces arrêts fonctionnent pour l’ensemble de la position nette agrégée.

Le problème ici est qu’une position nette n’est pas liée aux positions bidirectionnelles des experts et en particulier de HedgeTerminal. Cela signifie que les niveaux réguliers de StopLoss et de TakeProfit ne peuvent pas être utilisés pour des positions bidirectionnelles, cependant, ces niveaux peuvent être présentés comme des ordres en attente distincts. Si vous avez une position longue ouverte, deux ordres en attente émuleront le travail de TakeProfit et StopLoss respectivement. L’un d’eux est SellLimit placé au-dessus du prix d’ouverture de cette position et un autre est SellStop placé en dessous de ce prix.

En fait, si le prix après ouverture atteint SellLimit de l’ordre, cet ordre fermera la position avec profit et si le prix atteint l’ordre SellStop, il fermera la position avec une perte. Le seul inconvénient est qu’après un déclenchement d’ordre, le deuxième ordre ne cessera pas d’exister et si le prix change alors de direction, le deuxième ordre peut se déclencher après le premier.

Comme il n’y a pas de position à ce stade, le déclenchement du deuxième ordre ouvrira une nouvelle position nette au lieu de fermer la précédente.

La figure ci-dessous illustre ce problème sur l’exemple d’utilisation d’arrêts de protection en position longue :

Fig. 41.  Émulation de StopLoss et TakeProfit à l’aide des ordres SellStop et SellLimit

Fig. 41. Émulation de StopLoss et TakeProfit à l’aide des ordres SellStop et SellLimit

Pour éviter une telle incohérence, dans le trading d’échange, les ordres OCO One Cancels the Other» ) sont utilisés.

Ce sont deux ordres en attente connectés l’un à l’autre, de sorte que le déclenchement d’un ordre annule l’autre. Dans notre exemple, après qu’un ordre ait été déclenché, le deuxième ordre est annulé par le serveur de trading et donc de nouvelles positions ne seront pas ouvertes et c’est exactement ce que nous recherchons. Le travail de ce type d’ordres est présenté sur le schéma ci-dessous :

Fig. 42. Ordres OCO en tant que StopLoss et TakeProfit

Fig. 42. Ordres OCO en tant que StopLoss et TakeProfit

MetaTrader 5 ne prend pas en charge les ordres OCO. Comme un ensemble de trois ordres ne peut pas être utilisé, les ordres agissant simultanément comme StopLoss et TakeProfit ne conviennent pas. Une paire de deux ordres peut être utilisée ! Donc, il peut s’agir de StopLoss ou de TakeProfit. 

En fait, si un ordre en attente, lié à l’ordre exécuté initialisant une nouvelle position bidirectionnelle, a été passé (par exemple StopLoss), une telle construction est sûre. Il n’y aura pas de deuxième ordre en attente et il ne pourra pas ouvrir une nouvelle position bidirectionnelle. En fait, il n’y aura que trois scénarios :

  • Un ordre en attente sera annulé pour une raison quelconque par un broker ou un utilisateur ;
  • Un ordre en attente se déclenchera ;
  • Un ordre en attente ne se déclenchera pas.

Il n’y a pas d’autres scénarios. Si un ordre en attente est annulée, cela équivaudra à l’annulation du StopLoss ou du TakeProfit. Si un ordre en attente se déclenche, il fermera la position. Si l’ordre ne se déclenche pas, une position bidirectionnelle restera active avec un StopLoss placé.

Même si HedgeTerminal est désactivé lorsque l’ordre en attente se déclenche, puis plus tard, lorsqu’il se lance, il sera en mesure de traiter son déclenchement et de comprendre que la position a été fermée par cet ordre. Il est possible de déterminer si la position a été fermée par StopLoss ou TakeProfit si le champ avec le numéro magique contient des informations de service spéciales indiquant si l’ordre de fermeture est un ordre régulier, TakeProfit ou StopLoss. La façon dont le lien et les informations de service sont stockés dans le champ avec le nombre magique est expliquée en détail dans la section suivante.

Étant donné que deux véritables arrêts de protection ne peuvent pas être utilisées en même temps, un compromis a été fait lors de la conception de HedgeTerminal:

Les positions bidirectionnelles dans HedgeTerminal sont protégées par les ordres réels de BuyStop et SellStop jouant un rôle de StopLoss. Les niveaux de TakeProfit sont virtuels et pris en charge au niveau des copies HedgeTerminal exécutées sur un ordinateur et indisponibles au niveau global.

Les niveaux StopLoss sont choisis, car ce sont ceux qui doivent avoir un haut niveau de fiabilité de déclenchement. Si le TakeProfit ne fonctionne pas, ce ne sera pas catastrophique et le compte ne sera pas fermé par appel de marge, alors que le StopLoss qui ne s’est pas déclenché peut conduire à la faillite du compte.

Néanmoins, il existe une opportunité algorithmique de choisir une façon de suivre une position. Vous pouvez choisir entre un vrai StopLoss et un TakeProfit virtuel ou un StopLoss virtuel et un vrai TakeProfit. Les niveaux StopLoss et TakeProfit peuvent également être virtuels. Pour le moment, cette fonctionnalité n’a pas été implémentée, mais si elle est demandée, elle peut apparaître.

La virtualisation du niveau TakeProfit réduit sa fiabilité générale, mais pas de manière significative. Les niveaux TakeProfit sont distribués localement et sont disponibles pour chaque copie de HedgeTerminal. Il suffit d’avoir au moins une copie en cours d’exécution de HedgeTerminal en tant qu’Expert Advisor qui utilise la bibliothèque ou le panneau HedgeTerminal, pour que le TakeProfit soit exécuté. Lorsque plusieurs copies de HedgeTerminal sont en cours d’exécution, une seule d’entre elles exécutera le TakeProfit. Ce sera la première à mettre une balise de blocage sur la position bidirectionnelle. En ce sens, les instances de HedgeTerminal sont en concurrence les unes avec les autres dans le mode multi-thread d’écriture et de lecture des données.

Pour un utilisateur, le trading manuel via le panneau HedgeTerminal ou l’utilisation de la bibliothèque de virtualisation dans les EA, le travail avec TakeProfit ne diffère pas du travail avec StopLoss. Toutes les différences factuelles entre ces niveaux sont cachées dans la scène de HedgeTerminal. Il suffit au trader d’entrer « TakeProfit » et « StopLoss ». Ces niveaux seront présents simultanément et auront la même indication de couleur mettant en garde contre le déclenchement de l’un des niveaux.


3.4. Les ordres OCO peuvent-ils résoudre les problèmes liés à la protection des positions bidirectionnelles ?

Les ordres OCO permettent d’utiliser simultanément les niveaux réels de StopLoss et TakeProfit. Sont-ils vraiment si polyvalents dans l’organisation du trade bidirectionnel ? Voici leurs caractéristiques. Nous savons déjà que les ordres OCO permettent d’annuler un ordre lorsque l’autre se déclenche.

Il semble que cela protégera notre position bidirectionnelle des deux côtés, car dans ce cas, le stop-loss et le take-profit peuvent être des ordres réels ne nécessitant pas que HedgeTerminal soit exécuté sur l’ordinateur. Le fait est que dans l’exécution de l’ordre d’échange, il est nécessaire de prendre en compte l’exécution partielle de l’ordre. Cette propriété peut détruire la logique du métier de l’application. Prenons un exemple simple :

  1. Une position longue avec un volume de 10 contrats s’ouvre. Deux ordres OCO liées mettant en œuvre les niveaux StopLoss et TakeProfit sont exécutées ;
  2. L’ordre SellLimit est partiellement exécuté lorsque le niveau TakeProfit est atteint. 7 contrats sur 10 ont été conclus par elle et les 3 autres sont restés ouverts en tant que position longue ;
  3. L’ordre SellStop, mettant en œuvre le niveau StopLoss, sera annulé car l’ordre SellLimit qui y est lié a été exécuté, mais seulement partiellement.
  4. La position dans trois contrats n’a plus d’arrêt de protection.

Ce scénario est présenté sur la figure ci-dessous :

Fig. 43. Exécution partielle des arrêts de protection

Fig. 43. Exécution partielle des arrêts de protection

Il peut y avoir une objection à ce que les ordres OCO puissent être conçus de manière à tenir compte d’une exécution partielle et que cela permette d’éviter un tel dégagement des arrêts de protection. Les volumes de deux ordres OCO peuvent être interconnectés. Dans ce cas, une exécution partielle sera certainement prévue. Cependant, cela compliquera les logiques suffisamment complexes du système d’ordre utilisé dans le trading net.

Le principal problème ici est que les ordres OCO ne peuvent pas offrir les mêmes opportunités que MetaTrader 4, même en tenant compte de l’exécution partielle. Par exemple, passer un ordre en attente avec les niveaux TakeProfit et StopLoss sera difficile. La raison en est que deux ordres interconnectés ne peuvent pas prendre en compte le déclenchement de l’ordre d’initiation.

Pour écrire un algorithme vraiment polyvalent permettant de gérer des positions similaires à MetaTrader 4, les ordres OCO doivent avoir les caractéristiques suivantes :

  1. Chaque ordre lié doit ajuster son volume en fonction du degré d’exécution de l’ordre qui lui est lié. Par exemple, si TakeProfit a exécuté 7 contacts sur 10, le StopLoss qui lui est lié doit changer son volume de 10 à 3 (10 - 7 = 3) ;
  2. Chacun des ordres liés doit prendre en compte le volume de l’exécution de l’ordre d’initialisation. Dans le cas où un trader passe un ordre en attente du type BuyLimit et le protège avec StopLoss et TakeProfit sous forme d’ordres, cela ne signifie pas nécessairement que BuyLimit est garanti d’exécuter l’ensemble du volume. Ces cas doivent également être pris en charge par les ordres appariés.
  3. En plus de la condition d’annulation, un ordre appairé doit avoir une condition supplémentaire pour le déclenchement. Il ne peut se déclencher que lorsqu’un ordre supplémentaire lié à celui-ci se déclenche. Cela signifie qu’un ordre OCO doit avoir des liens vers deux ordres. Le premier lien est vers l’ordre dans lequel le déclenchement activera l’ordre en cours. Le deuxième lien est l’ordre dans lequel le déclenchement annulera l’ordre en cours. Un tel mécanisme permettra de créer une position avec un ordre d’initialisation en attente ;

De tels mécanismes, même s’ils apparaissent, seront très complexes pour un utilisateur ayant une expérience limitée. Leur adéquation est douteuse. La virtualisation côté client, comme celle actuellement utilisée dans HedgeTerminal, est plus facile à utiliser.

Comme alternative aux ordres OCO, MetaQuotes pourrait envisager la possibilité d’introduire des niveaux algorithmiques spécifiques TakeProfit et StopLoss assurant la protection d’un certain ordre de trading. Certes, ce n’est qu’une théorie bien qu’elle ait un noyau rationnel. De tels niveaux algorithmiques peuvent masquer la majeure partie de l’implémentation et de la configuration côté serveur de trading offrant aux utilisateurs finaux un mécanisme de protection simple prêt à l’emploi.

En résumé, notre petit discours sur les perspectives d’intégration des ordres OCO dans la plateforme MetaTrader 5 :

Les ordres OCO ne sont pas efficaces lorsque les ordres sont exécutés partiellement ; ils ne sont pas assez fiables et trop complexes pour un utilisateur régulier de la plate-forme. 


3.5. Stockage des liens vers l’initialisation des ordres

Cette section examine une description détaillée du stockage interne des liens vers d’autres ordres et le mécanisme de liaison entre eux. Comme mentionné précédemment, le champ « Order Magic » contient l’identifiant de l’Expert Advisor qui a passé un ordre. Cela signifie que n’importe quel trader peut entrer n’importe quelle valeur entière dans ce champ en utilisant le langage de programmation MQL5. Dans de tels cas, une collision est possible, lorsque l’ordre initialisant une nouvelle position contiendra l’identifiant d’un Expert Advisor correspondant à l’identifiant d’un ordre existant. Dans ce cas, un lien erroné vers l’ordre apparaîtra.

Si un trader utilise un identifiant pour les EA proche de zéros, comme « 1 »,, « 7 » ou « 100 »,, et que les numéros d’ordre sont significativement plus grands que ces nombres, comme « 10002384732 »,, ces collisions peuvent être évitées. Il serait plutôt naïf de croire que les traders garderont cela à l’esprit. C’est pourquoi HedgeTerminal stocke les liens vers les ordres d’une manière spéciale, de sorte que la probabilité de collisions est très faible et que ses algorithmes ne permettent pas l’ambiguïté et éliminent automatiquement les collisions si elles apparaissent.

Le champ « Order Magic » stockant le lien prend 64 bits. En raison de sa largeur, ce champ peut prendre un très long nombre. En réalité, la plage de travail des identificateurs d’ordre est beaucoup plus petite. Cela permet à Hedge Terminal d’utiliser les chiffres les plus élevés de ce champ pour ses besoins en toute sécurité, formant un lien vers l’ordre d’une manière spéciale. Référons-nous au schéma montrant comment HedgeTerminal stocke un lien vers l’ordre d’initiation :

Fig. 44. Modèle de stockage d’un lien vers l’ordre d’initialisation dans HedgeTerminal

Fig. 44. Modèle de stockage d’un lien vers l’ordre d’initialisation dans HedgeTerminal

Le chiffre supérieur du champ (63) est toujours marqué comme 1. Cela permet une itération très rapide sur toutes les ordres. Évidemment, si le chiffre suivant n’est pas égal à 1, l’ordre ne peut pas contenir de lien vers un autre ordre et il peut être ignoré. En outre, l’attribution de la valeur de 1 au chiffre le plus élevé rend le nombre magique très grand et cela augmente la distance entre la plage de travail des identificateurs d’ordre et la plage de travail des liens dans HedgeTerminal, ce qui minimise la probabilité d’une collision.

HedgeTerminal peut remplir les trois bits suivants avec des informations de service. Contrairement à l’identificateur d’ordre, HedgeTerminal stocke les identificateurs d’ordre dans ce champ à l’envers. Au début, il remplit les chiffres les plus élevés, puis les plus petits, qui sont pointés par une flèche bleue direction IS (informations de service) à la Fig. 44. Ce mode de stockage permet aux plages d’informations de service et d’identificateurs d’ordre de se rencontrer à mi-chemin. Si la nécessité se fait sentir, leur composition peut être modifiée. La taille des informations de service peut être augmentée grâce aux chiffres de stockage de l’identificateur d’ordre. Ces informations permettent d’identifier le type de l’ordre de fermeture.

Le fait est que les ordres actifs dans MetaTrader 4 peuvent être fermés par TakeProfit ou StopLoss. Ce sont certains niveaux de prix auxquels les ordres sont fermés avec un profit ou une perte fixe. Dans MetaTrader 5, TakeProfit et StopLoss ne peuvent être appliqués qu’aux positions nettes et ne conviennent pas aux ordres appariés. Seuls les ordres ordinaires en attente peuvent jouer un rôle de takeprofit et de stoploss.

Dans HedgeTerminal, ces ordres se voient attribuer des identifiants spéciaux spécifiant s’il s’agit d’un ordre TakeProfit ou StopLoss. Comme le nombre magique est stocké sur le serveur de trading, les informations de service deviennent disponibles pour tous les traders qui ont accès au compte de trading. De cette façon, même plusieurs copies HedgeTerminal exécutées sur différents ordinateurs auront les informations sur le type des ordres déclenchés et afficheront correctement les informations sur les positions fermées.

Les informations référencées sur l’identificateur d’ordre sont stockées dans la plage de 0 à 59 chiffres. Celles-ci sont stockées dans la direction standard, en utilisant des chiffres de droite à gauche, qui sont indiqués par un identifiant d’ordre de directionavec une flèche bleue. Pour évaluer la taille de stockage allouée, calculons le montant requis pour stocker la gamme de tous les ordres envoyés à la Bourse de Moscou au cours d’une année.

Le rapport de mon broker daté du 13.06.2013 contient un ordre avec l’identifiant 10 789 965 471. Ce nombre utilise 33,3297  bits (log2(10 789 965 471)) ou 34  chiffres sur 64. L’identifiant de l’un des ordres exécutés avant le 25.09.2014 est 13 400 775 716. Ce nombre utilise 33,6416 bits. Bien que 2,6 milliards d’ordres aient été exécutés en un an et quatre mois, la taille de l’identifiant n’a augmenté que de 0,31263 bit, ce qui est inférieur à un seul ordre. Je ne prétends pas que le Soleil s’éteindra avant que la taille de l’identificateur d’ordre n’arrive au 59e chiffre, mais je suis assez confiant que cela ne se produira pas plus tôt que dans quelques millions d’années.

HedgeTerminal ne stocke pas un lien ouvertement. Pour cela, il crypte le champ OrderMagic, laissant le chiffre supérieur intact. Le code de HedgeTerminal est basé sur le réarrangement réversible des chiffres implémenté par la fonction de cryptage spéciale travaillant sur la clé de longueur variable. Après un tel cryptage, les informations de service et l’identifiant d’ordre sont mélangés les uns aux autres et cachés sous un masque spécial de manière à ce qu’à la sortie, ils représentent une distribution égale des uns et des zéros. Le cryptage a lieu pour deux raisons. Tout d’abord, le réarrangement des chiffres diminue la probabilité de chevauchement des liens et des identificateurs d’ordre, puis protège les algorithmes internes de HedgeTerminal de l’impact externe délibéré ou aléatoire.

Cette procédure est absolument sûre, réversible et n’est pas sujette aux collisions. Cela garantit que, quelles que soient les actions qu’un trader effectue à l’aide des Expert Advisors, elles n’affectent pas la fiabilité des algorithmes internes de HedgeTerminal. Ceci est très important car dans une situation réelle, la gestion de ces liens est impossible sans algorithmes dédiés complexes.

Dans le même temps, si nous nous limitons à ne contrôler que les liens, l’échec de la logique du métier est inévitable. Les sections suivantes expliqueront les raisons puisqu’elles sont dédiées à la description détaillée de ces algorithmes. Le cryptage est également utilisé pour éviter cet échec. Le revers de la médaille de cette restriction est qu’il n’y a pas d’autre moyen de gérer les positions HedgeTerminal que d’utiliser cela.


3.6. Limites au travail avec HedgeTerminal

La particularité de la structure du stockage de liens incite HedgeTerminal à stocker des liens vers les ordres de manière uniforme en utilisant des nombres allant de 9223372036854775808 à 18446744073709551615. Si un champ à 64 chiffres est représenté sous la forme d’un nombre avec le signe du type long, il s’agira de valeurs négatives. Voici trois limitations pour le travail avec HedgeTerminal.

La première limitation concerne le robot de trading, travaillant avec HedgeTerminal. Ce n’est pas strict et cela peut être traité comme une recommandation :

Un robot de trading ou un Expert Advisor travaillant avec HedgeTerminal doit avoir un identifiant (numéro magique de l’Expert) ne dépassant pas la valeur 9223372036854775808.

En réalité, les Expert Advisors habituels ne rencontreront jamais cette restriction car les identifiants dépassant 5-6 chiffres sont très rarement utilisés. L’identifiant le plus courant pour un Expert est « 12345 » ou quelque chose du genre). Cette restriction peut s’appliquer aux robots stockant des informations de service telles que des liens vers d’autres ordres dans leurs numéros magiques. HedgeTerminal n’est pas compatible avec ces Experts et ne peut pas travailler en collaboration avec eux.

Si, pour une raison quelconque, la limite mentionnée est dépassée, alors apparaît une probabilité nulle de collision. Ce dernier est très petit car une coïncidence dans une telle plage est très peu probable. Même dans ce cas, HedgeTerminal résoudra cette collision en utilisant ses algorithmes. Cela ralentira son travail car déchiffrer un lien, comparer ce lien avec les ordres existants et analyser cet ordre pour l’aptitude à l’appariement avec un autre ordre prendra plus de temps. Donc, pour éviter cela, il est préférable de ne pas utiliser de longs nombres avec un signe négatif.

La deuxième limitation est difficile mais elle ne concerne que le broker et l’échange auxquels HedgeTerminal va être connecté :

Les identificateurs d’ordre doivent utiliser des numéros de 0 à 2^59 ou 576 460 752 303 423 488.

Cela est évident car seulement 59 chiffres sont utilisés pour stocker les identifiants d’ordre au lieu de 64. Si votre broker utilise des identificateurs d’ordre supérieurs à cette valeur, vous ne pouvez pas utiliser Hedge Terminal dans votre travail.

La troisième limite découle de la manière dont la position est représentée :

HedgeTerminal n’est compatible avec aucun autre système de gestion de position. Ceci n’est pas compatible avec les panneaux de trading externes ayant pour fonction de fermer les positions et ne peut pas être utilisé avec eux.


3.7. Mécanisme d’appariement des ordres et déterminisme des actions

Nous avons examiné en détail la représentation de la position dans HedgeTerminal et la structure de ses liens. Nous n’allons pas discuter de la description de l’algorithme qui gère les ordres liés. Par exemple, nous avons deux ordres choisis parmi un certain nombre d’autres ordres et nous devons les lier. Si nous ne nous appuyons pas sur la règle selon laquelle un lien vers l’ordre doit être unique et être possédé par un seul ordre, toutes les situations possibles peuvent être divisées en trois groupes :

  1. L’ordre n’est référencé par aucun autre ordre ;
  2. L’ordre est référencé par un ordre ;
  3. L’ordre est référencé par deux ordres ou plus.

Le premier groupe ne cause pas de difficultés et un tel ordre est considéré comme une position ouverte. Les choses sont très simples avec le troisième groupe aussi, car une paire d’ordres fait une position fermée. Que pouvons-nous faire avec les cas du troisième groupe ? Que se passe-t-il si un ordre est référencé par deux autres ordres ? Lequel d’entre eux est censé être lié au premier et qu’adviendra-t-il du second ordre ? Il est facile de répondre à cette question si nous présentons le processus d’appariement comme un processus séquentiel :

  1. Nous rencontrons un ordre qui ne contient pas de lien vers un autre ordre. Il est transféré dans la section des ordres actifs (positions) et après cela, l’itération sur les ordres continue ;
  2. Ensuite, nous rencontrons un autre ordre qui a une référence au premier ordre. Ensuite, l’ordre référencé est recherché dans la section des ordres actifs. Si l’ordre référencé se trouve dans cette section, il est appairé à l’ordre actuel et ils sont tous deux transférés dans la section des transactions complètes sous la forme de positions historiques ;
  3. Au cours d’une itération ultérieure, nous rencontrons un autre ordre qui contient un lien vers l’ordre décrit au point 1. Ensuite, l’ordre référencé est recherché dans la section des ordres actifs. Cette fois, la recherche sera infructueuse car les ordres demandés ont été reportés de cette section à la section des transactions terminées. Étant donné que l’ordre référencé par l’ordre actuel n’a pas été trouvé, l’ordre actuel malgré son lien est un ordre actif et est porté à la section avec les positions actives.

Étant donné que les identificateurs d’ordre sont remplis de manière cohérente et que leur liste est triée par heure, leur itération séquentielle peut être effectuée. Ainsi, l’ordre d’initialisation sera associé au tout premier ordre contenant un lien vers celui-ci, quel que soit le nombre d’autres ordres contenant les mêmes liens. Toutes les autres ordres contenant des liens vers l’ordre d’initialisation seront inclus dans la liste des positions initiatrices actives.

Comme nous l’avons déjà mentionné, l’algorithme exécutant une telle itération doit être complètement déterministe et cohérent. HedgeTerminal utilise un tel algorithme d’itération dans son travail. En fait, il ne s’agit pas simplement d’une itération, mais d’une répétition de toutes les actions de trading qui ont été effectuées à partir du moment de la première transaction. En effet, à chaque lancement, HedgeTerminal construit systématiquement une chaîne d’actions de trading du tout début au moment présent. Grâce à cela, sa représentation de position actuelle est le résultat de son trading rétrospectif au moment du lancement.

Étant donné que l’itération sur tous les ordres de l’historique est effectuée séquentiellement, il est également nécessaire d’effectuer des actions de trading de manière séquentielle. Cela détermine le mode d’exécution de l’ordre dans HedgeTerminal. Par exemple, une position bidirectionnelle active dans HedgeTerminal protégée par StopLoss doit être fermée. Nous savons qu’une telle position bidirectionnelle se compose essentiellement de deux ordres : un ordre exécuté initiant une position active et un ordre en attente buy-stop ou sell-stop, agissant comme un ordre stop-loss. Pour fermer une telle position, il est nécessaire de supprimer l’ordre en attente et de fermer une position bidirectionnelle active par un contre-ordre avec le même volume. Ainsi, deux actions de trading doivent être effectuées. HedgeTerminal exécute tous les ordres de trading de manière asynchrone.

De cette façon, les ordres peuvent être exécutés simultanément, c’est-à-dire que le premier ordre peut être placé pour annuler l’ordre en attente et le deuxième ordre pour exécuter le contre-ordre, ce qui fermera votre position. Cela va cependant bouleverser le déterminisme des actions et HedgeTerminal ne peut pas effectuer cela. Si, pour une raison quelconque, l’ordre en attente n’est pas annulé et que la position n’est pas fermée par le contre-ordre, il y aura une ambiguïté car la position sera fermée et son StopLoss existera toujours. En fin de compte, l’ordre qui met en œuvre le StopLoss peut déclencher et générer une nouvelle position bidirectionnelle. Cela ne devrait pas se produire. C’est pourquoi HedgeTerminal annulera StopLoss et, après une annulation réussie, passera un contre-ordre. Il est possible que le contre-ordre ne soit pas exécuté ou soit exécuté partiellement à la deuxième étape. Dans ce cas, cependant, l’ambiguïté sera éliminée car même un contre-ordre partiellement exécuté fermera une partie de la position active. C’est une situation ordinaire.

Il existe une séquence plus complexe d’actions mises en œuvre par HedgeTerminal. Prenons un exemple similaire au précédent, mais cette fois, nous allons fermer une partie de la position. Cela signifie que HedgeTerminal devra mener trois actions :

  1. Supprimer l’ordre en attente qui a agi en tant qu’ordre StopLoss ;
  2. Exécuter le contre-ordre en fermant une partie du volume d’une position bidirectionnelle ;
  3. Placer un nouveau StopLoss avec un nouveau volume protégeant la partie restante de la position active.

Toutes ces actions seront exécutées de manière cohérente pour éviter de perturber le déterminisme des actions. La chose naturelle à attendre est l’augmentation de la vitesse d’exécution des ordres en raison du placement simultané des ordres, bien que dans ce cas, une exécution séquentielle des opérations du trading ne puisse pas être garantie et que des ambiguïtés soient possibles. Un traitement séquentiel des ordres n’implique aucune ambiguïté.


3.8. Séparation et connexion des transactions - la base de l’arithmétique des ordres

Une gestion séquentielle des ordres n’est pas suffisante. Ici, deux choses doivent être notées :

  • Un ordre peut inclure plusieurs transactions. Le nombre de ces transactions peut être aléatoire ;
  • Il est également important de prendre en compte une exécution partielle de l’ordre et un cas plus courant où un volume d’un ordre de fermeture peut ne pas être égal au volume de l’ordre d’initiation ;

L’ordre peut être exécuté par plusieurs transactions en même temps et il peut être exécuté partiellement. Si vous ne savez pas pourquoi cela peut arriver, veuillez vous référer à l’article dédié à la description de la tarification boursière «Principes de la tarification boursière à travers l’exemple du marché des produits dérivés de la Bourse de Moscou». La question « Pourquoi le volume de l’ordre de fermeture ne peut-il pas être égal au volume de l’ordre d’ouverture ? » nécessite une réponse. Que pouvons-nous faire dans ce cas ?

En fait, leurs volumes ne peuvent pas être égaux si l’on présume une opportunité de fermeture partielle d’une position active. Si nous ouvrons une position active avec le volume de 50 contrats et fermons une partie des positions par le contre-ordre avec le volume de 20 contrats, alors la position active sera divisée en deux parties. La première partie fera une nouvelle position historique avec le volume de 20 ordres avec le contre-ordre et la deuxième partie sera toujours ouverte bien que son volume diminuera et sera de 30 contrats.

Cet algorithme de fermeture partielle de position est mise en œuvre dans HedgeTerminal. Si une nouvelle valeur de volume est entrée dans le champ « Volume » du panneau HedgeTerminal, une fermeture partielle aura lieu. Dans le dossier « Historique », une nouvelle position apparaîtra et le volume de la position actuelle sera égal à la nouvelle valeur. HedgeTerminal peut traiter la situation même lorsque le volume de l’ordre de fermeture est supérieur au volume de l’ordre d’initiation ! Une telle situation peut se produire si HedgeTerminal place, pour une raison quelconque, un volume incorrect de l’ordre de fermeture ou si le broker annule de manière détournée plusieurs transactions incluses dans l’ordre d’initiation, ce qui modifiera le volume exécuté pour un plus petit.

Pour prendre en compte une différence potentielle de volumes, il est nécessaire d’utiliser un algorithme universel basé sur le calcul du volume total de toutes les transactions liées à l’ordre. Dans ce cas, ce sont les transactions, pas les ordres, qui déterminent tout. Le volume d’un ordre est le volume de ses transactions. Le prix d’un ordre exécuté est le prix moyen de ses transactions.

HedgeTerminal utilise l’algorithme qui relie les ordres entre eux ou les divise. Il est basé sur l’addition et la soustraction des transactions. Son travail est basé sur l’unité des transactions entre l’ordre d’initialisation et de fermeture avec la formation suivante d’une position historique.

Pour comprendre le fonctionnement de cet algorithme, supposons qu’il y a deux ordres à apparier pour créer une position historique. Les deux ordres ont le même nombre de transactions et leur volume exécuté est le même. Le nombre de transactions sera à trois chiffres pour plus de simplicité :

Ordre #1 (dans l’ordre)Volume (10/10)
transaction #2833
transaction #2882
transaction #2945

Table 3. Ordre n°1 et ses transactions


Ordre #2 (ordre de sortie)Volume (10/10)
transaction #8711
transaction #8823
transaction #9216

Table 4. Ordre n°2 et ses transactions

Rassemblons leurs transactions avec les volumes :

Table 5. Assembler des ordres

Table 5. Assembler des ordres

Sélectionnez deux derniers ordres dans chaque colonne : No294 et No921. En général, ils ne peuvent pas être au même niveau les uns avec les autres (comme dans cet exemple).

Sélectionnez une offre avec le moins de volume. Il s’agit de la transaction No294 avec le volume 5. Divisez la transaction opposée n° 921 en deux. La première transaction est égale au volume de la transaction No294 (5 contrats) et la seconde transaction contient le volume restant d’un contrat (6 contrats – 5 contrats = 1 contrat). Unir la transaction #294 avec le volume 5 à la première partie du volume No921 avec le volume similaire :

Table 6. Soustraction des volumes

Table 6. Soustraction des volumes

Transférez la partie unie dans une nouvelle colonne contenant les transactions de la position historique.

Ceci est surligné en vert. Laissez la partie restante de la transaction #921 avec le volume 1 dans la colonne initiale de la position active. Ceci est surligné en gris:

Table 7. Fractionner et reporter les transactions

Table 7. Fractionner et reporter des transactions

Nous avons fait le premier pas en unissant les transactions de deux ordres et en les reportant à une position historique. Réfléchissons à la séquence des actions sous une forme brève :

Table 8. Fractionner et reporter les transactions. Étape 1

Table 8. Fractionner et reporter les transactions. Étape 1.

Le volume de la transaction No294 a été intégralement reporté dans la section des positions historiques. La transaction a été complètement anéantie. La transaction a donc été divisée et reportée à la section des ordres historiques. C’est pourquoi, à l’étape suivante, nous pouvons passer à la transaction suivante No288 avec le volume 2. La transaction n° 921 est toujours présente et son volume est égal à la deuxième partie restante de la transaction. À l’étape suivante, ce volume interagira avec le volume de la transaction No288.

À la deuxième étape, répétez la procédure avec les transaction n° 288 et n° 921. Cette fois, le volume restant de la transaction n° 921 (1 contrat) est uni au volume de la transaction n° 288 après être passé à la colonne des ordres historiques. Le volume restant de la transaction No288 est égal à 1 contrat et restera dans la colonne de la position active :

 Table 9. Fractionner et reporter les transactions. Étapes 1-2

Table 9. Fractionner et reporter les transactions. Étapes 1 à 2

Répétez les mêmes actions avec les transactions No288 et No882 :

Table 10. Fractionner et reporter les transactions. Étapes 1 à33

Table 10. Fractionner et reporter les transactions. Étapes 1 à 3

Exécutez les étapes IV et V de la même manière :

Table 11. Fractionner et reporter les transactions. Étapes 1-5

Table 11. Fractionner et reporter les transactions. Étapes 1 à 5

Après l’étape V, le volume de l’ordre de fermeture sera absolument le même que le volume des transactions de l’ordre d’ouverture. Les transactions reportées dans la colonne des positions historiques constituent une transaction historique complète. Les transactions restantes de la position active font une position active. Dans ce cas, il n’y a plus de transactions dans la colonne de la position active. Cela signifie qu’après une telle unité, la position active cessera d’exister. Une nouvelle position historique apparaîtra et inclura toutes les transactions de la position active.

Une fois les transactions reportées, beaucoup d’entre elles seront divisées en parties et occuperont plusieurs lignes. Pour éviter cela, une option sur la collecte des transactions peut être ajoutée à l’algorithme d’union / de séparation les transactions. Il suffit d’unir le volume des transactions avec les mêmes identifiants en :

Table 12. Unir les transactions en un seul niveau

Table 12. Unir les transactions en un seul niveau

Après l’union, le nombre de transactions et leur volume correspondent complètement aux transactions et aux volumes initiaux. Cela ne se produit que parce que leurs volumes correspondaient initialement. Si leurs volumes étaient différents, alors après la procédure d’union, les transactions auraient des volumes différents.

Cet algorithme est universel car il ne nécessite pas le même nombre de transactions pour l’ordre d’initiation et de fermeture. Il y a un autre exemple basé sur cette propriété que nous allons examiner :

Table13. Unir les ordres avec un nombre différent de transactions

Table 13. Unir les ordres avec un nombre différent de transactions

Comme nous pouvons le constater, l’union des ordres en une seule position historique a été couronnée de succès. Malgré un nombre différent de transactions, leur volume a de nouveau correspondu.

Maintenant, imaginez que le volume total de l’ordre de fermeture (12 contrats) soit inférieur au volume des transactions de l’ordre d’initiation (22 contrats). Comment se passera l’unité dans ce cas ?

Tableau 14. Unir les ordres avec différents volumes

Table 14. Unir les ordres avec différents volumes

Comme nous pouvons le voir, à la deuxième étape, le volume des transactions de l’ordre de fermeture est égal à zéro alors que l’ordre d’initiation contient deux autres transactions n° 321 avec le volume 4 et №344 avec le volume 6. Il y a un excès des transactions d’ordres actifs. Cet excès existera en tant que position bidirectionnelle active. Il y a cependant une nouvelle position historique avec les transactions reportées dans la colonne verte. Ses volumes initiaux et de sortie de 12 contrats ont de nouveau correspondu.

Dans le cas où le volume de l’ordre de fermeture est supérieur à l’ordre d’initiation, il y a aussi un excès bien que cette fois il soit du côté de l’ordre de fermeture :

Tableau 15. Unir les ordres avec différents volumes

Table 15. Unir les ordres avec différents volumes

Comme nous pouvons le voir, l’ordre initial avec le volume 4 et l’ordre de fermeture avec le volume 6 font deux positions. Le premier est une position historique avec le volume 4 et traite le No625 de l’ordre initiale et le No719, No720 de l’ordre de fermeture. La deuxième position est un excès de transactions d’appariement de ces ordres. Elle contient la transaction n° 719 avec le volume 2. Cette transaction et l’ordre font une position active dans l’onglet « Actif » du panneau HedgeTerminal.

Les transactions et les ordres peuvent être divisés par l’algorithme en positions historiques et actives. Les volumes peuvent être différents. L’essentiel est que l’algorithme permette de rassembler les volumes des ordres d’initiation et de fermeture en formant une position historique avec des volumes égaux d’entrée et de sortie. Il assure l’impossibilité de la situation lorsque ces volumes ne sont pas égaux et donc des erreurs de représentation de position provoquant une asymétrie de la position.

Supposons que dans le premier exemple, le broker ait annulé une transaction incluse dans l’ordre de fermeture :

Table 16. Simulation de la suppression d’une transaction de l’historique

Table 16. Simulation de la suppression d’une transaction de l’historique

Une nouvelle position nette avec un volume de 6 contrats. Elle sera égale au volume des transactions annulées. Voyons comment l’algorithme de Hedge Terminal fonctionnera dans ce cas :

Table 17. Rétablissement de l’intégrité de la représentation

Table 17. Rétablissement de l’intégrité de la représentation

Comme nous pouvons le voir, à la deuxième étape, il y a un excès de 6 contrats (3 + 2 + 1). Cet excès se transformera en position active et donc le volume et la direction de la position bidirectionnelle sont égaux à ceux de la position nette.

En résumé, nous pouvons dire que l’algorithme d’unité des transactions garantit l’égalité des volumes des ordres d’initiation et de fermeture dans les positions historiques en raison de transactions non liées excessives. Cet excès de transactions fait une position bidirectionnelle active, ce qui rend la position nette dans MetaTrader 5 égale à la position nette de toutes les positions actives dans HedgeTerminal.

Ce mécanisme fonctionne à la fois de façon rétrospective et en temps réel, ce qui signifie qu’il effectuera les positions nettes dans Hedge Terminal même avec la position nette dans MetaTrader 5, quelle que soit l’action du broker sur l’annulation des actions du trading. Les combinaisons sur le changement d’une position nette et l’annulation de la transaction peuvent apparaître car elles ne provoquent pas d’asymétrie entre la position nette du terminal et la position nette de HedgeTerminal.

Le mécanisme de fermeture partielle de position est basé sur la capacité de cet algorithme à rassembler différents volumes. Cet algorithme est l’une des parties les plus importantes de HedgeTerminal assurant son fonctionnement stable en tant que système auto-adaptant sans réglage requis.


3.9. Virtualisation des ordres et des transactions

Chaque ordre et transaction dans HedgeTerminal a un véritable prototype avec un identifiant correspondant. Néanmoins, du point de vue de HedgeTerminal, un ordre peut faire une position active et en même temps faire partie d’une position historique. Les transactions et les ordres dans MetaTrader 5 sont des entités indivisibles. Un ordre dans la plate-forme peut être en attente ou exécuté. Une transaction a également un volume constant et est toujours une transaction exécutée.

Dans HedgeTerminal, les mêmes ordres et transactions peuvent être présents dans différentes positions bidirectionnelles. La même transaction ou le même ordre dans celui-ci peut créer une position active et historique. En d’autres termes, les ordres et les transactions dans HedgeTerminal sont divisés en plusieurs ordres et transactions virtuels. Cette représentation de données diffère grandement de la représentation de données dans MetaTrader 5. Cependant, cette représentation permet d’être flexible et de s’adapter aux changements rétrospectifs des informations de trading et de rapprocher les ordres et les transactions.


3.10. Mécanisme de masquage des ordres

Nous avons mentionné le mécanisme de masquage des ordres dans la section décrivant l’installation de HedgeTerminal. HedgeTerminal peut ignorer certains ordres. Pour qu’un ordre ou une transaction cesse d’exister pour HedgeTerminal, il suffit d’entrer son identifiant dans le fichier désigné ExcludeOrders.xml.

Supposons que nous ayons plusieurs ordres de vente ou d’achat exécutés sur un symbole. Le volume agrégé des ordres de vente est égal au volume agrégé des ordres d’achat. De cette façon, peu importe le nombre d’ordres que nous avons, leur position totale est égale à zéro. Si les identificateurs de ces ordres ne figurent pas dans le fichier ExcludeOrders.xml, HedgeTerminal affichera chacun d’eux en tant que position bidirectionnelle. Leur position totale sera cependant nulle. Par conséquent, si une position nette dans MetaTrader 5 est nulle, alors la contribution de cet ordre défini à la position nette peut être simplement ignorée.

Maintenant, supposons qu’au moment précis t nous avons une position nette nulle sur le symbole S et un ensemble d’ordres N exécutés sur ce symbole à ce moment précis. Comme il n’y a pas de position sur ce symbole, le volume total de l’ensemble des ordres N est insignifiant. En fait, le nombre d’ordres et leur volume ne sont pas pertinents car puisqu’il n’y a pas de position, ces ordres ne contribuent pas à la position nette totale. Cela signifie que de tels ordres peuvent simplement être ignorés et qu’il n’est pas nécessaire de les représenter comme des positions bidirectionnelles.

C’est le mécanisme même que HedgeTerminal utilise au moment de son installation. Au moment de l’installation t s’il n’y a pas de position nette, HedgeTerminal inclut l’ensemble des ordres N à la liste des exceptions. Leur volume total et leur nombre ne sont pas pertinents car il n’y a pas de position nette. S’il y a une position nette au moment de l’installation de HedgeTerminal, il ne sera tout simplement pas installé tant que la position nette n’est pas fermée. Après l’installation, les nouveaux ordres changeront l’état de la position nette. Cet état sera cependant synchronisé avec le volume net des positions bidirectionnelles dans HedgeTerminal.

Apparemment, nous pourrions nous en tirer sans mettre les ordres exécutés au moment de HedgeTerminal à la liste des exceptions. Dans le même temps, il peut arriver qu’il y ait beaucoup d’ordres au moment de l’installation et du point de vue de HedgeTerminal, toutes deviendront des positions bidirectionnelles et leur volume total de cabine diffère du volume net dans MetaTrader 5.

Le mécanisme de dissimulation des ordres peut être efficace contre la corruption de l’historique du compte. C’est comme ça que cela fonctionne. Supposons qu’il y ait un certain historique des ordres. Lorsque HedgeTerminal est lancé sur ce compte, il itérera tous les ordres et construira une position bidirectionnelle en fonction de ceux-ci. Si tous les ordres sont disponibles à partir du moment de l’ouverture et que les données sur ces ordres ne sont pas corrompues, la position nette de ces ordres sera correspondante à la position nette dans MetaTrader 5. Apparemment, la position nette dans HedgeTerminal sera égale à la somme de ces ordres. Ceci est illustré sur le diagramme ci-dessous:

Fig. 45. Diagramme de l’historique intégral

Fig. 45. Diagramme de l’historique intégral

Une partie de l’historique peut être manquante ou les informations sur les ordres peuvent être incorrectes.

Il n’est pas important qu’un seul ordre soit manquant ou plusieurs ordres et il est importance que des informations soient manquantes au début de l’historique du compte ou au milieu. La position nette dans HedgeTerminal exécutée sur un tel compte est égale à la position nette de tous les ordres disponibles. La position nette des ordres ne sera pas égale à la position nette factuelle du terminal en raison de la partie manquante de l’historique. Cette situation est présentée sur le diagramme B:

Fig. 46. Historique partiellement corrompu

Fig. 46. Historique partiellement corrompu

Pour synchroniser une position nette dans HedgeTerminal avec la position nette factuelle dans MetaTrader 5, nous n’avons pas besoin de savoir quels ordres ont disparu ou ont été corrompus. Tout ce dont nous avons besoin est de calculer la différence entre ces positions nettes. Dans l’exemple ci-dessus, une position d’achat avec le volume de 5 contrats est ouverte dans le terminal MetaTrader 5. Dans HedgeTerminal, cela correspondra à une position longue totale pour 8 contrats. La différence entre ces deux positions sera de 3 contrats à acheter car 8 ACHAT– 5 ACHAT = 3 ACHAT.

Une fois la différence de contrat calculée, il est nécessaire de passer un ordre d’achat ou de vente correspondant avec un volume égal à la différence. Dans notre exemple, il est nécessaire de passer un ordre d’achat de 3 contrats. Lorsque l’ordre est exécuté, HedgeTerminal l’affichera dans l’onglet des positions actives et sa position nette totale augmentera de 3 contrats et deviendra égale à 11 contrats à acheter.

La position dans MetaTrader 5 augmentera également et fera 8 contrats. L’identifiant de cet ordre doit être entré dans la liste des ExcludeOrders.xml, puis le terminal doit être redémarré. Donc, si l’identifiant de notre ordre est égal à 101162513, alors la balise suivante est censée être écrite dans le fichier :

<Orders-Exclude>
        ...
        <Order AccountID="10052699" ID="101162513"></Order>
</Orders-Exclude>

Après le redémarrage de HedgeTerminal, cette position bidirectionnelle disparaîtra. De cette façon, une position nette dans MetaTrader 5 correspondra à une position nette dans HedgeTerminal et fera 5 contrats à acheter. La séquence d’actions décrite est présentée sur le diagramme ci-dessous :

Fig. 47. Diagramme de restauration de l’intégrité des données

Fig. 47. Diagramme de restauration de l’intégrité des données

Le résultat financier de la position disparue ne sera pas enregistré dans les statistiques de HedgeTerminal. Malheureusement, les positions bidirectionnelles cachées ne participent pas aux statistiques du trading.

En réalité, une situation où une partie de l’historique est indisponible ou corrompue est hautement improbable. Un tel mécanisme doit être en place, bien que la majorité des utilisateurs de MetaTrader 5 ne rencontreront jamais une situation où ils doivent l’utiliser. Après tout, une possibilité d’erreurs de programme de HedgeTerminal n’est pas exclue. Même dans ce cas, il devrait y avoir un instrument fiable pour résoudre ces erreurs.


3.11. Mécanismes d’adaptation

Nous avons envisagé des mécanismes permettant à HedgeTerminal de représenter des positions bidirectionnelles dans l’environnement net de MetaTrader 5. Il existe trois de ces mécanismes :

  1. Itération séquentielle des transactions ;
  2. Mécanisme de séparation et de rapprochement des transactions ;
  3. Mécanisme de dissimulation des ordres.

Chacun de ces mécanismes aborde leurs problèmes et permet d’éviter les ambiguïtés et les erreurs à leur niveau. Apportons ces problèmes et leurs solutions sur la table. La première colonne contient les problèmes et les erreurs possibles de liaison et la deuxième colonne les mécanismes qui les résolvent :

Problèmes, erreurs, ambiguïtés survenant au sein de l’organisation du trading bidirectionnelMécanismes de correction d’erreur
Erreurs dans les liens vers les ordres d’ouverture ; Collision de liaison ; De longs nombres magiques dans Experts ; suppression des ordres de l’historique ; Erreurs d’exécution de l’opération de trading.Itération séquentielle sur les ordres. Déterminisme des actions.
Erreurs de volume ; Faire correspondre les ordres avec différents volumes ; exécution partielle des ordres ; suppression des offres de l’historique ; Couvrir un plus petit volume avec un plus grand.Mécanisme de séparation et de correspondance des transactions.
Installer HedgeTerminal sur le compte avec un grand nombre d’ordres exécutés ; Historique corrompu ; Bugs de HedgeTerminal dans le travail avec les ordres.Mécanisme de dissimulation des ordres.

Table 18. Erreurs possibles et mécanismes de leur élimination

Les trois mécanismes ainsi que le système de stockage des liens assurent une représentation stable des données. Essentiellement, ces mécanismes couvrent tous les cas possibles de défaillances imprévues et garantissent la correspondance de la position nette dans HedgeTerminal avec la position nette dans MetaTrader 5.


3.12. Performances et utilisation de la mémoire

HedgeTerminal est essentiellement une application orientée objet. En raison des principes de POO (Programmation orientée objet) qui sous-tendent son architecture, le terminal a une efficacité élevée et de faibles exigences en matière de stockage. La seule tâche consommatrice de ressources est l’extraction de l’historique des ordres et des transactions dans la mémoire de l’ordinateur au moment du lancement du terminal sur un graphique.

Une fois que toutes les transactions requises ont été extraites dans la mémoire, le terminal imprimera un message informant du temps passé sur cette opération et de l’utilisation de la mémoire. Le lancement du panneau HedgeTerminal sur le compte contenant plus de 20 000 transactions sur l’ordinateur avec le processeur Intel i7 a pris moins de 30 secondes et a nécessité 118 Mo de RAM :

2014.11.20 16:26:19.785 hedgeterminalultimate (EURUSD,H1)       We begin. Parsing of history deals (22156) and orders (22237) completed for 28.080 sec. 118MB RAM used.

La bibliothèque HedgeTerminalAPI fonctionne encore plus rapidement et prend beaucoup moins de mémoire car la représentation graphique des transactions n’est pas nécessaire. Voici le résultat du lancement sur le même compte :

2014.11.20 16:21:46.183 TestHedgeTerminalAPI (EURUSD,H1)        We are begin. Parsing of history deals (22156) and orders (22237) completed for 22.792 sec. 44MB RAM used.

Un calcul simple montre que l’extraction d’une position prend de 1 à 1,26 millisecondes selon le type de programme. Le stockage d’une transaction prend : (22 156 transactions + 22237 ordres) / 44 Mo = 1 Ko de RAM. Le stockage d’une représentation graphique supplémentaire d’une transaction prend approximativement : (118 Mo – 44 Mo) * 1024 / (22 156 transactions + 22237 ordres) = 1,71 Ko de mémoire.

Le profilage du code montre que la majeure partie du temps est occupée par le seul bloc de l’analyse de l’ordre. La majeure partie de ce dernier est l’appel de la fonction système. Dans les futures versions, ce bloc va être optimisé et cela permettra d’augmenter l’efficacité au lancement de 10 à 15 %.


Conclusion

Nous avons examiné les points clés dans le travail avec le panneau visuel HedgeTerminal. C’était un exemple de création d’une nouvelle classe de panneaux avec une possibilité de configuration flexible.

Les schémas et les spécifications ont donné une idée approfondie des principes d’organisation du trading bidirectionnel. Si vous créez vos propres bibliothèques de virtualisation, le deuxième chapitre de cet article vous aidera à concevoir une telle bibliothèque.

Le caractère de l’exécution de l’échange nécessite de prendre en compte les points clés du processus de représentation des transactions et des ordres en tant que positions bidirectionnelles. Cet article a montré qu’une telle représentation était impossible sans la virtualisation des transactions et des ordres. La virtualisation est un mécanisme de « rupture » du volume de transactions exécutées et de clonage d’ordres réels afin qu’un ordre puisse faire partie de plusieurs transactions.

Ces manipulations avec l’environnement de trading sont plutôt courageuses mais la majeure partie des informations requises à la virtualisation est stockée sur le serveur de trading, une telle représentation peut être traitée comme fiable.


Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/1297

Trading bidirectionnel et couverture des positions dans MetaTrader 5 à l’aide du HedgeTerminalAPI, Partie 2 Trading bidirectionnel et couverture des positions dans MetaTrader 5 à l’aide du HedgeTerminalAPI, Partie 2
Cet article décrit une nouvelle approche de la couverture des positions et trace la ligne dans les débats entre les utilisateurs de MetaTrader 4 et MetaTrader 5 à ce sujet. C'est la suite de la première partie : « Trading bidirectionnel et couverture des positions dans MetaTrader 5 à l’aide du panneau HedgeTerminal, Partie 1 » Dans la deuxième partie, nous discutons de l'intégration des Expert Advisors personnalisés dans HedgeTerminalAPI, qui est une bibliothèque de visualisation spéciale conçue pour le trading bidirectionnel dans un environnement logiciel confortable fournissant des outils pour une gestion de position pratique.
Principes de la tarification des changes à travers l'exemple du marché des dérivés de la Bourse de Moscou Principes de la tarification des changes à travers l'exemple du marché des dérivés de la Bourse de Moscou
Cet article décrit la théorie de la tarification des changes et les spécificités de compensation du marché des produits dérivés de la Bourse de Moscou. Ceci est un article complet pour les débutants qui veulent obtenir leur première expérience d’échange sur le trading de produits dérivés, ainsi que pour les traders forex expérimentés qui envisagent de négocier sur une plate-forme d’échange centralisée.
Le MQL5 Cookbook : Implémentation d'un tableau associatif ou d'un dictionnaire pour un accès rapide aux données Le MQL5 Cookbook : Implémentation d'un tableau associatif ou d'un dictionnaire pour un accès rapide aux données
Cet article décrit un algorithme spécial permettant d'accéder aux éléments par leurs clés uniques. Tout type de données de base peut être utilisé comme clé. Par exemple, elles peuvent être représentées sous la forme d'une chaîne ou d'une variable entière. Un tel conteneur de données est communément appelé dictionnaire ou tableau associatif. Il fournit un moyen plus facile et plus efficace de résoudre les problèmes.
Programmation des modes d'EA à l'aide d'une approche orientée objet Programmation des modes d'EA à l'aide d'une approche orientée objet
Cet article explique l'idée de la programmation d'un robot de trading multimode dans MQL5. Chaque mode est implémenté avec l'approche orientée objet. Des instances de la hiérarchie des classes de mode et des classes à tester sont fournies. La programmation multimode des robots de trading est censée prendre en compte toutes les particularités de chaque mode opérationnel d'un EA écrit en MQL5. Des fonctions et des énumérations sont créées pour identifier le mode.