MT4でTickによらずに一定間隔で処理するソースを公開しました。
スキャルピングをしている方には有効は手法だと思いますので、ご覧ください。
そもそもティック(Tick)とは
通貨ペアの為替レートの動きを見るときには1分足や1時間足などの時間足で見ることが一般的です。しかし、レートは実際には時間単位で変化しているわけではありません。
為替取引が活発なときには1秒の間に、何度もレートの値が変わりますし、逆に為替取引が停滞しているときは、1分以上レートの値が変わらないこともあります。このレートが動いたタイミングを1Tickと数えます。
なぜ一定の間隔で処理を動かす必要があるのか
MT4のメイン処理は主にOntick関数内に記述しますが、Ontick関数は、文字通りTickの動きがあったときしか動作しません。つまり1分以上Tickに動きがなければ、Ontick関数内の処理は動作しないことになります。
しかし為替取引が活発な時間でのスキャルピングでは、1Tickの動きで大きくレートが変わってしまう可能性があるため、レートの値ではなく「注文後、必ず○秒で決済する」という処理を入れることがあります。
このようにTickを待たずに、一定間隔で処理したいときに使える方法が下記の2つです。
Ontick関数内でWhile文を使った方法
Ontick関数内の処理をWhile文で囲んで、処理を記載し、Sleep処理を入れることで、一定間隔で処理ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int OnInit(){ } void OnDeinit(const int reason){ ObjectsDeleteAll(); } void OnTick() { while(1) //Ontick内でwhile文内の処理を繰り返す { Print("OnTick Process:",TimeLocal()); //Tick単位で現在時刻を表示 Sleep(5000); //5000msec処理を止める。 if( IsStopped() ) break; //処理を止めるときはWhileから抜ける } } |
補足説明
MT4を動かすPCの性能が悪いと、Sleep処理は想定時間よりも伸びることがあります。
例えば1秒しかSleepしないはずが、5秒Sleepしてしまうことが発生します。
1コアのCPUに対して複数のMT4処理を動かすと、他の処理でCPUが占有されて、Sleep処理に関係なく、処理を待たされるためです。
Sleep時間が長くなる場合には、CPUのコア数を増やすか性能をあげてみてください。
(CPU以外のメモリなどが原因の場合もあります)
例えば1秒しかSleepしないはずが、5秒Sleepしてしまうことが発生します。
1コアのCPUに対して複数のMT4処理を動かすと、他の処理でCPUが占有されて、Sleep処理に関係なく、処理を待たされるためです。
Sleep時間が長くなる場合には、CPUのコア数を増やすか性能をあげてみてください。
(CPU以外のメモリなどが原因の場合もあります)
OnTimer関数を使った方法
Ontick関数を利用せずにOnInit関数内からOnTimer関数を呼び出すことで一定間隔で処理を動かすことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int OnInit(){ EventSetTimer(5); //5秒間隔でOnTimer処理を呼び出す // return(INIT_SUCCEEDED); } void OnDeinit(const int reason){ EventKillTimer(); //処理を止めるときにOnTimer処理を終了させる } void OnTick() { Print("OnTick Process:",TimeLocal()); //Tick単位で現在時刻を表示 Sleep(1000); //1000msec処理を止める。時間を延ばすとOntimerも実行されなくなることがわかる } void OnTimer(){ Print("OnTimer Process:",TimeLocal()); //Tick単位で現在時刻を表示 } |
補足説明
PC性能が悪いと時間が延びるのは、while文を使った方法と同様です。
さらにこの方法はOntickとOntimerの処理が並列にできないという問題があります。
Ontickで時間のかかる処理を動かすと、その間Ontimer処理は動きません。
例えばOntick関数内で10秒Sleep処理を入れると、Ontimerの処理がその間動かないことが分かります。
さらにこの方法はOntickとOntimerの処理が並列にできないという問題があります。
Ontickで時間のかかる処理を動かすと、その間Ontimer処理は動きません。
例えばOntick関数内で10秒Sleep処理を入れると、Ontimerの処理がその間動かないことが分かります。
AIを活用した自動売買EAの無料配布始めました。3年以上の年月をかけて大分安定してきましてので、よければ「機械学習EA(Aizack)とは」をご覧ください。