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

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

iHigh関数は、指定した通貨ペアおよび時間足における「高値」を取得するためのMQL5組み込み関数です。

実務開発において、高値の情報は単に「一番高い価格」を知るためだけではなく、以下のようなロジックの核として活用されます。
ブレイクアウト手法: 前日の高値を更新した瞬間にエントリーする。
トレーリングストップ: 直近数本のローソク足の高値に合わせて損切りラインを引き上げる(ショートポジションの場合)。
ボラティリティの測定: 高値と安値の差(値幅)を計算し、市場の過熱感を判定する。

初心者が特につまずきやすいポイントは、「MQL4との仕様の違い」です。かつてのMQL4ではHigh[]という配列で簡単にアクセスできましたが、MQL5ではより厳格なデータアクセスが求められます。iHighはMQL5の中でも「簡略化された関数」のひとつですが、呼び出し時にデータが準備できていない場合の処理(エラーハンドリング)を怠ると、予期せぬ計算ミスやバックテストと実運用での乖離を招く原因となります。


2. 構文と戻り値

iHigh関数の基本的な構文は以下の通りです。

double  iHigh(
   string           symbol,          // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES  timeframe,       // 時間足(PERIOD_CURRENTで現在の時間足)
   int              shift            // シフト(0が現在の足、1が1本前の足)
   );

パラメーター解説

  1. symbol: 対象とする通貨ペアを指定します。_Symbol または NULL を指定すると、現在EAを動かしているチャートの通貨ペアが選択されます。
  2. timeframe: 取得したい時間足を指定します(例:PERIOD_H1で1時間足)。
  3. shift: どのローソク足の高値を取得するかを指定します。
  4. 0: 現在形成中の足
  5. 1: 1本前の確定足
  6. 2: 2本前の確定足(以下同様)

戻り値

  • 指定された条件の高値(double型)を返します。
  • データの取得に失敗した場合(履歴データが未ダウンロードなど)は 0.0 を返します。

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

以下は、1本前のローソク足の高値を現在の価格が上抜いた(ブレイクアウトした)場合にログを出力する、非常にシンプルで実用的なコード例です。

//+------------------------------------------------------------------+
//|                                              SimpleBreakout.mq5  |
//|                                  Copyright 2023, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

// 毎ティックごとに実行される関数
void OnTick()
{
    // 1. 前回の確定足(1本前)の高値を取得
    double previousHigh = iHigh(_Symbol, PERIOD_CURRENT, 1);

    // 2. エラーチェック(データが取得できない場合は戻り値が0になる)
    if(previousHigh <= 0)
    {
        Print("データの取得に失敗しました。");
        return;
    }

    // 3. 現在の価格(Ask)を取得
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

    // 4. ブレイクアウト判定
    // 現在の価格が1本前の高値を超えたらメッセージを表示
    if(currentPrice > previousHigh)
    {
        Print("【ブレイク発生】現在の価格が前足の高値を更新しました。 Target:", previousHigh);

        // ここにオーダー送信(OrderSend)などの処理を記述するのが一般的です
    }
}

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

開発時に注意すべき点は、「データの同期」です。

  1. ゼロ値のチェック:
    MT5を起動した直後や、新しい通貨ペアのデータを参照しようとした際、iHigh0.0 を返すことがあります。これはヒストリーデータがPC内にまだダウンロードされていないために起こります。実運用では必ず if(highValue == 0) のようなチェックを行い、計算をスキップするロジックを組んでください。

  2. シフト(インデックス)の数え方:
    shiftは常に「0」が最新の(動いている)足であることを忘れないでください。テクニカル指標の計算に「確定した値」を使いたい場合は、必ず shift1 以上を指定する必要があります。

  3. 型への配慮:
    高値は価格データ(double型)です。比較演算(><)を行う際は問題ありませんが、文字列として表示したり計算したりする場合、小数点以下の桁数(Digits)に注意してください。


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

クオンツエンジニアとして忠告しておかなければならないのは、コードの最適化以上に「実行環境の物理的な距離」が勝敗を分けるという事実です。iHighなどの関数で正確なブレイクアウトを検知できたとしても、ご家庭のPC環境から注文を出しているようでは、プロの世界では勝負になりません。

自宅PCでの運用は、ネットワーク経路における「ジッター(遅延の揺らぎ)」や予期せぬWindowsアップデート、停電などのリスクに常にさらされています。特にFXの自動売買では、ミリ秒単位の遅延がスリッページを引き起こし、本来得られるはずだった利益を削り取ります。プロのアルゴリズムトレーダーが例外なく「専用のVPS(仮想専用サーバー)」を利用するのは、取引サーバーの目と鼻の先にシステムを置くことで、物理的な遅延を極限まで排除し、安定した約定スピードを確保するためです。勝つためのシステムを構築するなら、まずはインフラをプロ仕様に整えることが不可欠です。

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

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

コメント

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