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で足データを取得する方法を参照してください。

まとめ

  1. 🔴 返るのはインデックス(何本前か)。価格ではない
  2. 価格は iHigh / iLow にそのインデックスを渡して取る
  3. 確定足だけを見るなら start を 1 にする
  4. 🔴 MODE_HIGH と MODE_LOW の取り違えはエラーにならない
  5. iTime と組み合わせると「いつの高値か」が分かる

本記事はMQL5の仕様と実装方法を説明したものであり、特定の売買を推奨するものではありません。仕様はビルドによって変わる可能性があります。投資判断はご自身の責任で行ってください。