自作のEA、インジケーターが、きちんと動くかテストするとき、困ったことがありませんか?
何故か、バックテストで動作しない。
例えば、タイマーイベント「OnTimer()」は、バックテストでは動作しません。
これは、MT4の仕様によるものです。
では、バックテストで動作確認したい場合、どうすれば良いのか?
今回は、バックテストで動作しないイベントの代替策を1つご紹介します。
「OnTimer()」で、時刻表示する
タイマーイベント「OnTimer()」を使って、MT4サーバー時刻表示するインジケーターを作成するとします。
例えば、こんな感じですね。
void OnTimer(){
ObjectSetText("時刻表示ラベル", TimeToString(TimeCurrent(),TIME_SECONDS), 10, "MS ゴシック", White);
}
これ、バックテストでは、全く動作しません。
バックテストでは「OnTimer()」イベントが実行されないからですね。
でも、バックテストで、サーバー時刻を確認しながら、エントリーしたいとき、困ってしまいますね。
「OnTimer()」の代替策
「OnTimer()」が、バックテストで動かないのは、MT4の仕様なので、どうしようもありません。
では、バックテストでは、動作確認できないかというと、そうでもありません。
代替策として、ティック毎に動作する「OnCalculate()」を使う方法があります。
「OnCalculate()」で、動作させる場合、1つだけポイントがあります。
例えば、こんな感じです。
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if(IsVisualMode()) // ← ここがポイント
ObjectSetText("時刻表示ラベル", TimeToString(TimeCurrent(),TIME_SECONDS), 10, "MS ゴシック", White);
return(rates_total);
}
ポイントは「IsVisualMode()」です。
IsVisualMode()関数
「IsVisualMode()」は、「ビジュアルモード」で「バックテスト」してるかどうかをチェックする関数です。
「ビジュアルモード」で「バックテスト」してる場合に、「true」を返します。
「IsVisualMode()」で、バックテスト中かどうかを判定して、バックテストのときだけ、動作させてあげればOKです。