Un Gestionnaire de Commande Virtuelle pour suivre les commandes dans l'environnement MetaTrader 5 axé sur la position
1. Introduction
Le plus grand changement dans la transition est incontestablement de MetaTrader 4 à MetaTrader 5 est la gestion des .positions. de trade ouvertes À tout moment, il ne peut y avoir qu'une seule position ouverte pour chaque symbole, et la taille de cette position s'ajuste de haut en bas à chaque fois que les commandes sont traitées par le courtier. Cela est conforme à la NFA 2-43(b) règle FIFO introduite aux États-Unis, et s'adapte aussi au mode de trading de nombreuses autres entités telles que les contrats à terme, les matières premières et les CFD.
Un exemple clair de la différence serait lorsque deux EA fonctionnant contre le même symbole émettent des commandes dans des directions opposées. Cela peut être une situation courante avec deux EA travaillant dans des délais différents, comme un scalper et un suiveur de tendance. Dans MetaTrader 4, la liste des transactions ouvertes afficherait les commandes ouvertes d'achat et de vente sans marge utilisée. Dans MetaTrader 5, aucune position ne serait ouverte du tout.
En regardant dans le code EA lui-même, des fonctions telles que la MQL4 OpenOrders() couramment utilisée ci-dessous, ou une variante similaire, ne fonctionnera pas comme prévu lors de la migration vers MQL5.
int OpenOrders() // MetaTrader 4 code to count total open orders for this EA { int nOpenOrders=0; for (int i=OrdersTotal()-1; i>=0; i--) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber()==magic) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderSymbol()==Symbol()) nOpenOrders++; } return(nOpenOrders); }
Ainsi, l'environnement axé sur la position de MetaTrader 5 présente des défis inconnus pour le programmeur habitué à l'approche de traitement des commandes utilisée dans MetaTrader 4. Les fonctions simples de gestion des commandes dans MetaTrader 4 deviennent plus complexes dans MetaTrader 5 lorsque plusieurs commandes peuvent être fusionnées en une seule position, tels que plusieurs EA négociant un symbole ou plusieurs commandes d'un seul EA sur un symbole.
2. Méthodes de travail avec les positions dans MetaTrader 5
Il existe plusieurs façons de gérer cet environnement centré sur la position dans MetaTrader 5, en fonction de la complexité des stratégies de trading.
Tout d'abord, notez que la gestion des commandes en cours par MetaTrader 5 est similaire à celle de MetaTrader 4, donc le code MQL5 écrit uniquement pour les commandes en cours pourrait être une migration relativement simple à partir du code MQL4.
2.1 EE simple ; un EA par symbole par compte
L'approche la plus simple consiste à limiter le trading sur un seul compte à un seul EA simple par symbole. « EA simple » dans ce cas indique celui qui n'émet qu'une seule commande à la fois, ce qui est une méthode courante mais exclut les stratégies telles que la pyramide et le trading sur grille. Les EA simples peuvent être écrits en MQL5 de la même manière que MQL4, peut-être en utilisant le wrapper de la bibliothèque CTrade fourni dans include\trade\trade.mqh.
2.2 EE complexe ; un EA par symbole par compte
Pour les EA complexes, tels que ceux qui adoptent une stratégie telle que la pyramide ou le trading de grille qui peut nécessiter plus d'une commande ouverte pour un symbole, un code de suivi des commandes relativement simple ajouté à l'EA peut être tout ce qui est nécessaire pour gérer la stratégie. Cela ne sera possible que si l' EA ne partagera jamais ses positions avec un autre trading EA le même symbole.
2.3 Plus d'un EA de tout type par symbole et par compte
Cela présente l'exigence de trading et de codage la plus complexe, et c'est la raison de l’élaboration de la bibliothèque Virtual Order Manager (VOM). Cette bibliothèque est destinée à simplifier considérablement l’élaboration de code EA robuste qui est entièrement sociable avec d'autres EA.
Le reste de cet article décrit en détail la bibliothèque Virtual Order Manager.
3. Objectifs de conception, avantages et inconvénients du Virtual Order Manager
Le VOM dispose de quatre principaux objectifs de conception :
- Sociabilité : le comportement des EA correctement rédigés à l'aide des fonctions de trading VOM sera isolé des autres activités de l' EA
- Robustesse : traitement élégant des événements anormaux tels que les erreurs, les ruptures de communication client-serveur et les commandes incomplètes.
- Facilité d'utilisation : mise à disposition de fonctions de trading simples et bien documentées
- Capacité à utiliser dans le testeur de stratégie
Ces objectifs sont mis en œuvre comme suit :
- Utilisation de commandes virtuelles ouvertes, de commandes en cours, de stoplosses et de takeprofits. « Virtuel » indique dans ce contexte que leur statut est maintenu au niveau du terminal client indépendamment des positions au niveau du serveur. Ces commandes disposent de lignes horizontales dessinées sur le terminal de la même manière que les positions
- Un arrêt de protection basé sur un serveur maintenu à distance des arrêts virtuels pour une protection contre les catastrophes en cas de défaillance du PC ou de la liaison Internet
L'approche VOM permet à un programmeur MQL5 EA de :
- Coder les EA de manière « axée sur les commandes », c'est-à-dire similaire à l'approche MetaTrader 4
- Implémenter ce que de nombreux membres de la communauté Metatrader appellent « le trading de couverture » ou, plus précisément, des trades simultanés dans la direction opposée contre un seul symbole
- Codez relativement facilement d'autres stratégies de trading avancées telles que les approches de trading sur grille, de pyramidage et de gestion de l'argent
- Émettre des arrêts et des commandes en cours plus serrés que le niveau d'arrêt minimum
Il convient également de noter qu'un effet secondaire de l'approche VOM est que ses stoplosses, takeprofits et commandes virtuelles en cours ont intrinsèquement un comportement « furtif », c'est-à-dire qu'ils ne peuvent pas être vus sur le serveur du courtier. Cacher les niveaux de stoploss est considéré par certains comme nécessaire pour empêcher le courtier de pouvoir s'engager dans la chasse au stop.
Le VOM présente également inconvénients. Le montant du risque sur actions est accru en raison de la possibilité de s'appuyer sur l'arrêt de protection du serveur plus éloigné lors d'une panne prolongée du PC ou de la liaison Internet. En outre, le glissement lors de l'exécution d'une commande virtuelle en cours, d'un stoploss ou d'un take profit pourrait être beaucoup plus élevé que pour son équivalent sur serveur pendant les périodes de forte volatilité telles que les événements d'actualité. L'impact de ces inconvénients peut être minimisé si les EA VOM sont traités à partir d'un bureau virtuel à haute fiabilité avec un temps de ping court vers le serveur du courtier.
4. Le VOM en pratique – une EA simple
Avant d'aller plus loin, il est temps de montrer comment un EA VOM peut être écrit. Nous écrirons un MA croisé EA simple, en commençant par le modèle EA fourni dans le lot de distribution. Nous utiliserons la Moyenne Mobile Fractale, qui dispose du potentiel de réduire les trades inutiles pendant les marchés latéraux, un problème notoire avec les stratégies croisées MA. Il convient de souligner que cette EA a été fournie à titre d'exemple simple et n'est pas recommandée pour le trading en direct - le test inversé est rentable mais le faible nombre des trades indique que le résultat n'est pas statistiquement important
L'EA est stockée dans experts\Virtual Order Manager\VOM EAs.
//+------------------------------------------------------------------+ //| FraMA Cross EA VOM.mq5 | //+------------------------------------------------------------------+ #property copyright "Paul Hampton-Smith" #property link "http://paulsfxrandomwalk.blogspot.com" #property version "1.00" // this is the only include required. It points to the parent folder #include "..\VirtualOrderManager.mqh" input double Lots=0.1; input int Fast_MA_Period=2; input int Slow_MA_Period=58; /* Because the broker is 3/5 digit, stoplosses and takeprofits should be x10. It seems likely that all brokers offering MetaTrader 5 will be 3/5 digit brokers, but if this turns out to be incorrect it will not be a major task to add digit size detection. */ input int Stop_Loss=5000; input int Take_Profit=0; /* We can also change the level of logging. LOG_VERBOSE is the most prolific log level. Once an EA has been fully debugged the level can be reduced to LOG_MAJOR. Log files are written under the files\EAlogs folder and are automatically deleted after 30 days. */ input ENUM_LOG_LEVEL Log_Level=LOG_VERBOSE; // The following global variables will store the handles and values for the MAs double g_FastFrAMA[]; double g_SlowFrAMA[]; int g_hFastFrAMA; int g_hSlowFrAMA; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { LogFile.LogLevel(Log_Level); // Need to include this line in all EAs using CVirtualOrderManager VOM.Initialise(); Comment(VOM.m_OpenOrders.SummaryList()); g_hFastFrAMA = iFrAMA(_Symbol,_Period,Fast_MA_Period,0,PRICE_CLOSE); g_hSlowFrAMA = iFrAMA(_Symbol,_Period,Slow_MA_Period,0,PRICE_CLOSE); ArraySetAsSeries(g_FastFrAMA,true); ArraySetAsSeries(g_SlowFrAMA,true); return(0); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Need to include this line in all EAs using CVirtualOrderManager VOM.OnTick(); Comment(VOM.m_OpenOrders.SummaryList()); // We now obtain copies of the most recent two FrAMA values in the // g_FastFrAMA and g_SlowFrAMA arrays. if(CopyBuffer(g_hFastFrAMA,0,Shift,2,g_FastFrAMA)!=2) || CopyBuffer(g_hSlowFrAMA,0,Shift,2,g_SlowFrAMA)!=2) { Print("Not enough history loaded"); return; } // And now we detect a cross of the fast FrAMA over the slow FrAMA, // close any opposite orders and Buy a single new one if(g_FastFrAMA[0]>g_SlowFrAMA[0] && g_FastFrAMA[1]<=g_SlowFrAMA[1]) { VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_SELL); if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0) { VOM.Buy(_Symbol,Lots,Stop_Loss,Take_Profit); } } // Opposite for Sell if(g_FastFrAMA[0]<g_SlowFrAMA[0] && g_FastFrAMA[1]>=g_SlowFrAMA[1]) { VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_BUY); if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0) { VOM.Sell(_Symbol,Lots,Stop_Loss,Take_Profit); } } } //+------------------------------------------------------------------+
Et maintenant, avec la sortie du Strategy Tester, il peut être inversement testé, voir la figure 1 ci-dessous :
Figure 1. Test inversé FrAMA Cross EA
La section de journalisation est illustrée à la figure 2 :
Figure 2. Journal de test de stratégie
5. Structure VOM
La figure 4 ci-dessous montre comment plusieurs EA VOM sont configurés :
Figure 3. Plusieurs EA VOM
Ensuite, en regardant à l'intérieur du VOM, les principaux composants sont illustrés à la figure 4 ci-dessous :
Figure 4. Structure interne VOM
Éléments de la figure 4 expliqués :
- Configuration - le VOM utilise CConfig pour stocker tous les éléments de configuration principaux en un seul endroit dans un objet global Config. Pour simplifier l'accès, les variables membres sont publiques et aucune fonction get/set n'est fournie.
- Variables globales - ce sont les variables accessibles dans MQL5 par des fonctions telles que GlobalVariableGet(). Le VOM utilise les variables globales pour
- Enregistrer et incrémentez le dernier numéro de ticket de Commande Virtuelle à l'aide de CGlobalVariable
- Maintenir une liste de tous les stoplos virtuels afin que les arrêts du serveur de protection contre les sinistres puissent être maintenus
- Trades ouverts et fichiers d'historique - ce sont les fichiers de disque permanents stockés par CVirtualOrderArrays pour garantir que le statut de la commande peut être rétablie au redémarrage. Une paire de ces fichiers est créée et stockée dans Files\\VOM pour chaque EA qui utilise le VOM. Un CVirtualOrder entame sa vie dans le tableau VOM.m_OpenOrders et est transféré dans le tableau VOM.m_OrderHistory lorsqu'il est fermé ou supprimé.
- Journal d'activité et de débogage - la plupart des codes, quelle que soit leur complexité, nécessitent la capacité de journaliser l'activité, et cette fonction est encapsulée par la classe CLog. Cela permet d'enregistrer la journalisation à quatre niveaux de détail et d'importance différents, et comprend le nettoyage automatique des anciens fichiers journaux pour s’assurer que l'espace disque est géré.
Les Expert Advisors qui utilisent le VOM interagissent avec la bibliothèque comme le montre la Figure 5 ci-dessous :
Figure 5. Interaction EA avec la bibliothèque VOM
6. En savoir davantage sur la protection contre les catastrophes stoploss
Les arrêts virtuels sont assez courants parmi les EA MetaTrader 4. Si un stoploss est maintenu du côté client uniquement, le niveau de sortie d'un trade est invisible pour le courtier, une stratégie souvent mise en œuvre dans l’idée que certains courtiers se lancent dans la chasse au stop. À eux seuls, les arrêts virtuels augmentent considérablement le risque du trade, car une connexion courtier-client doit toujours être en place pour que l'arrêt soit activé.
Le VOM contrôle ce risque en maintenant un arrêt basé sur le serveur à une distance configurable de l'arrêt virtuel le plus étroit. C'est ce qu'on appelle un stoploss de protection contre les catastrophes (DPSL) car il ne sera normalement actionné que si la connexion courtier-client est interrompue pendant un certain temps, comme ce serait le cas avec une rupture de connexion Internet ou une panne de PC. Comme les commandes virtuelles sont ouvertes et fermés, et convertis en une position sur le serveur, le maintien du DPSL au niveau correct peut être un peu complexe, comme illustré dans la séquence suivante.
Commande virtuelle action | Open price | Virtual SL | Position au serveur | Stoploss au serveur | Commentaire |
---|---|---|---|---|---|
0,1 lotsBUY #1 | 2.00000 | 1.99000 | 0,1 lotsBUY | 1.98500 | DPSL est 50 pips en dessous du SL virtuel #1 |
0,1 lotsBUY #2 | 2.00000 | 1.99500 | 0,2 lotsBUY | 1.99000 | L'ordre virtuel #2 a un SL plus serré donc DPSL est resserré à 50 pips en dessous du SL virtuel #2 |
Close #2 | 0,1 lotsBUY | 1.98500 | Revenir à DPSL plus souple | ||
0,1 lot VENDRE #3 | 2.00000 | 2.00500 | Aucun | Aucun | Les commandes virtuelles n°1 et n°3 ont chacune été annulées autre au serveur |
Close #1 | 0,1 lots SELL | 2.01000 | La commande virtuelle n°3 reste ouverte - DPSL est maintenant 50 pips au-dessus du SL virtuel #3 |
7. Test du gestionnaire de commandes virtuel
Un projet de cette envergure prend du temps à tester de manière approfondie, j'ai donc écrit le EA VirtualOrderManaerTester.mq5 pour permettre de créer, modifier, supprimer et clôturer facilement des commandes virtuelles avec des boutons de commande sur le graphique.
La figure 6 ci-dessous indique une commande d'achat virtuelle à 0,1 lot dans la fenêtre M5 et une commande d'achat virtuelle de 0,1 lot supplémentaire ouvert dans la fenêtre H4 contre EURUSD (voir les lignes de commentaires), avec le statut du serveur indiquant correctement une position à 0,2 lot acheté. Parce que la position globale est longue, le Stoploss de Protection Contre les Catastrophes peut être vu en dessous du stop plus serré de 20,0 pip.
Figure 6. Deux AE se mettent d'accord sur la direction
La figure 7 montre maintenant les deux EA de test avec des commandes virtuelles opposées, et aucune position n'est ouverte chez le courtier :
Figure 7. Deux EA avec des commandes virtuelles opposées et aucune position n'est ouverte chez le courtier
8. Un affichage très simple de toutes les commandes ouvertes VOM
Chaque VOM EA ne peut voir que ses propres commandes, j'ai donc écrit un EA très simple qui rassemble les commandes ouvertes de tous les VOM. L'affichage est très simple, et lorsque le temps le permet, une version bien meilleure pourrait être écrite, peut-être avec des boutons de commande pour effectuer des actions de modification, de suppression ou de clôture en fonction des besoins de chaque commande. L'EA est compris dans le pack de distribution en tant que VOM_OrderDisplay.mq5.
9. Conclusion
Au moment de la rédaction de cet article, le code VOM est en version bêta, tout comme MetaTrader 5 lui-même, et le temps nous dira si le concept VOM devient populaire ou finit par être considéré comme un élément intéressant de la programmation MQL5.
Revenons aux objectifs de conception de la section 3 et voyons où nous en sommes arrivés
- Sociabilité : le comportement des EA correctement rédigés à l'aide des fonctions de trading VOM sera isolé des autres activités de l' EA
- Résultat- oui, l'approche VOM a atteint cet objectif
- Robustesse : traitement élégant des événements anormaux tels que les erreurs, les ruptures de communication client-serveur et les commandes incomplètes.
- Résultat - une certaine robustesse est manifeste mais il pourrait y avoir une amélioration à mesure que des situations de trading réelles se manifestent et peuvent être analysées
- Facilité d'utilisation : mise à disposition de fonctions de trading simples et bien documentées
- Résultat - Comme on le verra dans le pack de distribution de fichiers, un fichier d'aide .chm est inclus
- Capacité à utiliser dans le testeur de stratégie
- Résultat -- les tests initiaux dans le testeur de stratégie récemment publié indiquent que le VOM effectue correctement le test inversé, bien que l'approche VOM ralentisse considérablement le test. Certains travaux pour améliorer le débit sont probablement nécessaires
Un certain nombre de changements futurs peuvent être souhaitables
- Comme pour toute élaboration logicielle complexe, il est probable qu'il reste des bugs dans le code
- Avec chaque publication de build MetaTrader 5 Beta, des modifications VOM peuvent être nécessaires pour maintenir la compatibilité
- Fonctions VomGetLastError() et VomErrorDescription()
- Possibilité de lire la configuration à partir d'un fichier
- Arrêts de remorquage de divers types
10. Fichiers dans le lot de distribution comprimé.
Le lot VOM se présente sous la forme d'un certain nombre de fichiers .mqh qui doivent être installés dans un dossier Experts\Virtual Order Manager,
- ChartObjectsTradeLines.mqh - CEntryPriceLine, CStopLossLine, CTakeProfitLine
- StringUtilities.mqh - descripteurs d'énumération globaux tels que ErrorDescription()
- Log.mqh - CLog
- GlobalVirtualStopList.mqh - CGlobalVirtualStopList
- SimpleChartObject.mqh - CButton, CLabel et CEdit
- VirtualOrder.mqh - CVirtualOrder
- GlobalVariable.mqh - CGlobalVariable
- VirtualOrderArray.mqh - CVirtualOrderArray
- VirtualOrderManager.mqh - CVirtualOrderManager
- VirtualOrderManagerConfig.mqh - CConfig
- VirtualOrderManagerEnums.mqh - les différentes énumérations définies pour le VOM
- VOM_manual.mqh - cette page du manuel
- VOM_doc.chm***
Cinq fichiers EA mq5 sont également inclus sous Experts\Virtual Order Manager\VOM EAs :
- VOM_template_EA.mq5 - clonez ceci pour créer vos propres EA et stockez-les dans Experts\Virtual Order Manage\VOM EAs
- VirtualOrderManagerTester.mq5
- Support_Resistance_EA_VOM.mq5
- FrAMA_Cross_EA_VOM.mq5
- VOM_OrderDisplay.mq5
***Notez que le fichier VOM_doc.chm devra peut-être être déverrouillé :
Traduit de l’anglais par MetaQuotes Ltd.
Article original : https://www.mql5.com/en/articles/88
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation