スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MT4のEA/Script/Indicatorの動作の違い?マルチスレッドの観点から

先日いただいたコメントについて自分なりに調べてみて分かったことがあるので、
それをメモがわりに記事にさせていただく。
一方、自作DLLでマルチスレッドの対応が必要となる理由について以前の記事で述べた。

EA/Script/Indicatorで表向きの動作がそれぞれどのように異なるかは、書籍、その他サイトで説明されているので周知の通り(実は意外と明確な違いについて知られていない?)だが、MT4の内部的にはどのように実現されているのだろうか?

これまで、「EA/Script/IndicatorはMT4ターミナルのメイン・スレッドとは別のスレッドを割り当てて動いているだろう。」と思っていた。スレッドを共有したり、使い回したりするかもと思っていた。
いただいたコメントについて考えてみると、スレッドの割り当てをどのようにしているかを調べることで
何かが判明しそうだ。EAとScriptは一つのチャート・ウィンドウに一つしかのせられないが、Indicatorは複数のせられる。この違いとMT4でどのようにEA/Script/Indicatorを動かしているかが密接だろうと思う。

EA/Script/IndicatorのそれぞれでWindowsAPIを使って自身のスレッドIDを取得、結果をチャートに表示させてみた。さらにタスクマネージャを起動して、"terminal.exe"のスレッド数がどのように変化するかを確認した。

結果として、EAをチャートにのせるとスレッド数が一つ増え、チャートから削除すると一つ減る。またチャートにのせる度に表示されるスレッドIDは異なる数値だった。何度やってもそうなった。Scriptも同様の結果となった。EAとScriptを二つ同じチャートにのせるとスレッド数が二つ増え、スレッドIDはそれぞれ別の値だった。

どうやら、「EAとScriptの場合は、チャートにのせる度に専用のスレッドを作成、割り当てて処理をさせ、チャートから削除されればスレッドも削除され、スレッドを共有したり使い回したりということはない。」といえそうだ。
(安直な調べ方なので、絶対にそうなっているとはいいきれない。。。)

しかし、Indicatorの場合はEA/Scriptと結果がちがった。
Indicatorをチャートにのせてもスレッド数は増えない。同じチャートに複数のせてもスレッド数は増えない。indicator_chart_window/indicator_separate_windowを変えて、それぞれをいくらのせても増えない。チャート・ウィンドウを複数開いて、そこにいくらのせても増えない。また、スレッドが増えないことを示唆するかのように、表示されるスレッドIDは全て同じ値だった。
どうやら、「Indicatorの場合は、共通のスレッドを割り当てて処理される。」ようだ。
そうするとIndicatorで共通のスレッドが唯一かどうかが気になる。動作させるIndicatorが多くなりすぎると、別のスレッドに割り当てて動作させたりするのであろうか。。。?

MetaEditorのヘルプに、プログラムの実行に関して以下のように書かれていた。

Scripts and experts work in their own thread.
Custom indicators work in the main interface thread.

一行目は調べた結果から見ても、EAとScriptはそれぞれでスレッドを所有して動作すると解してよさそうだ。
二行目、カスタム・インジケータはメイン・インタフェース・スレッドで動作するとある。"main interface thread"とはMT4の開発サイドが決めた、なにか共通のスレッドのことであろうか?

while ( ! IsStopped() )
{
  // なんらかの処理
  Sleep( 1000 );
}

このMQL4の記述ではユーザが処理を中止するか、停止要求がこなければ同じことをずっとループさせて処理することができるが、Indicatorの記述でこれを用いてはいけない!

Indicatorとして実行するとMT4全体が操作不能になり、フリーズした状態となる。IsStopped()関数はEAとScriptにしか有効でなく、Indicatorから呼ぶと常にfalseが返るようだ。Sleep()関数もIndicatorでは無効なようで、停止することなくすぐに返る動作をするようだ。

しかし、Indicator用の共通スレッドがあったとしてそこで永久ループになったからといって、フリーズ状態になることはないだろう。まるでMT4のメイン・スレッドまたはユーザ・インタフェース用のスレッドが永久ループかロックして、操作不能になるかのようだ。。。
(このようにIndicatorによってMT4がフリーズする状態を安全に体験したければ、有限カウントのforループで、WindowsAPIのSleepEx()関数を呼び出す記述をしてみればよい。)

"main interface thread"という表現、これはMT4全体のユーザ・インタフェース・スレッドということを意味しているのではないか!?
そしてこの表現からして、Indicatorが多かったり処理が重いからといって別のスレッドを用意して割り当てるということはなさそうだ。IndicatorでSleep()関数が無効になる理由も説明がつくだろう。

結論として、
「EAおよびScriptに関しては、チャートにのせる度に新しい専用のスレッドを作成して割り当てて実行する。しかし、Indicatorに関してはMT4のアプリケーションとしてのユーザ・インタフェース・スレッドを共有して、ユーザからの入出力処理が終わったらIndicatorの処理を、それが終わって制御が返ったら次のIndicatorの処理を、というように協調的マルチタスクの方法で実行している。」
ということになりそうだ。

むずかしいことは置いておいて、計算量のちょっと多そうなインジケータをチャートにのせた瞬間、MT4全体がしばらく固まったようになってしまう理由がここにあると思うと納得できるのではないか?

☆結論から導かれること?その1
一つのMT4ターミナルで大量のIndicatorを使用しているか、処理の重いIndicatorと軽いIndicatorを混在して使用している場合、複数のMT4ターミナルを起動してIndicatorの使用を分散させた方がよい。別のMT4ターミナルで動作させることで、別のスレッドを割り当てたかのような並行処理によりレスポンスが軽くなるだろう。

☆結論から導かれること?その2
計算処理等に時間がかかる重いIndicatorがある場合、重い処理の部分をEAかScriptで実現しておき、Indicatorは計算要求、計算結果の取得と画面の更新処理に集中すればMT4ターミナル全体のレスポンスが軽くなるだろう。

☆結論から導かれること?その3
Indicatorから呼ばれて使用されることが前提のDLLを作成する場合、マルチスレッドを考慮したWindowsAPI等を使用しての排他制御および同期処理は不要である。必ずあるIndicatorの処理が終わってから、次のIndicatorの処理が開始されるからだ。
同一のMT4ターミナルで別のチャートにのせたIndicator同士で同期を取りたい場合は、通常のグローバル変数等のフラグを用意してやりとりすれば十分であろう。別のMT4ターミナルにのせたIndicator間では別スレッドとなるが、プロセスのメモリ空間が別なので競合の問題は発生しない。ただし、Indicatorが別のMT4ターミナルにのせたIndicator等と通信する場合を除く。

結論が間違っていれば、上記導かれることは成り立たなくなってしまうが、EA/Script/Indicatorを設計する側からすればこの違いは大きなものであり、とても意識しなければならないことの一つだと思うがいかがだろうか?
スポンサーサイト

theme : MT4自動売買
genre : 株式・投資・マネー

tag : MT4 EA Script Indicator DLL IndicatorからDLL マルチスレッド 排他制御 同期処理

comment

Secret

No title

はじめまして。

難しいこと書いてるなと思いました。
自作DLLってなんですか?

なにかわからないけど、
自作できるってすごいことです。
私は何一つ自作できません。

またきますね。

☆当ブログとFX取引に関するご注意☆

もし、当ブログを閲覧、参考にしていただいた上で、FXまたはその他取引に関心を持たれた方は、以下の点にご注意して下さい。

・FX取引(外国為替証拠金取引)は元本や利益が保証された商品ではなく、市場環境の変化や相場の変動により損失が発生する場合があること。

・FXおよびその他取引をする場合は、各種のリスクを理解し、十分に検討し、かつ慎重に行う必要があること。

・当ブログで掲載、紹介している情報は、FXおよびその他取引、投資に関する勧誘、助言等ではないこと。

・当ブログで掲載、紹介している取引手法、ソース・プログラム等を用いた結果、いかなる損害が生じても当方は一切の責任を負わないこと。

投資、取引をされる場合は、必ずご自身の責任で行って下さい。
よろしくお願いいたします。
プロフィール

Dr.ヘパ


Author:Dr.ヘパ

カテゴリ&検索
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
月別アーカイブ
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
つぶやき
★DailyImpact(有償版)★
リアル口座で運用できる有償版
販売開始しました!

ご購入、お申し込み等の詳細については、下記リンク先のブログ右上にショッピング・カート「ブーボーのトレーディングキット工房」へのリンクがありますので、お手数ですがそちらをご参照下さい。

ブーボーの
トレーディングキット

Ⅰ.経済指標トレード向けEA、DailyImpactは、経済指標発表による突発的な値動きを捉えることで、利益を得ることを目指したセミオートEAです。

Ⅱ.経済指標トレードは、「指標トレード」「News Trading(ニューストレード)」とも呼ばれ、最近注目されている手法です。

Ⅲ.経済指標発表によるトレードは、いつ大きく動く可能性があるかわかっているので有利です。

Ⅳ.一方、瞬時に大きな値動きが発生するので、手動での仕掛け、手仕舞いは難しいことが多いです。

Ⅴ.高速に計算・発注可能なEAであるDailyImpactにより、手動よりも素早く、同時に多くの通貨ペアで、しかもその場にいなくても経済指標トレードができます。
★DailyImpact(DL版)★
ダウンロード版
期間限定で試用できます!!

ダウンロード、使用方法の詳細は
以下のブログを参照して下さい。



DailyImpact(ダウンロード版):ブーボーのトレーディングキット

   ☆ブーボーの
トレーディングキット

↓↓↓アンケートにご協力お願いします。↓↓↓
ブログ・ランキング
リンク&ブロとも申請
アクセス・カウンタ
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。