iBarShift指定した時刻が何本目の足かを調べる
「この時刻はチャートの何本前の足か」を、足の番号(0=最新)で返す関数。時刻から足番号への変換はここでしか出来ないため、パネル表示・時間帯の判定・過去の値の参照など、あらゆる場面で使う。
1書式
int iBarShift( string symbol, // 通貨ペア(NULL=いま見ているチャート) int timeframe, // 時間足。PERIOD_M1 などの定数 datetime time, // 調べたい時刻 bool exact=false // true=足が無ければ -1 を返す );
int iBarShift(
string symbol,
ENUM_TIMEFRAMES timeframe, // ★ここがintからENUM_TIMEFRAMESに変わる
datetime time,
bool exact=false
);
引数の並びは同じ。timeframe の型だけ違うので、MQL4のコードをそのまま持ってくると「int を ENUM_TIMEFRAMES に変換できません」でコンパイルが止まる。
2引数
| 引数 | 内容 |
|---|---|
| symbol | 調べたい通貨ペア。NULLでいま見ているチャートの銘柄 |
| timeframe | 時間足。MQL4はPERIOD_M1などのint定数、MQL5はENUM_TIMEFRAMES型 |
| time | 調べたい時刻(サーバー時間) |
| exact | false(既定)=指定時刻に一番近い足を返す。true=ぴったりの足が無ければ -1 |
3戻り値
足の番号(0=最新の確定していない足)。timeが読み込んだ履歴より古い場合は、読み込んだ中で一番古い足の番号を返す。exact=trueでぴったりの足が無ければ -1。
4実際に動かした結果
足の番号は「いまの足=0」から左(過去)へ増えていく
M1・8本ぶん。右端(0)が最新の足で、左へ行くほど番号が増える。timeにちょうど合う足が無いときは「その時刻を含む足」に丸められる(下のH1の例)。
上位足では「時刻を含む足」に丸められる(H1の例)
9:30ちょうどの足は無いので、9:30を含む「9:00〜10:00の足」を返す。exact=trueにすると、ぴったりの時刻が無いこの状況では -1 になる。
USDJPY・M1・サーバー時刻 2026-09-21 12:00:00 のチャートで実行。
| 呼び出し | 結果 |
|---|---|
| iBarShift(NULL, PERIOD_M1, D’2026.09.21 12:00:00′) | 0(いまの足そのもの) |
| iBarShift(NULL, PERIOD_M1, D’2026.09.21 11:55:00′) | 5(5本前) |
| iBarShift(NULL, PERIOD_H1, D’2026.09.21 09:30:00′) | 2(H1では9:00の足に丸められる) |
5使用例:1時間前の高値を読む
datetime target = TimeCurrent() - 3600;
int idx = iBarShift(NULL, PERIOD_M1, target);
double hi = iHigh(NULL, PERIOD_M1, idx);
Print("1時間前の高値: ", hi);
MetaEditorでコンパイル0エラー・0警告を確認済み。
6MQL4→MQL5の違い
timeframe の型が int → ENUM_TIMEFRAMES に変わる。「MQL4は分数の整数を直接渡していた」コードは、MQL5では列挙型へ書き換えが要る。
逆に言えば、この2つの型を両方受け取る自前の変換関数を1本作っておくと、他の時間足がらみの関数(iOpen・iClose・iTime など)でも使い回せる。
7よくある罠
- MT5では処理が重くなることがある。上位足の本数が多いインジケーターで、毎ティック
iBarShiftを呼ぶと描画が詰まった実例あり。呼ぶ回数を減らすか、自前の二分探索に置き換える(時刻の配列は昇順なので二分探索できる)のが定石。 - 上位足の配列(自作の
g_t[]など)と組み合わせて使うとき、配列の範囲を確かめずに読むと範囲外アクセスになる。時間足の切り替え直後や起動直後、上位足の本数がまだ揃っていない瞬間に踏みやすい。
8関連する関数
9使っている無料ツール
今日はどこを見ればいいか。
ドル円とユーロドルの主要ライン・予想高値安値を、平日の朝に図1枚にまとめています。
朝刊を見る→