MQL5で高値・安値を探す方法|返るのは価格ではない
MQL5で一定期間の高値・安値を探すには iHighest と iLowest を使います。
最初につまずくのはここです。この2つが返すのは価格ではなく、足のインデックス(何本前か)です。そのまま価格として扱うと、数十や数百という値が入ってきます。
(確認環境:MetaTrader 5 / Windows 11)
基本の書き方
// 直近100本の中で最も高い足が何本前かを探す
int idx = iHighest(_Symbol, _Period, MODE_HIGH, 100, 0);
if(idx < 0)
return;
// そのインデックスを使って価格を取り出す
double highest = iHigh(_Symbol, _Period, idx);
2段階です。位置を探してから、その位置の価格を取ります。1行で済ませようとして間違えるのがこの関数の特徴です。
引数の意味
| 引数 | 内容 |
|---|---|
| symbol | 銘柄。NULL で現在の銘柄 |
| timeframe | 時間足。0 で現在の時間足 |
| type | 何を対象にするか(MODE_HIGH / MODE_LOW / MODE_CLOSE など) |
| count | 何本を対象にするか |
| start | どこから数え始めるか(0 が現在足) |
count と start の組み合わせで範囲が決まります。
iHighest(..., 100, 0)— 現在足を含む直近100本iHighest(..., 100, 1)— 1本前から100本(確定足だけ)
現在足は途中経過なので、確定した高値を見たいなら start を 1 にします。ここを 0 のままにすると、形成中の足の値で判定が変わり続けます。
🔴 type を間違えると意味が変わる
3番目の引数は「どの系列から探すか」です。
| 指定 | 探す対象 |
|---|---|
MODE_HIGH |
各足の高値 |
MODE_LOW |
各足の安値 |
MODE_CLOSE |
各足の終値 |
iHighest に MODE_LOW を渡すと、「安値がいちばん高かった足」を探すことになります。エラーにはならず、意図と違う結果が静かに返ります。
高値を探すなら iHighest + MODE_HIGH + iHigh、安値を探すなら iLowest + MODE_LOW + iLow。3つを揃えてください。
戻り値を確認する
取得に失敗すると負の値が返ります。チェックせずに iHigh へ渡すと、おかしな値が入ります。
int idx = iLowest(_Symbol, _Period, MODE_LOW, 50, 1);
if(idx < 0)
{
Print("取得失敗 err=", GetLastError());
return;
}
double lowest = iLow(_Symbol, _Period, idx);
起動直後は履歴がまだ揃っていないことがあります。失敗したらその回は何もせず戻るのが安全です。ログの確認方法はMQL5のPrintとログの場所にまとめています。
何本前かが分かると何ができるか
インデックスが返るのは不便に見えますが、「いつの高値か」が分かるという利点があります。
int idx = iHighest(_Symbol, _Period, MODE_HIGH, 100, 1);
double px = iHigh(_Symbol, _Period, idx);
datetime when = iTime(_Symbol, _Period, idx);
Print("高値 ", px, " は ", idx, "本前(", TimeToString(when), ")");
価格だけでなく時刻も取れるので、「直近の高値がいつ付いたか」「何本間そのままか」といった判定が書けます。
なお iTime が返すのはサーバー時刻です。日本時間との関係はMT5の時刻がずれる理由にまとめています。
ZigZagと同じ考え方
MT5に同梱されている標準のZigZagも、内部では同じやり方で極値を選んでいます。
val = low[Lowest(low, InpDepth, shift)];
「指定した本数の中で最も安い足を探し、その位置の価格を取る」という構造です。Depth という設定は、この「本数」に相当します。
つまり iHighest / iLowest を理解すると、ZigZagが何をしているかが読めるようになります。設定値の意味はMT5のZigZag設定の意味にまとめました。
自分で書くか、ZigZagを使うか
| 特徴 | |
|---|---|
iHighest / iLowest |
範囲を自分で決める。結果が後から変わらない |
| ZigZag | 連続した波として拾える。直近の点は後から書き換わる |
検証データとして書き出す場合、この違いが効きます。後から変わらない方が扱いやすい場面は多いです。ZigZagの値を書き出す時の注意点はMT5のZigZagをCSVに出力する方法にまとめています。
配列で受け取って自分で走査する方法はMQL5で足データを取得する方法を参照してください。
まとめ
- 🔴 返るのはインデックス(何本前か)。価格ではない
- 価格は
iHigh/iLowにそのインデックスを渡して取る - 確定足だけを見るなら
startを 1 にする - 🔴
MODE_HIGHとMODE_LOWの取り違えはエラーにならない iTimeと組み合わせると「いつの高値か」が分かる
本記事はMQL5の仕様と実装方法を説明したものであり、特定の売買を推奨するものではありません。仕様はビルドによって変わる可能性があります。投資判断はご自身の責任で行ってください。


