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

 
Stanislav Korotky:

WebRequestはインジケーターでは動作しません(このライブラリを使用すると、この制限を回避できます)。MTの別スレッドはエキスパートとスクリプトだけに割り当てられていますが、スクリプトはイベントと連動しません。

なるほど、ありがとう。知りませんでした。

 
Stanislav Korotky:

MT4 1146では、リソースは完全に機能しています。このアイデアは第4バージョンに安全に移植できる。

 
fxsaber:

そうです。しかし、それはMT5でのみ機能します。

私はこのアイデアを実装しました(チャートオブジェクトを使って)。

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

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

結果は以下のようになった。

スクリプトが動作しないのは、起動時にパラメータを渡すことができないからです。スクリプトはチャート・テンプレートとまったく相性が悪いようです。Expert.mqhライブラリの助けを借りて(パラメータなしだが)、Expert Advisorになぞらえれば、なんとか実行できる。

スクリプトではなくExpert Advisorでウェブリクエストを実行する場合、このスキームは中途半端に機能する。つまり、入力パラメータは正常に機能し、データ付きのリソース名をExpert Advisorに渡すことができる。しかし、なぜかチャートオブジェクトで起動したExpert AdvisorではOnInitイベントだけがトリガーされ、例えばOnTickやOnTimerはトリガーされない。OnInitでWebリクエストを実行するのはあまり良いことではありませんが、可能です。しかし、リクエストごとにチャート・オブジェクトを開くと 多くのオーバーヘッドが発生するため、このロジックはすべて処理速度をひどく低下させます。

 
Stanislav Korotky:

このアイデアを実装した(チャート・オブジェクトを使って)。

結果は以下の通りである。

スクリプトを起動する際にパラメータを渡すことができないため、スクリプトが動作しない - スクリプトはチャート・テンプレートとまったく相性が悪いようだ。Expert.mqhライブラリを使えば、Expert Advisorになぞらえて、(パラメータなしで)スクリプトを起動することができる。

私はこのトピックを勉強しなければならなかった。スクリプトはテンプレートと通常のチャート上で実行されるが、入力パラメーターを設定 する機能はない。ですから、PlaySoundメソッドは間違いなく機能します。

ウェブクエリーをスクリプトではなく、Expert Advisorsで実行すると、この方式は中途半端に機能する。つまり、入力パラメーターは正常に機能し、データ付きのリソース名をExpert Advisorに渡すことができる。しかし、なぜかチャートオブジェクトで起動したExpert AdvisorではOnInitイベントだけがトリガーされ、例えばOnTickやOnTimerはトリガーされない。OnInitでWebリクエストを実行するのはあまり良いことではありませんが、可能です。しかし、リクエストごとにチャート・オブジェクトを開くと オーバーヘッドが多くなるため、このロジックはすべてひどく遅くなる。

私には何も効果がない。

 
fxsaber:

私はこのトピックを勉強しなければならなかった。スクリプトはテンプレートと通常のチャートで実行されるが、入力パラメーターを設定する機能はない。ですから、PlaySoundメソッドは間違いなく機能します。

私には何も機能していません。

プライベート・メッセージで送った セットはExpert AdvisorのOnInitで動作します。それはログから見ることができる。ログを送ってください。

 

チャート・オブジェクトの助けを借りて、エキスパート・ヘルパーを持つテンプレートを適用した、ウェブ・リクエストの別の起動方法を掲載します。これは、エキスパートとインジケータの両方から使用できます。依存関係は記事と同じです。アプローチ実装の直接新しいファイル:

  • multiwebobjectworker.mqh - 共通クラスを含むヘッダーファイル;
  • multiwebobjectworker.mq5 - オブジェクト・グラフ内でウェブ・クエリーを実行するエキスパート・アドバイザー;
  • multiwebindicator.mq5 - ウェブクエリーの起動を示すバッファレスインジケーター;

クエリーごとにオブジェクトが作成され、その中にエキスパート・ヘルパーが作成され、クエリーが終了するとオブジェクトは削除される。クエリのデータと結果は、記事のようにリソースを介して交換される。

ログから判断すると、オブジェクトはおそらく共通のイベントキューを共有しているため、このメカニズムではクエリ実行の本格的な並列性は得られません。ログの例

2018.11.14 15:11:58.492 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS1 129912254742671349
2018.11.14 15:11:58.694 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS2 129912254742671350
2018.11.14 15:11:58.819 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS3 129912254742671351
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnInit
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Reading request \Indicators\multiwebindicator.ex5::WRS_0_129912254742671348
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Got 64 bytes in request
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: GET https://User-Agent: n/a 5000 
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnInit
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Reading request \Indicators\multiwebindicator.ex5::WRS_1_129912254742671348
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Got 60 bytes in request
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: GET https://User-Agent: n/a 5000 
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnInit
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Reading request \Indicators\multiwebindicator.ex5::WRS_2_129912254742671348
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Got 72 bytes in request
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: GET https://www.startpage.com/ User-Agent: n/a 5000 
2018.11.14 15:11:59.162 multiwebobjectworker (EURUSD,H1)        129912254742671350: Done in 187 ms
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671350
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Got 16592 bytes in response
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   GET https://ya.ru
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   Received 3734 bytes in header, 12775 bytes in document
2018.11.14 15:11:59.256 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnDeinit
2018.11.14 15:11:59.272 multiwebobjectworker (EURUSD,H1)        129912254742671349: Done in 297 ms
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671349
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Got 12688 bytes in response
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   GET https://google.com/.
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   Received 790 bytes in header, 11813 bytes in document
2018.11.14 15:11:59.350 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnDeinit
2018.11.14 15:11:59.833 multiwebobjectworker (EURUSD,H1)        129912254742671351: Done in 749 ms
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671351
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Got 45212 bytes in response
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   GET https://www.startpage.com/
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   Received 822 bytes in header, 44307 bytes in document
2018.11.14 15:11:59.849 multiwebindicator (EURUSD,H1)   > > > Async WebRequest workers finished 3 tasks in 1357 ms
2018.11.14 15:11:59.880 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnDeinit
ファイル:
 
Stanislav Korotky:

更新されたResource_Data.mqhを試してみてください。ウェブページを転送する際の遅延がなくなるはずです。

#include <fxsaber\TradeTransactions\ResourceData.mqh> //https://www.mql5.com/ja/code/22166

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

const RESOURCEDATA<uchar> Resource("::" + __FILE__); // データ転送用リソース(バイト)
uchar BytesIn[];
const int Init = ArrayResize(BytesIn, 1000000);

void TestResource()
{
  uchar BytesOut[];

  Resource = BytesIn;
  Print(Resource.Get(BytesOut));
}

void OnStart()
{
  BENCH(TestResource());
}


旧バージョン

1000000
Time[TestResource()] = 103746


新バージョン

1000000
Time[TestResource()] = 5222
 
fxsaber:

更新されたResource_Data.mqhを試してみてください。ウェブページを転送する際の遅延がなくなるはずです。

古いバージョン

新バージョン

20倍のスピードアップのために何をしたのですか?古いコードとの互換性は維持され、クライアント・コールを変更する必要はない?

 
Stanislav Korotky:

20倍のスピードアップのために何をしなければならなかったのか?古いコードとの互換性は維持され、クライアント・コールを変更する必要はない?

互換性は残っています。

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

ライブラリ: TradeTransactions

fxsaber, 2018.12.09 01:23 pm.

ライブラリソースには、ある型の配列を別の型の配列に素早く変換 するConvert.mqhが あります。

TypeToBytesは大きな配列では遅かった(現在はどちらの配列型も他方の倍数でない場合にのみ使用される)。

TypeToBytesはuchar[]には使用されない。

 
いい記事だね。WinINetの非同期モードはどうですか?