Programmation asynchrone et multithread dans MQL

 
Il est nécessaire d'écrire du code mql en mode asynchrone ou multithread.
Je suis familiarisé avec l'écriture de code asynchrone et multithread à partir du module asyncio de Python.

Comme vous le savez, tous les EAs et les scripts dans mql sont exécutés dans un seul thread.
Par conséquent, il y a une certaine confusion à ce sujet.
La bibliothèque WinAPI portée sur mql possède des fonctions pour travailler avec les threads via WinAPI.
Si j'utilise ces fonctions multithreading dans mon code mql, alors les fonctions mql passées seront également multithreading ?
Et le script/conseiller expert est mono-threading par défaut, cela ne va-t-il pas gêner l'utilisation du multithreading dans WinAPI ?

S'il est possible d'utiliser le multithreading WinAPI dans les programmes mql, veuillez me suggérer un guide ou des articles sur la façon de gérer ces threads WinAPI dans mql.
Je comprends le principe de base d'asyncio, mais il me manque les exemples illustratifs pour mql.
Je connais l'aide de Microsoft, mais je ne l'ai pas étudiée, car je n'ai toujours pas bien compris la logique de l'utilisation du flux WinAPI dans mql, et ce que l'on trouve exactement dans l'aide.
Indiquez-moi la bonne direction, s'il y a des exemples ou des articles pour mql, ce serait génial.
 

Essayez-le, il ne sert à rien de deviner. Si les pointeurs vers les fonctions sont valides, peut-être que quelque chose fonctionnera. Avez-vous pensé à une autre question - comment initialiser la bibliothèque µl standard pour un nouveau fil ?

Des exemples sont faciles à trouver sur Google - "winapi multithreading". Vous devez comprendre (peut-être le savez-vous sans moi) que la programmation multithread est un autre niveau, vous pouvez perdre vos jambes. Je doute que Python (bien que je sois 0 en Python) puisse révéler tous les aspects de cette activité. Il est peu probable d'obtenir un non-code multithread décent au hasard.

 
Vict:

Avez-vous pensé à une autre question - comment initialiser la bibliothèque µl standard pour un nouveau fil ?

Oui, la bibliothèque standard WinAPI, portée depuis l'API Windows, qui interagit via une dll standard.
En conséquence, la dll standard doit être initialisée, et pour cela, les fonctions de WinAPI sont également portées.
Les exemples en C++ pour l'initialisation des dll devraient pouvoir fonctionner en mql également.
Comme les fonctions d'initialisation sont les mêmes que celles de l'API Windows, l'essentiel est de trouver les bons exemples qui ne sont pas dépassés, c'est là le problème. Une recherche sur Google ne donne pas toujours le bon résultat.
Il y a beaucoup de programmeurs professionnels sur ce forum, ils peuvent vous montrer un morceau de code, comment le faire correctement - initialisation, allocation de mémoire, désinitialisation, etc.
Et ensuite, il faut travailler avec des fils. Il est très étrange qu'il n'y ait pas d'article sur ce sujet dans la section "Articles" jusqu'à présent.

Vict :

En général, vous devez comprendre (peut-être le savez-vous sans moi) - la programmation multithread est un autre niveau, vous pouvez être laissé sans jambes.
Je doute que Python (bien que je sois 0 en Python) puisse révéler toutes les facettes de cette activité. Il est peu probable d'obtenir un non-code multithread décent au hasard.

Que voulez-vous dire par "laissé sans jambes" ?
Si vous travaillez correctement avec les flux ou l'asynchronie, il ne devrait pas y avoir de handicap.
C'est le défi, apprendre à utiliser correctement les threads de l'API Windows dans mql, ou async.
En Python, j'ai surtout travaillé avec l'asynchronisme, tout se passe bien, mais avec les threads en Python, à cause de la GIL, il y a des problèmes. Pour cette raison, il est préférable de ne pas utiliser les threads en Python.

 
Roman:
Il est nécessaire d'écrire du code mql en mode asynchrone ou multithread.
Je suis familiarisé avec l'écriture de code asynchrone et multithread à partir du module asyncio de Python.

Comme vous le savez, tous les EAs et les scripts dans mql sont exécutés dans un seul thread.
Par conséquent, il y a une certaine confusion à ce sujet.
La bibliothèque WinAPI portée sur mql possède des fonctions pour travailler avec les threads via WinAPI.
Si j'utilise ces fonctions multithreading dans mon code mql, alors les fonctions mql passées seront également multithreading ?
Et le script/conseiller expert est mono-threading par défaut, cela ne va-t-il pas gêner l'utilisation du multithreading dans WinAPI ?

S'il est possible d'utiliser le multithreading WinAPI dans les programmes mql, veuillez me suggérer un guide ou des articles sur la façon de gérer ces threads WinAPI dans mql.
Je comprends le principe de base d'asyncio, mais il me manque les exemples illustratifs pour mql.
Je connais l'aide de Microsoft, mais je ne l'ai pas étudiée, car je n'ai toujours pas bien compris la logique de l'utilisation du flux WinAPI dans mql, et ce que l'on trouve exactement dans l'aide.
Indiquez-moi la bonne direction, s'il y a des exemples ou des articles pour mql, ce serait génial.
mt5 a un openCL pour le multithreading. Vous trouverez des articles sur ce sujet ici.
 

Vous ne pouvez pas appeler les fonctions MQL à partir d'une DLL.

Mais il est possible d'exécuter plusieurs threads par le biais d'appels DLL, de sorte qu'ils fonctionnent indépendamment de MQL5 dans leur environnement.

Par exemple, vous préparez les données à partir de MQL et les placez quelque part ou les passez à la DLL, qui à son tour travaillera avec plusieurs threads et renverra le résultat via une fonction supplémentaire.

 
Roman:

Oui, je l'ai fait, la bibliothèque standard WinAPI, portée depuis l'API Windows, qui interagit via des dlls standard.
En conséquence, les dlls standard doivent être initialisées, et il existe des fonctions portées dans WinAPI à cette fin également.

Non, je parlais spécifiquement de la bibliothèque standard de µl (vous savez, les fonctions de négociation qui s'y trouvent, par exemple, et toutes les autres). Il doit y avoir des données globales, et chaque thread doit avoir sa propre copie, votre nouveau thread via CriatTrade() restera non initialisé correctement.

Que voulez-vous dire par "laissé sans jambes" ?

Il y a beaucoup de râteaux sur le marché. Mais si vous n'avez pas de problème avec une lecture comme celle-ci https://en.cppreference.com/w/cpp/atomic/memory_order, vous êtes prêt.
 
MetaQuotes Software Corp.:

Mais il est possible d'exécuter plusieurs threads via des appels DLL, de sorte qu'ils fonctionnent indépendamment de MQL5 dans leur environnement.

C'est ce dont nous parlons, utilisez la bibliothèque WinAPI standard portée, cela implique simplement de travailler par le biais des dlls standard de Windows.

Vict :

Non, je parlais exactement de la bibliothèque standard de MQL5 (par exemple, les fonctions de trading et tout le reste). Il doit y avoir des données globales à cet endroit et chaque thread doit avoir sa propre copie, votre nouveau thread via CREATTrade() restera non initialisé correctement.

Il y a beaucoup de râteaux là-dedans. Mais si vous n'avez pas de problème avec une lecture comme celle-ci https://en.cppreference.com/w/cpp/atomic/memory_order, vous pouvez y aller.

Pour autant que je sache, lorsque vous initialisez la dll, vous pouvez également initialiser les fonctions exportées qui seront appelées depuis la dll vers le programme mql.
Ce n'est donc pas le problème principal, le problème est de savoir comment le faire. Comme je l'ai écrit plus haut, peut-être que les exemples C++ fonctionneront aussi dans mql, mais j'ai pensé que les exemples de code mql pourraient aider ici.
Pour ne pas me creuser la tête sur la portabilité, peut-être que quelqu'un qui a déjà travaillé avec WinAPI pourra me donner un indice.

p.s.
Ah, je vois ce que vous voulez dire, mais il s'agit de l'interface WinAPI portée, pas des fonctions mql,
peut-être que les fonctions mql pourraient être initialisées par des objets, ou placées dans leur dll et initialisées comme décrit ci-dessus.

 

Quelque chose que nous ne comprenons pas.

Mais ne vous embêtez pas - vous ne créerez pas un thread via CREATTrade() dans µl, vous devez passer un pointeur vers une fonction (où le thread commencera), mais comme indiqué ci-dessus - kukush.

 

Je vais traduire ce qui vous a déjà été dit par un représentant de la société de développement MT :

Vous ne pouvez pas créer de fils à partir de MQL. Pas même avec WinAPI.

Vous ne pouvez le faire qu'en écrivant votre propre DLL.


 
Roman:
Il est nécessaire d'écrire du code mql en mode asynchrone ou multithread.

Ce n'est pas la bonne chose à faire, mais c'est bon d'apprendre.

Многопоточный асинхронный WebRequest на MQL5 своими руками
Многопоточный асинхронный WebRequest на MQL5 своими руками
  • www.mql5.com
Реализация торговых алгоритмов часто требует анализа информации из различных внешних источников, в частности из Internet. MQL5 предоставляет функцию WebRequest для отправки HTTP-запросов во "внешний мир", но она, к сожалению, обладает одним заметным недостатком. Эта функция является синхронной, а потому блокирует работу эксперта на все время...
 
Vict:

Quelque chose qu'on ne comprend pas chez l'autre.

Mais ne vous embourbez pas - vous ne créerez pas un thread via CREATTrade() à l'intérieur de µl, vous devez passer un pointeur vers une fonction (avec laquelle le thread démarrera), mais comme indiqué ci-dessus - kukish.

Et cette réponse, alors ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Programmation asynchrone et multithread dans MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Mais il est possible d'exécuter plusieurs threads via des appels DLL, de sorte qu'ils fonctionnent indépendamment de MQL5 dans leur environnement.

Vict, peut-être que comme vous l'avez décrit, il y a un problème avec les threads travaillant dans mql, mais si je comprends bien, appeler des fonctions depuis WinAPI en utilisant CriatTrade() ne devrait pas être un problème.
J'ai besoin du multithreading avec les fonctions WinAPI, pas avec les fonctions mql.