非同期マルチスレッド計算を活用した擬似インジケーターのデモ - MetaTrader 5用

Mike 2020.01.17 05:13 27 0 0
添付ファイル

このインジケーターは、バッファを持たない擬似インジケーターです。その目的は、マルチスレッド計算技術をデモンストレーションすることにあります。このインジケーターは、別スレッドで行われる長時間の計算を実行するためのコマンドを発行します。これらのスレッドは、ワーカーEA(エキスパートアドバイザー)を持つチャートオブジェクトに作成されます。付属のヘッダーファイルMultiThreadedObjectWorker.mqhに含まれているクラスは、自動的にチャートオブジェクトを作成し、各オブジェクトに指定されたワーカーEAのテンプレートを適用します。計算が完了すると、オブジェクトは自動的にチャートから削除されます。

この例は、プログラミングのバックグラウンドを持つユーザー向けです。

このアイデアは、マルチスレッド非同期Webリクエストに関する記事から得たものです。メッセージ(イベント)がどのように配信され、リソースがチャート間でデータを渡すためにどのように使用されるかの技術的詳細は、記事を参照してください。

このインジケーターは、フル機能のチャートウィンドウの代わりにチャートオブジェクトを使用することで、記事よりも「コンパクトな」実装を利用しています。詳細はフォーラムで確認できます。

インジケーターMultiThreadedIndicatorをコンパイルして実行する前に、ワーカーEAMultiThreadedObjectWorkerがコンパイルされていることを確認してください。

入力パラメーター

  • sinput int _Cores = 1; - 使用するスレッド数(物理コア数を超えないようにしてください)
  • sinput int _Tasks = 1; - 並列で実行する擬似タスクの数(パフォーマンスを確認するためにコア数より大きな数を使用してください)
  • input string MultiThreadedScriptPath = "Experts\MultiThreadedObjectWorker.ex5"; - ワーカーEAのパスを指定する必要があります

各擬似タスクは、デモ目的で一連の平方根関数を計算します。これは、あなたのMQLプロジェクトで時間のかかる他のアルゴリズムに変更できます。

インジケーターがチャートにアタッチされた後、並列計算を開始するには、チャートをクリックしてください。プロセスの重要なフェーズ(クライアントおよびワーカーのMQL5プログラムの両方)は、ログに記録されます。

並列計算リクエストを発行するクライアントMQLプログラムは、インジケーターだけでなく、エキスパートアドバイザーでも構いません。スクリプトやサービスはプラットフォームによってサポートされていません。

ヘッダーファイルMultiThreadedObjectWorker.mqhを使用して、MQL5クライアントとワーカーEA間のデータマシャリングを実装する必要があります。

以下は、ログの2つの例です。

2コアでの4タスクの実行(2スレッドの並列)

2コアでの4タスクの実行(2スレッドの並列)

2コアで4タスクを実行すると、2つの並列スレッドがあり、1コアでの実行速度の2倍になります(上の3354msと下の6240msを比較してください)。

1コアでの4タスクの実行(シングルスレッド - 標準MQLプログラム)

1コアでの4タスクの実行(シングルスレッド - 標準MQLプログラム)

コアが多いほど、速度も上がります。

リスト
コメント 0