Discussion de l'article "Le MQL5 Cookbook : Manipulation BookEvent"

 

Un nouvel article Le MQL5 Cookbook : Manipulation BookEvent a été publié :

Cet article considère BookEvent - une profondeur d'événement du marché, et le principe de son traitement. Un programme MQL, gérant les états de Profondeur du marché comme exemple. Il est écrit en utilisant l'approche orientée objet. Les résultats de la manipulation sont affichés à l'écran sous forme de panneau et de niveaux de profondeur de marché.

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

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.

Auteur : Denis Kirichenko

 

Merci pour cet article.

Un petit mot sur l'erreur :

Все программы, работающие по данным стакана, по форме будут являться советниками, ведь обработчик события BookEvent есть только в советниках. Правда, можно сделать связку "советник-индикатор", где истинный индикатор сможет принимать данные от советника и обрабатывать состояние стакана.

Ce n'est pas vrai, l'indicateur peut aussi gérer OnBookEvent.

 

angevoyageur:

Un peu d'information sur l'erreur :

Ce n'est pas vrai, l'indicateur peut aussi gérer OnBookEvent.

Alain, merci pour le message. Oui, c'est vrai, je me suis trompé. Cela fonctionne aussi dans les indicateurs... Je me suis fié à la liste des handlers lors de la création d'un indicateur, parmi lesquels il n'y a pas OnBookEvent().

Et le plus important, c'est que la documentation dit :

La fonction OnBookEvent() est un gestionnaire de l'événement BookEvent. L'événement BookEvent n' est généré que pour les Expert Advisors lorsque l'état de la profondeur du marché change.


 
denkir :

Alain, merci pour le message. Oui, c'est vrai, je me suis trompé. Cela fonctionne aussi dans les indicateurs... Je me suis fié à la liste des handlers lors de la création d'un indicateur, parmi lesquels il n'y a pas de OnBookEvent().

Et le plus important, c'est que la documentation le dit :

C'est vrai, la documentation devrait être corrigée. Avez-vous écrit au ServiceDesk à ce sujet ?
 
angevoyageur:
C'est vrai, la documentation doit être corrigée. Etes-vous en train d'écrire au ServiceDesk à ce sujet ?
Non, je n'en ai pas encore écrit... Je le ferai et j'apporterai des modifications à l'article...
 

Juste pour information, il y a une petite erreur dans cet article :

All programs working with Depth of Market data will have a form of an Expert Advisor, as only Expert Advisors feature the event handler of BookEvent. There is a possibility, however, to write an "Expert-Indicator" pair , where the indicator can receive data from the EA and process the Depth of Market state.

Ce n'est pas vrai, les indicateurs peuvent aussi traiter les BookEvent. Cette erreur est basée sur une erreur de documentation et devrait être corrigée prochainement. L'auteur de l'article et le ServiceDesk ont été contactés.

 

Bonjour, merci pour cet article, très utile !

une question, disons que je traite l'événement BookEvent, et que mon handler va supprimer, passer des commandes, qui à leur tour vont à nouveau initier cet événement..... alors au moment où la date limite pour passer (supprimer les commandes) et un nouvel événement BookEvent se forme à nouveau, ma procédure très initiale va être interrompue ? car j'ai remarqué que l'exécution du code n'arrive pas à la fin.... tout n'est pas exécuté ... J'espère avoir été clair ))

 
thejobber:

Bonjour, merci pour cet article, très utile !

une question, disons que je traite l'événement BookEvent, et que mon handler va supprimer, passer des commandes, qui à leur tour vont à nouveau initier cet événement..... alors au moment où la date limite pour passer (supprimer les commandes) et un nouvel événement BookEvent se forme à nouveau, ma procédure très initiale va être interrompue ? car j'ai remarqué que l'exécution du code n'arrive pas à la fin.... tout n'est pas exécuté ... J'espère avoir été clair ))

Merci pour votre avis !

Non, pendant le traitement d'un événement, le contrôle du programme n'est pas automatiquement transféré à un autre gestionnaire lorsqu'un nouvel événement est généré... vous pouvez le vérifier avec la fonction Print() ( et il est préférable d'ajouter une pause Sleep()).

Il existe un concept de "file d'attente d'événements".

D'après la documentation:

Le programme ne reçoit des événements que du graphique sur lequel il s'exécute. Tous les événements sont traités l'un après l'autre dans l'ordre de réception. S'il existe déjà un événement NewTick dans la file d'attente ou si cet événement est en cours de traitement, le nouvel événement NewTick n'est pas placé dans la file d'attente du programme mql5. De même, si la file d'attente du programme mql5 contient déjà un événement ChartEvent ou si cet événement est en cours de traitement, un nouvel événement de ce type n'est pas placé dans la file d'attente. Les événements Timer sont traités selon le même schéma : si un événement Timer se trouve dans la file d'attente ou est déjà traité, un nouvel événement Timer n'est pas mis en file d'attente.

Les files d'attente d'événements ont une taille limitée mais suffisante, de sorte qu'un débordement de la file d'attente est peu probable pour un programme correctement écrit. Si la file d'attente déborde, les nouveaux événements sont rejetés sans être mis en file d'attente.

 

Les files d'attente d'événements ont une taille limitée mais suffisante, de sorte qu'un débordement de la file d'attente est peu probable pour un programme correctement écrit. Lorsque la file d'attente déborde, les nouveaux événements sont rejetés sans être mis en file d'attente.

Mes craintes ne sont donc pas infondées après tout )) J'ai écrit un spreader pour les contrats à terme sur le dollar américain afin de conserver les meilleurs prix dans la pile en permanence.... alors il y aura certainement un débordement de la file d'attente, parce que le pari est mis à jour un grand nombre de fois par seconde, et c'est sans le fait que j'y ai aussi mis quelque chose, effacé... et avec moi ce ne sera certainement pas dans time..... et ce n'est que de la démo... et sur le vrai marché il y a un pari fou))

merci d'avoir orienté mes pensées dans la bonne direction )

 

Bonjour. Article très instructif. J'ai la question suivante.

Il existe une tâche consistant à filtrer les transactions exécutées sur un instrument en fonction du type d'ordre avec lequel elles ont été exécutées (marché/limité).

Comment puis-je lier les événements OnBookEvent et OnTick pour résoudre cette tâche, c'est-à-dire comment puis-je déterminer quels types d'ordres ont été impliqués dans la transaction ? D'après ce que j'ai compris, cette tâche ne peut pas être résolue uniquement au moyen de l'événement OnBookEvent.

 

Rubick:

...Comment lier les événements OnBookEvent et OnTick pour résoudre ce problème, c'est-à-dire comment déterminer quels types d'ordres ont été impliqués dans la transaction ? Pour autant que je sache, une telle tâche ne peut pas être résolue uniquement au moyen de OnBookEvent.

Vous n'avez probablement pas besoin d'un verre, mais d'un gestionnaire d'opérations de marché.