Le MQL5 Cookbook : Manipulation BookEvent
Introduction
Comme on le sait, le terminal de trading MetaTrader 5 est une plate-forme multi-marchés, qui facilite le trading sur le Forex, les marchés boursiers, les contrats à terme et les contrats de différence. Selon les statistiques de la section Freelance, le nombre de traders qui négocient pas seulement sur le marché Forex augmente.
Dans cet article, je voudrais présenter aux programmeurs MQL5 novices la gestion de BookEvent. Cet événement est lié au Profondeur de marché, un instrument de négociation d'actifs boursiers et de leurs dérivés. Cependant, les traders Forex peuvent également trouver la profondeur du marché utile. Dans les comptes ECN, les fournisseurs de liquidités fournissent des données sur les ordres, mais uniquement dans le cadre de leur modèle d'agrégateur. Ces comptes sont de plus en plus populaires.
1. BookEvent
Selon la documentation, cet événement est généré lorsque le statut Profondeur de marché, change. Convenons que BookEvent est un événement Profondeur de marché,.
La Profondeur de marché, est un ensemble d'ordres, qui diffèrent par leur direction (vente et achat), leur prix et leur volume. Les prix en profondeur de marché sont proches de ceux du marché et sont donc considérés comme les meilleurs.
Fig.1 Profondeur du marché dans MetaTrader 5
Dans MetaTrader 5, un «carnet d'ordres» est nommé «Profondeur de marché» (Fig.1). Des informations détaillées sur Profondeur de marché sont disponibles dans le Guide de l'utilisateur du terminal client.
La structure MqlBookInfo fournissant des informations sur le Profondeur de marché doit être mentionnée séparément.
struct MqlBookInfo { ENUM_BOOK_TYPE type; // order type from the ENUM_BOOK_TYPE enumeration double price; // price long volume; // volume };
Il contient trois champs. Les données sur le type de commande, le prix et le volume peuvent être obtenues en traitant la structure de la commande.
2. Gestionnaire d'événements de BookEvent
La fonction de gestion des événements OnBookEvent() prend une constante comme paramètre. C'est une référence à un paramètre de chaîne.
void OnBookEvent (const string& symbol)
Le paramètre de chaîne contient le nom du symbole pour lequel un événement Profondeur de marché a eu lieu.
Le gestionnaire d'événements lui-même nécessite une préparation préalable. Pour que l'EA puisse gérer un événement Profondeur de marché, cet événement doit être souscrit à l'aide de la fonction intégrée MarketBookAdd(). Habituellement, il est situé dans le bloc d'initialisation d'EA. Si un événement Profondeur de marché n'a pas été souscrit, l'EA l'ignorera.
Offrir la possibilité de se désinscrire de la réception d'événements est considéré comme une bonne pratique de programmation. Lors de la dés-initialisation, il est nécessaire de se désinscrire de la réception de ces données en appelant la fonction MarketBookRelease().
Les mécanismes d'abonnement et de désabonnement de la réception de données sont similaires à la création et au traitement d'un temporisateur, qui doit être activé avant le traitement.
3. Modèle de gestion de BookEvent
Nous allons créer un modèle simple d'EA, qui appelle la fonction OnBookEvent(), et le nommer BookEventProcessor1.mq5.
Le modèle comprend un ensemble minimum de gestionnaires, qui sont des gestionnaires d'initialisation et de dés-initialisation de l'EA, ainsi que le gestionnaire d'événements Profondeur de marché.
Le gestionnaire d'événements Profondeur de marché lui-même est très simple :
//+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { Print("Book event for: "+symbol); //--- select the symbol if(symbol==_Symbol) { //--- array of the DOM structures MqlBookInfo last_bookArray[]; //--- get the book if(MarketBookGet(_Symbol,last_bookArray)) { //--- process book data for(int idx=0;idx<ArraySize(last_bookArray);idx++) { MqlBookInfo curr_info=last_bookArray[idx]; //--- print PrintFormat("Type: %s",EnumToString(curr_info.type)); PrintFormat("Price: %0."+IntegerToString(_Digits)+"f",curr_info.price); PrintFormat("Volume: %d",curr_info.volume); } } } }
Comme cet événement Profondeur de marché est un événement diffusé (après abonnement, il apparaîtra pour tous les symboles), un instrument requis doit être spécifié.
Il convient de noter cependant que dans les dernières versions, des changements ont été introduits dans le travail de Profondeur de marché. Dans la version actuelle (build 975), je n'ai trouvé aucun signe de diffusion. Le gestionnaire n'a été appelé que pour le symbole attribué. Pour prouver ce fait, j'ai simplement arrangé la saisie d'informations dans le «Journal des experts».
Pour ce faire, nous allons utiliser la fonction intégrée MarketBookGet(). Il renverra toutes les informations sur Depth of Market, à savoir le MqlBookInfo, tableau de structures, qui contient les enregistrements Depth of Market pour le symbole spécifié. Il convient de noter que cette matrice variera en taille, en fonction d'un broker.
Le modèle permet d'afficher les valeurs des structures de tableau dans le journal.
L'EA a été lancé pour les contrats à terme SBRF-12.14 en mode débogage. La séquence des enregistrements dans le journal des experts sera la suivante :
EL 0 11:24:32.250 BookEventProcessor1 (SBRF-12.14,M1) Book event for: SBRF-12.14 MF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7708 LJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 6 MP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL HF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7705 LP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 6 MJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL GL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7704 ON 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 MD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL FR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7703 PD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 MN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL DH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7701 QQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 10 GH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL QM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7700 OK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1011 ER 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7698 EE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 50 OM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7696 IO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 21 QG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL LO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7695 MK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1 QQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL KE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7694 QQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 5 QK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL PK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7691 LO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 QE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL HQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7688 OE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 106 MO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL RG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7686 IP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 18 GI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL FL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7684 QI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 GS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL IR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7681 LG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 4 GM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL JH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7680 RM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 GG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL DN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7679 HH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 19 IQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL ED 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7678 EQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1 IK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL OJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7676 DO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 IE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_SELL RP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7675 EE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 1 QR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY LF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7671 LP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 40 QD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY KL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7670 QJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 21 QN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY CR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7669 RD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 20 QP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY DH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7668 NN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 17 QJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY QN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7667 RK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 OL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY DE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7666 MQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 151 QF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY OJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7665 RO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 OH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY FQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7664 EF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 49 OR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY GG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7663 OS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 ED 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY JM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7662 PI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 4 CN 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY ES 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7661 LD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 13 CP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY FI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7660 LM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 2 IJ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7659 II 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 12 IL 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY ME 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7658 IP 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 3 GF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7657 FM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 15 GH 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY MQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7656 DD 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 6 MS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NG 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7655 KR 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 9 KE 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY OM 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7654 IK 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 14 KO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY NS 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7653 DF 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 534 MQ 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Type: BOOK_TYPE_BUY OI 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Price: 7652 IO 0 11:24:33.812 BookEventProcessor1 (SBRF-12.14,M1) Volume: 25
C'est à quoi ressemblait Depth of the Market à un certain moment. Le premier élément de l'éventail des structures est un ordre de vente au prix le plus élevé (7708 roubles). Le dernier élément du tableau est un ordre d'achat au prix le plus bas (7652 Rub). Ainsi, les données de profondeur de marché sont lues dans le tableau de haut en bas.
Pour plus de commodité, j'ai rassemblé les données dans le tableau 1.
Table 1. Profondeur de marché pour SBRF-12.14
Le bloc supérieur surligné en rouge contient les ordres de vente (limites de vente). Le bloc inférieur surligné en vert comprend les ordres d'achat (limites d'achat).
Il est évident que parmi tous les ordres de vente, l'ordre n°6 avait le plus gros volume avec un prix de 7700 Rub et un volume de 1011 lots. L'ordre n°39 avait le volume le plus important de tous les ordres d'achat avec un prix de 7653 roubles et un volume de 534 lots.
Les données source dans Profondeur de marché sont les informations qu'un trader analyse pour élaborer une stratégie de trading. L'idée de trading la plus simple est que la collecte et le regroupement d'ordres avec des volumes importants à des niveaux de prix contigus créent des zones de support et de résistance. Dans la section suivante, nous allons créer un indicateur qui suivra les changements dans la profondeur du marché.
4. Profondeur de marché
Il existe de nombreux indicateurs différents fonctionnant avec les données de profondeur de marché. Vous pouvez en trouver quelques-uns intéressants sur le marché MetaTrader 5. J'aime par-dessus tout IShift. Yury Kulikov, le développeur, a réussi à créer un outil compact et informatif.
Tous les programmes, fonctionnant avec les données de Profondeur de marché, auront la forme d'un Expert Advisor ou d'un indicateur, car seuls ces programmes MQL5 disposent du gestionnaire d'événements BookEvent.
Créons un court programme qui montrera les données de profondeur de marché en direct. Dans un premier temps, nous devons spécifier les données à afficher. Ce sera un panneau, avec des barres horizontales indiquant le volume de la commande. La taille des barres, cependant, sera de nature relative. Le volume maximum de toutes les commandes en cours sera considéré comme 100%. La figure 2 montre que l’ordre au prix de 7507 Rub a le plus gros volume de 519 lots.
Pour une initialisation correcte du panneau, la profondeur exacte du marché ou le nombre de niveaux doit être spécifié (le paramètre « profondeur DOM »). Ce nombre diffère d'un broker à l'autre.
Fig. 2 Panneau de la profondeur de marché
Le code du programme pour le panneau est écrit avec une approche de programmation orientée objet. La classe responsable du fonctionnement du panneau est nommée CBookBarsPanel.
//+------------------------------------------------------------------+ //| Book bars class | //+------------------------------------------------------------------+ class CBookBarsPanel { private: //--- Data members CArrayObj m_obj_arr; uint m_arr_size; //--- uint m_width; uint m_height; //--- Methods public: void CBookBarsPanel(const uint _arr_size); void ~CBookBarsPanel(void){}; //--- bool Init(const uint _width,const uint _height); void Deinit(void){this.m_obj_arr.Clear();}; void Refresh(const MqlBookInfo &_bookArray[]); };
Cette classe contient quatre données membres.
- L'attribut m_obj_arr est un conteneur pour les pointeurs vers les objets de type CObject. Il est utilisé pour stocker les données de profondeur de marché. Une classe distincte sera créée pour ce dernier.
- L'attribut m_arr_size est responsable du nombre de niveaux de profondeur de marché.
- Les attributs m_width et m_height stockent les dimensions du panneau (largeur et hauteur en pixels).
En ce qui concerne les méthodes, leur ensemble en plus du constructeur et du destructeur standard comprend :
- méthode d'initialisation
- méthode de dés-initialisation
- méthode de mise à jour
Nous allons créer la classe CBookRecord distincte pour chaque ligne du panneau (niveau Profondeur de marché en spécifiant le prix, la barre horizontale et le volume.
Il comprendra trois pointeurs. L'un d'eux pointera vers l'objet de type CChartObjectRectLabel (étiquette rectangulaire pour travailler avec une barre horizontale) et deux pointeurs de type CChartObjectLabel (étiquettes de texte pour le prix et le volume).
//+------------------------------------------------------------------+ //| Book record class | //+------------------------------------------------------------------+ class CBookRecord : public CObject { private: //--- Data members CChartObjectRectLabel *m_rect; CChartObjectLabel *m_price; CChartObjectLabel *m_vol; //--- color m_color; //--- Methods public: void CBookRecord(void); void ~CBookRecord(void); bool Create(const string _name,const color _color,const int _X, const int _Y,const int _X_size,const int _Y_size); //--- data bool DataSet(const long _vol,const double _pr,const uint _len); bool DataGet(long &_vol,double &_pr) const; private: string StringVolumeFormat(const long _vol); };
Parmi les méthodes figurent :
- méthode de création d'un enregistrement ;
- méthode de paramétrage des données ;
- méthode de réception des données;
- méthode de formatage des grands nombres.
Ensuite, le gestionnaire de BookEvent pour l'EA et, essentiellement, l'indicateur, se présentera comme suit :
//+------------------------------------------------------------------+ //| BookEvent function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { //--- select the symbol if(symbol==_Symbol) { //--- array of the DOM structures MqlBookInfo last_bookArray[]; //--- get the book if(MarketBookGet(_Symbol,last_bookArray)) //--- refresh panel myPanel.Refresh(last_bookArray); } }
Ainsi, chaque fois que BookEvent est généré, le panneau mettra à jour ses données. Nous allons nommer la version mise à jour du programme BookEventProcessor2.mq5.
Dans la vidéo ci-dessus, vous pouvez voir comment fonctionne l'EA.
Conclusion
Cet article est dédié à un autre événement du Terminal - l'événement Profondeur de marché . Cet événement est souvent au cœur des algorithmes de trading haute fréquence (HFT). Ce type de trading gagne en popularité parmi les traders.
J'espère que les traders commençant à programmer sur MQL5 trouveront utiles les exemples inclus de gestion de l'événement Profondeur de marché. Les fichiers sources joints à cet article sont pratiques à mettre dans le dossier du projet. Dans mon cas, c'est \MQL5\Projects\BookEvent.
Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/1179
- 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