Asynchrone und mehrfädige Programmierung in MQL

 
Es besteht die Notwendigkeit, mql-Code im asynchronen oder Multithreading-Modus zu schreiben.
Ich bin vertraut mit asynchronem und Multithreading-Code, den ich mit dem asyncio-Modul von Python schreibe.

Wie Sie wissen, werden alle EAs und Skripte in mql in einem einzigen Thread ausgeführt.
Daher gibt es einige Verwirrung darüber.
Die auf mql portierte WinAPI-Bibliothek verfügt über Funktionen für die Arbeit mit Threads über WinAPI.
Wenn ich diese Multi-Threading-Funktionen in meinem mql-Code verwende, werden dann die an mql übergebenen Funktionen ebenfalls Multi-Threading-fähig sein?
Und der Expert Advisor/Script ist standardmäßig Single-Threading-fähig, ist es dann nicht hinderlich, Multi-Threading in WinAPI zu verwenden?

Wenn es möglich ist, WinAPI-Multithreading in mql-Programmen zu verwenden, schlagen Sie mir bitte eine Anleitung oder Artikel vor, wie man diese WinAPI-Threads in mql handhabt.
Ich verstehe das Grundprinzip von asyncio, aber mir fehlen die anschaulichen Beispiele für mql.
Ich kenne die Microsoft-Hilfe, habe sie aber nicht studiert, weil ich die Logik der Verwendung des WinAPI-Flusses in mql noch nicht ganz verstanden habe und nicht weiß, was genau in der Hilfe zu finden ist.
Zeigen Sie mir die richtige Richtung, wenn es irgendwelche Beispiele oder Artikel für mql gibt, wäre das großartig.
 

Probieren Sie es aus, es hat keinen Sinn, zu raten. Wenn die Verweise auf die Funktionen gültig sind, wird vielleicht etwas funktionieren. Haben Sie über eine andere Frage nachgedacht - wie initialisiert man die µl-Standardbibliothek für einen neuen Thread?

Beispiele sind leicht zu googeln - "winapi multithreading". Sie sollten verstehen (vielleicht wissen Sie es auch ohne mich), dass die Multithreading-Programmierung eine andere Ebene ist, auf der Sie Ihre Beine verlieren können. Ich bezweifle, dass Python (obwohl ich 0 in Python bin) alle Seiten dieser Tätigkeit aufdecken könnte. Es ist unwahrscheinlich, dass man zufällig einen anständigen Multithreading-Nicht-Code erhält.

 
Vict:

Haben Sie über eine andere Frage nachgedacht - wie initialisiert man die µl-Standardbibliothek für einen neuen Thread?

Ja, die Standard-WinAPI-Bibliothek, portiert von der Windows-API, die über Standard-DLLs interagiert.
Dementsprechend muss die Standard-DLL initialisiert werden, und dafür sind in der WinAPI auch Funktionen portiert.
Die Beispiele in C++ für die Initialisierung von DLLs sollten auch in MQL funktionieren.
Da die Initialisierungsfunktionen die gleichen sind wie in der Windows-API, besteht das Problem darin, die richtigen Beispiele zu finden, die nicht veraltet sind. Eine Google-Suche ist nicht immer das richtige Ergebnis.
Es gibt viele professionelle Programmierer in diesem Forum, die Ihnen ein Stück Code zeigen können, wie man es richtig macht - Initialisierung, Speicherzuweisung, Deinitialisierung, usw.
Und dann muss man mit Fäden arbeiten. Es ist sehr merkwürdig, dass es bisher keinen Artikel zu diesem Thema in der Rubrik "Artikel" gibt.

Sieg:

Im Allgemeinen müssen Sie verstehen (vielleicht wissen Sie es ohne mich) - multithreaded Programmierung ist eine andere Ebene, können Sie ohne Beine gelassen werden.
Ich bezweifle, dass Python (obwohl ich 0 in Python bin) alle Seiten dieser Tätigkeit aufdecken könnte. Es ist unwahrscheinlich, dass man zufällig einen anständigen Multithreading-Nicht-Code erhält.

Was meinen Sie mit "links ohne Beine"?
Wenn Sie richtig mit Flows oder Asynchronität arbeiten, sollte es keine Behinderungen geben.
Das ist die Herausforderung, zu lernen, wie man Windows-API-Threads in mql oder async richtig verwendet.
In Python habe ich meist mit async gearbeitet, alles läuft gut, mit Threads in Python gibt es wegen GIL Probleme. Aus diesem Grund sollten Threads in Python besser nicht verwendet werden.

 
Roman:
Es besteht die Notwendigkeit, mql-Code im asynchronen oder Multithreading-Modus zu schreiben.
Ich bin vertraut mit asynchronem und Multithreading-Code, den ich mit dem asyncio-Modul von Python schreibe.

Wie Sie wissen, werden alle mql-Experten und -Skripte in einem einzigen Thread ausgeführt.
Daher gibt es einige Verwirrung darüber.
Die auf mql portierte WinAPI-Bibliothek verfügt über Funktionen für die Arbeit mit Threads über WinAPI.
Wenn ich diese Multi-Threading-Funktionen in meinem mql-Code verwende, werden dann die an mql übergebenen Funktionen ebenfalls Multi-Threading-fähig sein?
Und der Expert Advisor/Script ist standardmäßig Single-Threading-fähig, ist es dann nicht hinderlich, Multi-Threading in WinAPI zu verwenden?

Wenn es möglich ist, WinAPI-Multithreading in mql-Programmen zu verwenden, schlagen Sie mir bitte eine Anleitung oder Artikel vor, wie man diese WinAPI-Threads in mql handhabt.
Ich verstehe das Grundprinzip von asyncio, aber mir fehlen die anschaulichen Beispiele für mql.
Ich kenne die Microsoft-Hilfe, habe sie aber nicht studiert, weil ich die Logik der Verwendung des WinAPI-Flows in mql immer noch nicht ganz verstanden habe und nicht weiß, was genau in der Hilfe zu finden ist.
Zeigen Sie mir die richtige Richtung, wenn es irgendwelche Beispiele oder Artikel für mql gibt, wäre das großartig.
mt5 hat ein openCL für Multithreading. Hier finden Sie Artikel zu diesem Thema.
 

Sie können MQL-Funktionen nicht von einer DLL aus aufrufen.

Es ist jedoch möglich, mehrere Threads über DLL-Aufrufe laufen zu lassen, so dass sie unabhängig von MQL5 in ihrer Umgebung arbeiten können.

Von MQL aus bereiten Sie zum Beispiel Daten vor, platzieren sie irgendwo oder übergeben sie an eine DLL, die wiederum mit mehreren Threads arbeitet und das Ergebnis über eine zusätzliche Funktion zurückgibt.

 
Roman:

Ja, das habe ich, die Standard-WinAPI-Bibliothek, portiert von der Windows-API, die über Standard-DLLs interagiert.
Dementsprechend müssen die Standard-Dlls initialisiert werden, und auch dafür gibt es portierte Funktionen in WinAPI.

Nein, ich habe speziell über die Standard-µl-Bibliothek gesprochen (Sie wissen schon, die Handelsfunktionen dort und alle anderen). Es muss dort globale Daten geben, und jeder Thread muss seine eigene Kopie haben, damit Ihr neuer Thread über CriatTrade() ordnungsgemäß uninitialisiert bleibt.

Was meinen Sie mit "links ohne Beine"?

Es gibt eine Vielzahl von Schwadern. Aber wenn Sie kein Problem mit einer Lektüre wie dieser https://en.cppreference.com/w/cpp/atomic/memory_order haben , sind Sie bereit.
 
MetaQuotes Software Corp.:

Es ist jedoch möglich, mehrere Threads über DLL-Aufrufe laufen zu lassen, so dass sie unabhängig von MQL5 in ihrer Umgebung arbeiten.

Dies ist, was wir reden, verwenden Sie die Standard portiert WinAPI-Bibliothek, es impliziert nur durch Standard-Windows-DLLs arbeiten.

Sieg:

Nein, ich sprach genau über die Standard-MQL5-Bibliothek (z. B. Handelsfunktionen und der ganze Rest). Es müssen dort globale Daten vorhanden sein und jeder Thread muss seine eigene Kopie haben, damit Ihr neuer Thread über CREATTrade() ordnungsgemäß uninitialisiert bleibt.

Es gibt dort eine Menge Rechen. Aber wenn Sie kein Problem mit einer Lektüre wie dieser https://en.cppreference.com/w/cpp/atomic/memory_order haben , können Sie loslegen.

Soweit ich weiß, können Sie bei der Initialisierung der DLL auch die exportierten Funktionen initialisieren, die von der DLL zum MQL-Programm aufgerufen werden.
Das ist also nicht das Hauptproblem, das Problem ist, wie man es macht. Wie ich oben schrieb, funktionieren die C++-Beispiele vielleicht auch in mql, aber ich dachte, die mql-Codebeispiele könnten hier helfen.
Um mir also nicht den Kopf über die Portabilität zu zerbrechen, kann mir vielleicht jemand, der bereits mit WinAPI gearbeitet hat, ein paar Tipps geben.

p.s.
Ich verstehe, was Sie meinen, aber es geht um die portierte winAPI, nicht um mql-Funktionen,
vielleicht könnten die mql-Funktionen durch Objekte initialisiert werden, oder in ihrer DLL abgelegt und wie oben beschrieben initialisiert werden.

 

Etwas, das wir nicht verstehen.

Aber machen Sie sich keine Mühe - Sie werden keinen Thread über CREATTrade() innerhalb von µl erstellen, Sie müssen einen Zeiger auf eine Funktion übergeben (wo der Thread starten wird), aber wie oben erwähnt - kukush.

 

Ich werde übersetzen, was Ihnen bereits von einem Vertreter der MT-Entwicklungsgesellschaft mitgeteilt wurde:

Sie können keine Threads von MQL aus erstellen. Nicht einmal mit WinAPI.

Sie können dies nur tun, indem Sie Ihre eigene DLL schreiben.


 
Roman:
Es besteht die Notwendigkeit, mql-Code im asynchronen oder Multithreading-Modus zu schreiben.

Natürlich nicht das, was Sie brauchen, aber Sie können daraus lernen

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

Das ist etwas, was wir aneinander nicht verstehen.

Aber verzetteln Sie sich nicht - Sie werden keinen Thread über CREATTrade() innerhalb von µl erstellen, Sie müssen einen Zeiger auf eine Funktion übergeben (mit der der Thread gestartet wird), aber wie oben erwähnt - kukish.

Wie steht es dann mit dieser Antwort?

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Asynchrone und Multithreading-Programmierung in MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Es ist jedoch möglich, mehrere Threads über DLL-Aufrufe laufen zu lassen, so dass sie unabhängig von MQL5 in ihrer Umgebung arbeiten.

Vict, vielleicht, wie Sie beschrieben, gibt es ein Problem mit Threads arbeiten innerhalb mql, aber wie ich verstehe, Aufruf von Funktionen aus WinAPI mit CriatTrade() sollte kein Problem sein.
Ich brauche Multithreading mit WinAPI-Funktionen, nicht mit mql-Funktionen.