トレーダーの皆さん、こんにちは!今日は、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に感謝します。コードが明確になりました!