【MQL4】EA、インジケーターが、バックテストで動かない。そんなときの代替策とは?

自作の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です。

タイトルとURLをコピーしました