ホーム システムトレード 投稿

MT4で新しいバーを検出する方法 - EAの活用法

添付ファイル
10370.zip (734 bytes, ダウンロード 2回)

トレーダーの皆さん、こんにちは!今日は、MetaTrader 4(MT4)を使用して新しいバーを検出する方法についてお話しします。

新しいバーの検出方法について

新しいバーを検出するのはとても簡単です。特に現在の時間枠で新しいバーを検出したい場合は、以下のコードを使ってみてください。

void start(){
  static datetime tmp;
  if (tmp != Time[0]) {
    tmp = Time[0];
    // ここにコードを追加してください
  }
}

さて、他の時間枠のイベントについてはどうでしょうか?これは難しくありませんが、いくつかの制約があります。

MT4はonBarイベントをサポートしていませんが、上昇する時間を配列に格納して、各ティックごとに配列の時間をチェックすることができます。正しい時間に達したら、新しいバーイベントを実行します。

たとえば、M5時間枠でバックテストを実行している場合、M6、M7、...、D1のイベントをキャッチすることができます。

しかし、なぜ上昇トレンドしか検出できないのでしょうか?その理由は、MetaTraderがどのようにティックデータを生成するかという質問に帰着します。

D1時間枠までいくと、もう少し難しくなります。たとえば、週は日曜日の20:45(ブローカーによって異なる)に始まり、月の始まりも週の真ん中から始まることがあります。この情報はあまり重要ではないと思うので、公開しません。

この質問についてはこちらのトピックがありますが、多くの人が記事やフォーラムを読まないと思うので、私はこのコードを公開しました。

いくつかの説明:

init関数では、開始時間で時間配列を埋めます:

  curIndex = utils.periodToPeriodIndex(Period());
  times[curIndex] = Time[0];
  for(int i = curIndex + 1; i < MAX; i++)
    times[i] = times[curIndex] - MathMod(times[curIndex], utils.periodIndexToPeriod(i) * 60);

そして、start関数では、十分な時間が経過したかをチェックし、イベントを実行します:

  if (times[curIndex] != Time[0]) {
    times[curIndex] = Time[0];
    onBar(Period());
    for(int i = curIndex + 1; i < MAX; i++) {
      int period = utils.periodIndexToPeriod(i),
        seconds = period * 60,
        time0 = times[curIndex] - MathMod(times[curIndex], seconds);
      if (times[i] != time0) {
        times[i] = time0;
        onBar(period);
      }
    }
  }

最後に、あなたのコードは以下のように書いてください:

void onTick() { 
}

そして、

void onBar(int period) {
}

これで全てです!皆さん、頑張ってください!

更新 1.1: WHRoederに感謝します。コードが明確になりました!

関連記事

コメント (0)