MT4でTickによらずに一定間隔で処理するソース公開

MT4でTickによらずに一定間隔で処理するソースを公開しました。
スキャルピングをしている方には有効は手法だと思いますので、ご覧ください。

そもそもティック(Tick)とは

通貨ペアの為替レートの動きを見るときには1分足や1時間足などの時間足で見ることが一般的です。しかし、レートは実際には時間単位で変化しているわけではありません。

為替取引が活発なときには1秒の間に、何度もレートの値が変わりますし、逆に為替取引が停滞しているときは、1分以上レートの値が変わらないこともあります。このレートが動いたタイミングを1Tickと数えます。

なぜ一定の間隔で処理を動かす必要があるのか

MT4のメイン処理は主にOntick関数内に記述しますが、Ontick関数は、文字通りTickの動きがあったときしか動作しません。つまり1分以上Tickに動きがなければ、Ontick関数内の処理は動作しないことになります。

しかし為替取引が活発な時間でのスキャルピングでは、1Tickの動きで大きくレートが変わってしまう可能性があるため、レートの値ではなく「注文後、必ず○秒で決済する」という処理を入れることがあります。

このようにTickを待たずに、一定間隔で処理したいときに使える方法が下記の2つです。

Ontick関数内でWhile文を使った方法

Ontick関数内の処理をWhile文で囲んで、処理を記載し、Sleep処理を入れることで、一定間隔で処理ができます。

補足説明
MT4を動かすPCの性能が悪いと、Sleep処理は想定時間よりも伸びることがあります。
例えば1秒しかSleepしないはずが、5秒Sleepしてしまうことが発生します。
1コアのCPUに対して複数のMT4処理を動かすと、他の処理でCPUが占有されて、Sleep処理に関係なく、処理を待たされるためです。
Sleep時間が長くなる場合には、CPUのコア数を増やすか性能をあげてみてください。
(CPU以外のメモリなどが原因の場合もあります)

OnTimer関数を使った方法

Ontick関数を利用せずにOnInit関数内からOnTimer関数を呼び出すことで一定間隔で処理を動かすことができます。

補足説明
PC性能が悪いと時間が延びるのは、while文を使った方法と同様です。
さらにこの方法はOntickとOntimerの処理が並列にできないという問題があります。
Ontickで時間のかかる処理を動かすと、その間Ontimer処理は動きません。
例えばOntick関数内で10秒Sleep処理を入れると、Ontimerの処理がその間動かないことが分かります。
おすすめの記事