Programmation asynchrone et multithread dans MQL - page 26

 
Vladimir Simakov:
La synchronisation est la tâche du programmeur, si vous ne savez pas comment faire, vous n'utilisez pas le multithreading. La tâche des créateurs est de donner un outil, et là chacun est un méchant Pinocchio pour lui-même. La même chose à la mutex n'est pas un problème à mettre en œuvre par vous-même.

Malheureusement, ce n'est pas le cas, le public cible de MQL - qui ? (à mon avis, les programmeurs d'applications qui connaissent les bases de la programmation).

Et ce sera toujours MQL5 (les développeurs ont dit à plusieurs reprises qu'il n'y aura plus de mises à jour de MQL4).

MQL5 lui-même fonctionne initialement en mode asynchrone - une demande de données historiques (par exemple, il retournera les données ou commencera à paginer en arrière-plan et retournera une erreur). De cette façon, tout fonctionne en ce qui concerne l'échange de données entre le terminal et le programme MQL,

et ces moments laissent déjà perplexe, car au lieu de renvoyer des valeurs, il faut constamment vérifier la disponibilité des données et ainsi de suite..... lors de la conversion de MQL4, ce n'est vraiment pas pratique


et voici un autre sujet, prenons une structure simple de programme MQL et entrons différents événements de manière asynchrone.... qui en sera le destinataire ? - qui sera l'utilisateur final de ces fonctionnalités nécessaires ?

;)

 
Andrey Barinov:

L'interface graphique doit tourner dans l'EA principale et tout le reste dans une EA séparée. Cet EA esclave séparé est placé sur OBJ_CHART invisible et interagit avec le chemin principal EventSendCustom().

Je ne sais pas comment c'est maintenant. Il semble qu'auparavant, seuls les scripts étaient exécutés sur OBJ_CHART. Il y avait une autre particularité avec les paramètres d'entrée.

J'ai essayé de demander les barres de tous les symboles de Market Watch. L'histoire pour tous est téléchargée. Des dizaines de secondes de passage d'un cycle ! Je ne suis pas satisfait de MT5, c'est le moins qu'on puisse dire.
 
fxsaber:

Je ne sais pas comment c'est maintenant. Auparavant, il semblait que seuls les scripts fonctionnaient sur OBJ_CHART. Il y avait une autre particularité avec les paramètres d'entrée.

J'ai essayé de demander les barres de tous les symboles de Market Watch. Historique sur tous les téléchargements. Des dizaines de secondes de passage d'un cycle ! Je ne suis pas satisfait de MT5, c'est le moins qu'on puisse dire.

Les Expert Advisors fonctionnent, mais ni les ticks ni le timer ne fonctionnent. La seule façon de tout faire fonctionner est de passer par OnChartEvent (les ticks et le timer peuvent être passés là depuis l'EA principal).

Je n'ai pas remarqué d'autres limitations. Tout fonctionne.

Mais vous pouvez faire de même sur un graphique régulier selon le même principe. (Dans MT4, je l'ai fait de cette façon, car il n'y a pas deOBJ_CHART ici).
 
Andrey Barinov:

Les conseillers sont lancés, mais ni les ticks ni le timer ne fonctionnent à cet endroit. Seul OnChartEvent peut être utilisé pour tout démarrer (et les ticks et le timer peuvent y être envoyés depuis l'EA principal).

Je n'ai pas remarqué d'autres limitations. Tout fonctionne.

C'est cool. Je n'étais pas au courant de cette possibilité. Pourquoi ne pas mettre le gui dans l'indicateur et interagir via les ressources ? Je l'ai comme ça. L'EventChartCustom() envoie jusqu'à 128 symboles, un double et un long à la fois et il arrive dans la file d'attente OnChartEvent(). Dans les ressources, vous pouvez placer n'importe quels caractères et valeurs de n'importe quel type via les unités. Et il ne fait pas la queue. Vous l'obtenez quand vous en avez besoin.
 
Реter Konow:
C'est cool. Je n'étais pas au courant de cette possibilité. Pourquoi ne pas mettre le gui en indicateur et utiliser les ressources pour la communication ? Je l'ai comme ça. L'EventChartCustom() envoie jusqu'à 128 symboles, un double et un long à la fois et il arrive dans la file d'attente OnChartEvent(). Dans les ressources, vous pouvez placer n'importe quels caractères et valeurs de n'importe quel type via les unités. Et il ne fait pas la queue. Vous l'obtenez quand vous en avez besoin.

Merci, je ne connaissais pas le OnChartEvent. Effectuez-vous la synchronisation par le biais d'événements personnalisés ? Échange de données ?

 
Реter Konow:
C'est cool. Je ne connaissais pas cette fonctionnalité. Pourquoi ne pas mettre le gui en indicateur et utiliser les ressources ? Je l'ai comme ça. L'EventChartCustom() envoie jusqu'à 128 symboles, un double et un long à la fois et il arrive dans la file d'attente OnChartEvent(). Dans les ressources, vous pouvez placer n'importe quels caractères et valeurs de n'importe quel type via les unités. Et il ne fait pas la queue. Vous l'obtenez quand vous en avez besoin.

Je ne passe pas de données par OnChartEvent. Uniquement des événements. Sinon, il n'y a pas d'événements dans l'agent EA, et de cette façon il reçoit ONTIMER_BEAT et ONTICK_BEAT.

Les données peuvent être échangées soit via un fichier, soit via des ressources, en fonction de la tâche. J'utilise plus souvent les fichiers, car ils sont également utilisés pour restaurer l'interface graphique et tout le reste après le redémarrage du terminal.

Votre interface graphique est-elle capable de se souvenir et de restaurer son apparence après le redémarrage du terminal ?

 
fxsaber:

Merci, je ne connaissais pas le OnChartEvent. Effectuez-vous la synchronisation par le biais d'événements personnalisés ? Échange de données ?

Chaque message de chaque côté a un numéro de séquence. Lorsque la partie A envoie un message à la partie B, elle cherche d'abord à savoir si le message précédent a été lu. Dans le cas contraire, il n'en envoie pas un nouveau. Lorsque la partie B envoie un message à la partie A, elle cherche également à savoir si le message précédent a été lu.
 
Andrey Barinov:

Je ne passe pas de données par OnChartEvent. Uniquement des événements. Sinon, il n'y a pas d'événements dans l'agent EA, et de cette façon il reçoit ONTIMER_BEAT et ONTICK_BEAT.

Les données peuvent être échangées soit via un fichier, soit via des ressources, en fonction de la tâche. J'utilise plus souvent les fichiers, car ils sont également utilisés pour restaurer l'interface graphique et tout le reste après le redémarrage du terminal.

Votre interface graphique est-elle capable de se souvenir et de restaurer son image après le redémarrage du terminal ?

Je suggérerais de supprimer complètement la fonction EventChartCustom(), précisément à cause de la file d'attente, qui peut parfois provoquer des blocages. Interagir à travers les ressources en faisant des demandes bidirectionnelles à la fréquence du minuteur. Par exemple, si le côté A est fortement chargé avec OnChartEvent() et que le côté B envoie un événement de bouton d'annulation, le côté A peut recevoir cet événement en retard à cause d'une absurdité qui le charge.

Oui, je sauvegarde le noyau dans le fichier et je le charge à partir du fichier. Dans ce cas, tous les paramètres et l'apparence sont ramenés à la dernière vue après le redémarrage. Mais, en général, après le redémarrage, j'ai besoin des paramètres de démarrage, donc je n'utilise pas cette fonction.

 
Реter Konow:

Je suggérerais de supprimer complètement la fonction EventChartCustom(), précisément à cause de la file d'attente, qui peut parfois provoquer des ralentissements. Interagir à travers les ressources en faisant des demandes bidirectionnelles à la fréquence du minuteur . Par exemple, si la face A est fortement chargée avec OnChartEvent() et que la face B envoie un événement de bouton d'annulation, la face A peut recevoir cet événement en retard à cause d'une absurdité qui la charge.

La minuterie ne fonctionne pas dans l'EA qui est sur OBJ_CHART. Il n'y a AUCUN EVENEMENT à cet endroit (sauf OnChartEvent). Par conséquent, nous devons envoyer tous lesévénements (OnTick, OnTimer etc) à partir de l'EA principal.

De plus, je n'y envoie pas de boutons. Il n'y a pas besoin de ça.
 
Andrey Barinov:

La minuterie ne fonctionne pas dans l'EA qui est sur OBJ_CHART. Il n'y a AUCUN EVENEMENT à cet endroit (sauf OnChartEvent). Par conséquent, tous les événements (OnTick, OnTimer etc.) doivent y être envoyés depuis l'EA principal.

De plus, je n'envoie pas de boutons dans les deux sens. Il n'y a pas besoin de ça.

Je propose d'utiliser l'indicateur comme support de l'interface graphique, et les ressources comme lien vers l'EA. En outre, dans MT4, vous serez en mesure de contrôler le testeur Expert Advisor à partir d'un graphique standard en utilisant le panneau. Toutes les commandes fonctionneront, pas seulement les boutons. Vous pourrez envoyer du texte et n'importe quoi d'autre à l'EA en cours de test. Je l'ai déjà testé. Tout fonctionne.

ZS. Et l'EA testé enverra des données différentes au graphique régulier.

Raison: