今回は、MetaTrader 5を使って新しいバー(キャンドル)を検出するためのシンプルなコードをご紹介します。このコードは、前のバーの時間を記録し、一定の時間(例えば1分)を加算して現在のバーのクローズ時間を取得します。
基本的な流れは以下の通りです:
- 前のバーの時間を取得し、60秒を加算して現在のバーのクローズ時間を計算します。
- 現在の時間がクローズ時間と一致する場合、新しいバーが受信されたと判断します。
- このコードは、バーごとに一度だけ実行されるようにフラグを使って制御します。
以下が実際のコード例です。コード内のコメントを参考にしながらカスタマイズしてみてください。
//+------------------------------------------------------------------+ //| 新しいバー検出.mq5 | //| 作成者: H A T Lakmal | //+------------------------------------------------------------------+ bool NewBarRecived = false; // フラグの初期化 //+------------------------------------------------------------------+ //| エキスパート初期化関数 | //+------------------------------------------------------------------+ int OnInit() { //--- タイマーをセット EventSetTimer(60); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| エキスパート非初期化関数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- タイマーを解除 EventKillTimer(); } //+------------------------------------------------------------------+ //| エキスパートティック関数 | //+------------------------------------------------------------------+ void OnTick() { datetime TimePreviousBar = iTime(_Symbol,PERIOD_M1,1); datetime TimeCurrentClose = TimePreviousBar + 60; // 現在のバーのクローズ時間 datetime Time_Current = TimeCurrent(); if(Time_Current == TimeCurrentClose && NewBarRecived == false) { PlaySound("ok.wav"); // コードの動作確認用 NewBarRecived = true; // フラグを更新 // あなたのコードをここに記述 ----- (何か処理を行う) } else if(Time_Current > TimeCurrentClose) { NewBarRecived = false; // 次のバーのオープンのためにフラグをリセット // あなたのコードをここに記述 ----- (何か処理を行う) } Comment(" " + " " + "現在のバーの時間 -: " + TimeToString(TimePreviousBar,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + "現在のクローズ時間 -: " +TimeToString(TimeCurrentClose,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + "現在の時間 -: " + TimeToString(Time_Current,TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " +" " + "新しいバーが受信されました -: " + NewBarRecived); // 計算を確認するため } //+------------------------------------------------------------------+ //| タイマー関数 | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ //| トレード関数 | //+------------------------------------------------------------------+ void OnTrade() { //--- } //+------------------------------------------------------------------+ //| チャートイベント関数 | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+
このコードを使うことで、新しいバーの到着を簡単に検出できます。ぜひ試してみてください!