English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Un Gestionnaire de Commande  Virtuelle pour suivre les commandes  dans l'environnement MetaTrader 5 axé sur la position

Un Gestionnaire de Commande Virtuelle pour suivre les commandes dans l'environnement MetaTrader 5 axé sur la position

MetaTrader 5Trading | 17 novembre 2021, 15:18
157 0
Paul
Paul


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 :

  1. 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
  2. Robustesse : traitement élégant des événements anormaux tels que les erreurs, les ruptures de communication client-serveur et les commandes incomplètes.
  3. Facilité d'utilisation : mise à disposition de fonctions de trading simples et bien documentées
  4. 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

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

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. EA VOM multiples

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 de VOM

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

 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 EA s'accordant sur l'orientation

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

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

  1. 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
  2. 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 
  3. 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
  4. 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

Fichiers joints |
vom-doc.zip (727.63 KB)
vom2_0.zip (608.43 KB)
vom-sources.zip (40.33 KB)
Un exemple de système de trading axé sur un indicateur Heiken-Ashi Un exemple de système de trading axé sur un indicateur Heiken-Ashi
Dans cet article, nous examinons la question de l'utilisation d'un indicateur Heiken-Ashi dans le trading. Sur la base de cet indicateur, un système de trading simple est considéré et un conseiller expert MQL5 est écrit. Les opérations de trading sont implémentées sur les bases de classes de la bibliothèque de classes Standard. Les résultats des tests de la stratégie de trading examinée, sont basés sur l'historique et obtenus à l'aide du testeur de stratégie MetaTrader 5 intégré, sont fournis dans l'article.
Création d'un Indicateur Multidevise à l'Aide d'un Certain Nombre de Tampons d'Indicateurs Intermédiaires Création d'un Indicateur Multidevise à l'Aide d'un Certain Nombre de Tampons d'Indicateurs Intermédiaires
Il y a eu récemment un intérêt grandissant pour les analyses de bloc du marché FOREX. MQL5 ouvre de nouveaux horizons de recherche des tendances du mouvement des paires de devises. Une caractéristique clé de MQL5, qui le distingue de MQL4, est la possibilité d'utiliser un nombre illimité de tampons d'indicateurs. Cet article décrit un exemple de création d'un indicateur multi-devises.
Guide d'écriture d'une DLL pour MQL5 en Delphi Guide d'écriture d'une DLL pour MQL5 en Delphi
L'article examine le mécanisme de création d'un module DLL, en utilisant le langage de programmation populaire d' ObjectPascal, dans un environnement de programmation Delphi. La documentation, fournie dans cet article, est conçue pour cibler principalement les programmeurs débutants, qui travaillent avec des problèmes, qui dépassent les limites du langage de programmation intégré de MQL5, en connectant les modules DLL externes.
Migration de MQL4 vers MQL5 Migration de MQL4 vers MQL5
Cet article est un guide rapide des fonctions du langage MQL4, il vous aidera à migrer vos programmes de MQL4 vers MQL5. Pour chaque fonction MQL4 (hors fonctions de trading) la description et l'implémentation MQL5 sont présentées, cela vous permet de réduire considérablement le temps de conversion. Pour plus de commodité, les fonctions MQL4 sont réparties en groupes, similaires à MQL4 Reference.