【MQL5】iBarShift関数の使い方と自動売買実装コード

1. iBarShift関数の概要と実務での活用法

MQL5の iBarShift 関数は、指定した「時刻(datetime)」が、チャート上の「何番目のローソク足(インデックス)」に該当するかを検索するための非常に重要な関数です。

実務開発において、以下のようなケースで頻繁に使用されます。
* マルチタイムフレーム(MTF)分析: 1時間足の特定の時刻が、5分足ではどのバーに相当するかを特定する。
* イベントベースの処理: 経済指標が発表された時刻の価格アクションを過去検証(バックテスト)する。
* 期間の区切り計算: 前日のマーケットクローズ(NYカットなど)の時刻が、現在のチャートで何本前のバーかを知る。

初心者やMQL4経験者が特につまずきやすいのは、「バーのインデックスは常に変動する」という点です。最新のバーは常に「0」であり、時間が経過して新しい足が確定するたびに、過去の特定の時刻に対応するインデックス番号は増えていきます。iBarShiftを使わずに「直近100本前」と固定して計算すると、時間の経過とともに分析対象の時刻がズレてしまいますが、iBarShiftを使えば「特定の時刻」を基準に常に正確な位置を特定できます。

2. 構文と戻り値

iBarShiftの基本構文は以下の通りです。

int iBarShift(
   string           symbol,          // 通貨ペア(NULLは現在の通貨)
   ENUM_TIMEFRAMES  timeframe,       // 時間軸(PERIOD_H1など)
   datetime         time,            // 検索したい時刻
   bool             exact = false    // 完全一致フラグ
);

パラメーターの詳細

  1. symbol: 対象となる通貨ペア。
  2. timeframe: 検索対象の時間軸。
  3. time: 取得したいインデックスに対応する時刻。
  4. exact:
    • false(デフォルト): 指定した時刻にバーが存在しない場合、その時刻より前(過去方向)の最も近いバーのインデックスを返します。
    • true: 指定した時刻にバーが正確に存在しない場合、-1を返します。

戻り値

  • 成功した場合:指定した時刻に該当するバーのインデックス(0〜)
  • 失敗した場合(指定時刻が未来、またはデータ未ロード時):-1

3. 具体的な使い方・実践サンプルコード

以下のコードは、1時間足チャート上で動作するEA(またはスクリプト)において、「今日の午前9時ちょうど」の5分足でのバーインデックスを取得し、その時の始値を表示する例です。

void OnStart()
{
   // 1. 検索したいターゲット時刻を設定(例:今日の午前9時00分)
   MqlDateTime mqlTime;
   TimeCurrent(mqlTime); // 現在時刻を取得
   mqlTime.hour = 9;
   mqlTime.min = 0;
   mqlTime.sec = 0;
   datetime targetTime = StructToTime(mqlTime);

   // 2. iBarShiftを使って5分足チャートでのインデックスを取得
   // 第4引数をfalseにすることで、9:00丁度の足がなくても直前の足を返してくれる
   int barIndex = iBarShift(_Symbol, PERIOD_M5, targetTime, false);

   // 3. エラーチェック
   if(barIndex == -1)
   {
      Print("エラー: 指定した時刻のバーが見つかりませんでした。データが読み込まれていない可能性があります。");
      return;
   }

   // 4. 特定したインデックスを使ってデータを取得
   double openPrice = iOpen(_Symbol, PERIOD_M5, barIndex);

   // 結果を出力
   PrintFormat("ターゲット時刻: %s は、5分足チャートで %d 本前のバーです。", 
               TimeToString(targetTime), barIndex);
   PrintFormat("その時の5分足の始値: %.5f", openPrice);
}

4. 使用上の注意点とよくあるエラー

① 土日や休場時間の考慮

FX市場は土日に閉場します。exact = true で土曜日の昼などの時刻を指定すると、戻り値は -1 になります。過去のデータをスキャンする場合は、必ず戻り値が -1 でないかチェックする処理を入れてください。

② ヒストリカルデータの未ロード

iBarShiftは、ターミナルにダウンロードされているデータのみを参照します。特にバックテストではなくリアルタイムのEAで、普段表示していない時間軸(1分足など)をiBarShiftで参照しようとすると、データがまだメモリに読み込まれておらずエラーになることがあります。これを防ぐには、事前に SeriesInfoInteger 等でデータの準備状況を確認するか、一度その時間軸のチャートを開いておく必要があります。

③ インデックスの逆転

MQL5では最新のバーが 0、過去へ行くほど 1, 2, 3... と増えていきます(時系列配列)。iBarShiftで取得した数値は、あくまで「現時点での何本前か」であるため、次のバーが生成されるとその数値は古くなることに注意してください。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、iBarShiftなどを用いて正確なエントリーポイントを算出したとしても、その注文が証券会社のサーバーに届くまでの「物理的な距離」がトレードの成否を分ける致命的な要因となります。

多くの開発者が自宅のPCでEAを稼働させがちですが、日本の家庭用インターネット回線は、海外や国内主要データセンターにあるFX業者のサーバーに対して数十〜数百ミリ秒の遅延(レイテンシ)を抱えています。一瞬の価格変動で利益を積み上げるシステムトレードにとって、この遅延はスリッページを増大させ、バックテストの結果を大きく下回る「期待値の欠損」を引き起こします。極限まで約定スピードを高め、優位性を確保するためには、取引サーバーに物理的に近い場所に設置された専用のVPS(仮想専用サーバー)を利用することが、プロのクオンツエンジニアにとってはもはや常識であり、避けては通れない必須のインフラ投資と言えます。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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