@MetaTrader 4.00 Build 1090
Expert Adviser の OnTick()
で何か重たい処理をしているとき1、OnTimer()
はどのように処理されるのか、調べてみました。
結論から言うと、以下のような動作をするようです。
(同一スレッド上で動いているか、少なくとも排他されている。)
OnTick()
の処理中に OnTimer()
のタイミングが来た場合、OnTick()
終了直後にOnTimer()
が実行される(OnTimer()
はペンディングされる)
- ただし、2回以上ペンディングされたとしても、
OnTick()
終了直後に実行される OnTimer()
は1回のみ
- ペンディングされたとしても、
OnTimer()
が呼ばれるタイミングには影響しない(EventSetTimer()
が呼ばれた時点から指定間隔で呼ばれ続ける2)
この動作、逆の場合も当てはまるようです。
つまり、OnTimer()
で重たい処理をしていると、その間に呼ばれるはずだった OnTick()
が無視されることになります3。
また、OnTick()
で重たい処理をしていても、同じように OnTick()
が無視されます。
OnTick()
や OnTimer()
ではなるべく重たい処理をしないようにすべきですね。
かつ OnTimer()
の呼び出し頻度は少なめに。