MQLによる非同期・マルチスレッドプログラミング

 
mqlのコードを非同期またはマルチスレッドで記述する必要がある。
Pythonのasyncioモジュールから非同期・マルチスレッドコードの記述に慣れている。

ご存知の通り、mqlのEAやスクリプトはすべてシングルスレッドで実行されます。
そのため、若干の混乱があるようです。
mqlに移植されたWinAPIライブラリは、WinAPIでスレッドを操作するための関数を備えています。
これらのマルチスレッド関数をmqlのコードで使用すると、mqlから渡される関数もマルチスレッドになりますか?
また、Expert Advisor/Scriptはデフォルトでシングルスレッドですが、WinAPIでマルチスレッドを使用すると支障はないでしょうか?

もし、mqlのプログラムでWinAPIのマルチスレッドを使用することが可能であれば、mqlでこれらのWinAPIスレッドを処理する方法についてのガイドまたは記事を提案してください。
asyncioの基本原理は理解しているが、mqlの説明例が不足している。
マイクロソフトのヘルプは知っていますが、mqlでWinAPIのフローを使うロジックや、ヘルプに書かれていることが一体何なのか、まだよく理解できていないため、勉強していないのです。
もし、mqlの例や記事があれば、それは素晴らしいことです。
 

試してみてください、当てずっぽうでは意味がありません。関数へのポインタが有効であれば、もしかしたら何かが動くかもしれません。もう一つの質問、つまり新しいスレッドのために標準のµlライブラリを初期化する方法について考えたことはありますか?

例としては、"winapi multithreading "でググれば簡単に出てきます。マルチスレッドプログラミングは別次元で、足がすくむかもしれないことを理解してほしい(もしかしたら、私がいなくても知っているかもしれない)。Pythonは(Pythonで0ですが)この活動のすべての面を明らかにすることができるのか疑問です。まともなマルチスレッド非対応のコードが適当に出てくることはまずないでしょう。

 
Vict:

もう一つの質問、つまり新しいスレッドのために標準のµlライブラリを初期化する方法について考えたことはありますか?

はい、Windows APIから移植された標準的な WinAPIライブラリで、標準的なDLLを介して対話します。
そのため、標準のDLLを初期化する必要があり、そのための関数もWinAPIに移植されています。
C++のDLL初期化の例は、mqlでも動作するはずです。
初期化関数はWindowsのAPIと同じなので、古くない適切な例を探すのが主な問題点です。Google検索が必ずしも正しい結果とは限りません。
このフォーラムにはプロのプログラマーがたくさんいて、初期化、メモリ割り当て、初期化などのコードの断片を見せることができます。
そして、糸との連携も必要です。これまで「記事」欄にこのテーマの記事がないのはとても不思議です。

ビクト

一般的に、あなたは理解する必要があります(多分あなたは私なしでそれを知っている) - マルチスレッドプログラミングは別のレベルであり、あなたは足なしで残すことができます。
Pythonは(Pythonで0ですが)この活動のすべての面を明らかにすることができるのか疑問です。まともなマルチスレッド非対応のコードが適当に出てくることはまずないでしょう。

足がないままというのはどういうことですか?
フローや非同期を適切に働かせれば、障害は発生しないはずです。
それが課題です。mqlでWindows APIのスレッドを正しく使う方法、つまり非同期を学ぶことです。
Pythonでは主に非同期で動作し、すべてうまくいきました。PythonのスレッドではGILのために問題があります。このため、Pythonのスレッドは使わない方が良い。

 
Roman:
mqlのコードを非同期またはマルチスレッドで記述する必要がある。
Pythonのasyncioモジュールから非同期・マルチスレッドコードの記述に慣れている。

ご存知の通り、mqlのEAやスクリプトはすべてシングルスレッドで実行されます。
そのため、若干の混乱があるようです。
mqlに移植されたWinAPIライブラリは、WinAPIでスレッドを操作するための関数を備えています。
これらのマルチスレッド関数をmqlのコードで使用すると、mqlから渡される関数もマルチスレッドになりますか?
また、Expert Advisor/Scriptはデフォルトでシングルスレッドですが、WinAPIでマルチスレッドを使用すると支障はないでしょうか?

もし、mqlのプログラムでWinAPIのマルチスレッドを使用することが可能であれば、mqlでこれらのWinAPIスレッドを処理する方法についてのガイドまたは記事を提案してください。
asyncioの基本原理は理解しているが、mqlの説明例が不足している。
マイクロソフトのヘルプは知っていますが、mqlでWinAPIのフローを使うロジックや、ヘルプに書かれていることが一体何なのか、まだよく理解できていないため、勉強していないのです。
もし、mqlの例や記事があれば、それは素晴らしいことです。
mt5はマルチスレッドに対応したopenCLを搭載しています。このテーマに関する記事はこちらからご覧ください。
 

DLLからMQL関数を呼び出すことはできません。

しかし、DLL呼び出しによって複数のスレッドを実行し、その環境でMQL5から独立して動作させることは可能です。

例えば、MQLからデータを用意してどこかに置いたり、DLLに渡したりすると、今度はDLLが複数のスレッドで動作し、追加の関数を通して結果を返します。

 
Roman:

そうです、Windows APIから移植された標準の WinAPIライブラリで、標準のDLLを介して対話するのです。
これに対応して、標準のDLLを初期化する必要がありますが、このための関数もWinAPIに移植されています。

いや、特にμlの標準ライブラリ(例えばそこにある取引関数とか、その他もろもろ)のことを言ったんです。そこにはグローバルなデータがあるはずで、各スレッドが独自のコピーを持っていなければ、CriatTrade()を介した新しいスレッドは適切に初期化されないままです。

足がないままというのはどういうことですか?

レーキはたくさんありますね。しかし、このようなhttps://en.cppreference.com/w/cpp/atomic/memory_order、 読んでも問題がないのであれば、覚悟はできている。
 
MetaQuotes Software Corp.:

しかし、DLLコールを介して複数のスレッドを実行し、その環境でMQL5から独立して動作させることは可能です。

これは、標準の移植されたWinAPIライブラリを使用し、それはちょうど標準のWindowsのDLLを介して動作することを意味するものです。

ビクト

いいえ、正確にはMQL5の標準ライブラリ(取引関数やその他すべて)について話していたのです。そこにグローバルなデータがあり、各スレッドが独自のコピーを持っている必要があります、CREATTrade()を介してあなたの新しいスレッドが適切に初期化されていないままになります。

熊手がたくさん入っています。しかし、このようなhttps://en.cppreference.com/w/cpp/atomic/memory_order、 読んでも問題がないのであれば、問題ないでしょう。

私の知る限り、DLLを初期化するときに、DLLからmqlプログラムに呼び出されるエクスポート関数も初期化することができます。
つまり、これは本題ではなく、問題はそれをどうするかということなのです。上に書いたように、おそらくC++の例もmqlで動くと思いますが、ここではmqlのコード例が参考になるかと思います。
ということで、ポータビリティについて頭を悩ませないためにも、すでにWinAPIを扱われている方がヒントを与えてくれるかもしれません。

追伸
あ、言いたいことはわかりますが、移植されたWinAPIについてであって、mqlの関数についてではありません。
mqlの関数はオブジェクトで初期化するか、DLLに入れて上記のように初期化することができるかもしれません。

 

お互いに理解しあえないもの

しかし、気にすることはありません - µlの内部でCREATTrade()を介してスレッドを作成することはありません、あなたは(スレッドが開始される)関数へのポインタを渡す必要がありますが、上記のように - kukush。

 

すでにMT開発会社の担当者から聞いていることを翻訳します。

MQLからスレッドを作成することはできません。WinAPIでもダメ。

これは、自分でDLLを書くしかないのです。


 
Roman:
mqlのコードを非同期またはマルチスレッドで記述する必要がある。

正しいことではないが、学ぶことは良いことだ

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

お互いに理解できないこと。

しかし、困惑しないでください - µlの内部でCREATTrade()を介してスレッドを作成することはありません、あなたは(スレッドが開始される)関数へのポインタを渡す必要がありますが、上記のように - kukish。

では、この答えはどうでしょう。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQLによる非同期・マルチスレッドプログラミング

メタクォーツ・ソフトウェア株式会社, 2019.07.24 16:31

しかし、DLLコールを介して複数のスレッドを実行することで、その環境でMQL5とは独立して動作させることが可能です。

Victさんのおっしゃる通り、おそらくmql内部で動作するスレッドに問題があるのだと思いますが、私の理解ではCriatTrade()を使ってWinAPIから関数を呼び出すのは問題ないはずです。
mqlの関数ではなく、WinAPIの関数でマルチスレッドが必要なのですが。

理由: