記事"DIY マルチスレッド非同期 MQL5 WebRequest"についてのディスカッション

 

新しい記事 DIY マルチスレッド非同期 MQL5 WebRequest はパブリッシュされました:

この記事では、MQL5 での HTTPリクエストの処理効率を高めることができるライブラリについて説明します。 非ブロッキングモードでの WebRequest の実行は、補助チャートとEAを使用してカスタムイベントを交換し、共有リソースを読み取る追加のスレッドで実装されます。 ソースコードも同様に適用されます。

トレードアルゴリズムの実装では、多くの場合、インターネットを含むさまざまな外部ソースからのデータを分析する必要があります。 MQL5 は、HTTPリクエストを "外部" に送信するためのWebRequest関数がありますが、残念ながら、ある顕著な欠点があります。 この関数は同期的であり、リクエストの実行の全期間にわたってEA操作をブロックします。 MetaTrader5 では、各EAに対して、コード内の既存の API 関数呼び出しと、受信イベントハンドラ (ティック、BookEvent、タイマー、トレード操作、チャートイベントなど) を順番に実行する単一のスレッドが割り当てられています。 一度に実行されるコードフラグメントは1つだけですが、残りのすべての "task" は、現在のフラグメントが制御をカーネルに返すまでキューの順番を待ちます。

たとえば、EAがリアルタイムで新しいティックを処理し、1つまたは複数のウェブサイトで定期的に経済ニュースをチェックする場合、両方の要件を満たすことは不可能であり、互いに干渉することはありません。 WebRequest がコード内で実行されるとすぐに、EAは関数呼び出し文字列に対して「フリーズ」したままになり、新しいティックイベントはスキップされます。 CopyTicks 関数を使用してスキップされたティックを読み取ることができる場合でも、トレード決定を下すためのモーメントが失われる可能性があります。 UML シーケンス図を使用して、この状況を示す方法を次に示します。

1つのスレッドでのブロッキングコードを特徴とするイベント処理シーケンス図

図1. 1つのスレッドでのブロッキングコードを特徴とするイベント処理シーケンス図

作者: Stanislav Korotky