OnTimer()は便利そうなのにバックテストで使えない欠点が
OnTick()はティックごとに動作する関数で、EAの売買ロジック等、根幹部分をここに記述します。
他方、OnTimer()は指定時間間隔ごとに動作する関数で、OnTick()と同様に、EAの根幹部分をここに記述します。
OnTimer()はティックの変動量に関係なく一定間隔で動作するので、経済指標の発表前後に注文するような日時を考慮したトレードに向いている!と気付きました。
※注意:OnTick()の場合、ティックが動かないとそもそも関数が起動しないので、厳密なタイミングを測れない。
確かに、読み通りではあったのですが、OnTimer()には大きな問題がありました。なんと、バックテストで動作しないのです。
デモ口座でのフォワードテストなら問題なく動作するものの、バックテストで動作しない以上、OnTimer()の使い所は非常に限られてきます。
OnTick()を擬似的な方法で再現しようと試みている方がいらっしゃいましたが、現状では使いにくい関数仕様となっています。勿体無いなぁ…。
ちなみに、OnTimer()はローカル時刻(MT4がインストールされているPCの時刻)を参照して動作します。この点も要注意です。
OnTimer()を使うには、いくつかおまじない的な記述があるので、プログラムの雛形を残しておきます。
int OnInit() { EventSetTimer(1); // 1秒ごとに起動。カッコ内の数値を変えることで起動間隔を変えられる。 return(INIT_SUCCEEDED); }
void OnDeinit(const int reason) { EventKillTimer(); // タイマーイベントの削除 }
void OnTimer() { // ここに実現したいロジックを記述 }