記事"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

 

相変わらず、強い!もしこのライブラリーが一般化されれば、あらゆる関数の非同期を簡単に作ることができる既製のツールキットを作ることができる。同時にクロスプラットフォーム。

このメソッドは、例えばMT4用のOrderSendAsyncを 作成するために使用できます。

記事をありがとうございました!

 
fxsaber:

相変わらず、強い!もしこのライブラリーが一般化されれば、あらゆる関数の非同期を簡単に作ることができる既製のツールキットを作ることができる。同時にクロスプラットフォームで。

この方法を使えば、例えばMT4用のOrderSendAsyncを作ることができる。

そうそう、ずいぶん前に一度、メッセージのプラグインコマンドを使ったMT4用のグループ注文管理 システムを作り始めたことがあるのだが、まだ完成していなかった。MT4でリソースがどのように機能するかは確認していないが、ドキュメントから判断するとMT5と同じようなものだろう。

 
Stanislav Korotky:

ドキュメントによるとMT5と同じようになるはずですが、MT4でリソースがどのように機能するかは確認していません。

はい、すべてMT5と同じです。現在のMT4のビルドでは、交換を不可能にするバグがあります。

取引、自動取引システム、取引戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber, 2018.09.17 18:38

MT4のResourceReadImageで リソースを読み込めないバグが発生
#property strict

class RESOURCE
{
public:
  const string Name;

  RESOURCE( const string sName = __FILE__ ) : Name("::" + sName )
  {
  }

  ~RESOURCE( void)
  {
    ::ResourceFree(this.Name);
  }

  virtual bool Set( const uint &Data[], const uint Width = 1, const ENUM_COLOR_FORMAT ColorFormat = COLOR_FORMAT_XRGB_NOALPHA ) const
  {
    return(::ResourceCreate(this.Name, Data, Width, (Width == 0) ? ::ArraySize(Data) : ::ArraySize(Data) / Width, 0, 0, Width, ColorFormat));
  }

  int Get( uint &Data[] ) const
  {
    uint Width;
    uint Height;

    return(::ResourceReadImage(this.Name, Data, Width, Height) ? ::ArraySize(Data) : 0);
  }
};

void OnStart()
{
  RESOURCE Resource;
  
  uint DataIn[] = {0};  
  Resource.Set(DataIn);
   
  uint DataOut[];
  Resource.Get(DataOut);
  
  Print(DataOut[0]); // MT5x64 (ビルド 1881) - 0、MT4 (ビルド 1126) - 4278190100 (ランダム値)
}


ResourceSaveは正しく書き込めますが、ResourceReadImageは大きなバグがあります。修正可能なのでしょうか?MT5x32では未確認ですが・・・。


もしかしたら、 この 方法でMT4でも正しくリソースを読み込めるようになるかもしれません。テストしてないけど。

 

ところで、本格的なチャート - OBJ_CHART-がなくても大丈夫です。スクリプトはその上にロードされる。そしてWebRequestとOrderSendはそこで機能する。

追加チャートなしでインジケーター取引を行う方法の例を挙げました。

このように、iCustom-indicatorを マネージャーとして使えば、WebRequestAsyncごとにスクリプトでWebRequestを起動します。

ウィンドウが追加されないので、デザインはよりシンプルで信頼性が高くなるはずです。

 
fxsaber:

ところで、本格的なチャート - OBJ_CHART-がなくても大丈夫です。スクリプトはその上にロードされる。そして、WebRequestとOrderSendはそこで機能する。

追加チャートなしでインジケーター取引を行う方法の例を挙げました。

このように、iCustom-indicatorを マネージャーとして使えば、WebRequestAsyncごとにスクリプト内でWebRequestAsyncを実行します。

追加のウィンドウがないため、デザインはよりシンプルで信頼性が高くなるはずです。

この例をリンクしていただけますか?

 
Maxim Kuznetsov:

この例のリンクをいただけますか?

ここと ここ です。


ZY マーケット・インジケータが取引を始めたら、ユーザーはきっと驚くでしょうね......。

 
fxsaber:

ここと ここ


ZY おそらく、Market-indicatorが取引を始めたら、ユーザーは驚くでしょうね...。

なんてこった、ただのイベントの転送じゃないか。)

 
Maxim Kuznetsov:

クソッ、ただのイベントじゃないか......と思った。)

イベントなんてないよ。

 
fxsaber:

イベントはない。

注文を実行するのはスクリプトだ。

どうやって注文を得るかは別の問題だ。

 
Maxim Kuznetsov:

スクリプトは命令を実行する。

注文をどのように受け取るかは別の問題です。

スクリプトは注文を受け取らず、インジケータによって任意の数量でトリガされる。