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

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

MQL5におけるiHighest関数は、指定した範囲内のチャートバー(または指標バッファ)の中で、「最大値を持つバーのインデックス(番号)」を取得するための関数です。

実務レベルのEA(エキスパートアドバイザー)開発において、この関数は単に「高値を探す」以上の重要な役割を担います。例えば、直近20期間の最高値を更新したタイミングでの「ブレイクアウト手法」の実装や、過去の一定期間の最高値を基準にした「トレーリングストップの設置」などが代表的な活用例です。

初心者が特につまずきやすいポイントは、「この関数が返すのは価格そのものではなく、バーの場所(インデックス)である」という点です。価格を取得するには、iHighestで得たインデックスを元にiHigh関数やCopyHigh関数と組み合わせる必要があります。この2ステップの構造を理解することが、クオンツ・エンジニアとしての第一歩です。

2. 構文と戻り値

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

int iHighest(
   string           symbol,          // 通貨ペア名(NULLで現在の通貨)
   ENUM_TIMEFRAMES  timeframe,       // 時間軸(PERIOD_CURRENTで現在の足)
   ENUM_SERIESMODE  type,            // データの種類(MODE_HIGHなど)
   int              count=WHOLE_ARRAY, // 検索対象のバー数
   int              start=0          // 検索開始位置(インデックス)
);

パラメーターの解説

  • symbol: 対象とする通貨ペアを指定します。
  • timeframe: どの時間足で探すかを指定します。
  • type: どのデータから最大値を探すかを選択します。通常は高値を示す MODE_HIGH を使用しますが、始値(MODE_OPEN)や安値(MODE_LOW)、終値(MODE_CLOSE)なども指定可能です。
  • count: 過去何本分のバーを遡るかを指定します。
  • start: どのバーから遡り始めるかを指定します。現在のバーを含めるなら0、確定した前の足からなら1を指定します。

戻り値

  • 成功した場合:指定範囲内で最大値を持つバーのインデックス番号を返します。
  • 失敗した場合:-1 を返します。

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

以下は、直近20本のバー(現在の足を除く)の中から最高値を見つけ出し、その価格を取得してエントリーの判断や損切りラインの決定に利用する実践的なコード例です。

void OnTick()
{
    // 検索範囲(直近20本)
    int lookback = 20;
    // 検索開始位置(1:確定済みの1本前の足から開始)
    int offset = 1;

    // 1. 直近20本の中で最高値を持つバーの「インデックス」を取得
    int highestIndex = iHighest(_Symbol, _Period, MODE_HIGH, lookback, offset);

    // エラーチェック
    if(highestIndex != -1)
    {
        // 2. インデックスを元に、実際の最高値(価格)を取得
        double highestPrice = iHigh(_Symbol, _Period, highestIndex);

        // 3. コンソールに出力(実務ではここでエントリー判断などを行う)
        PrintFormat("過去 %d 本の最高値は、%d 本前のバーにある %.5f です。", 
                    lookback, highestIndex, highestPrice);

        // 応用例:現在の価格が過去20本の最高値を上回ったらブレイクアウトと判断
        double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
        if(currentBid > highestPrice)
        {
            Print("最高値を更新しました。ロングエントリーを検討します。");
        }
    }
    else
    {
        Print("iHighestの実行に失敗しました。エラーコード:", GetLastError());
    }
}

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

開発現場でよく遭遇するミスを回避するためのヒントをまとめます。

  1. 時系列順序の勘違い:
    MQL5のインデックスは、最新のバーが「0」、過去に遡るほど数値が大きくなる「時系列(タイムシリーズ)」形式です。iHighestで返ってくるインデックスもこの規則に従います。

  2. 価格とインデックスの混同:
    前述の通り、iHighestは「145.50」といった価格を返しません。「15番目のバーが一番高かった」という「15」という数値を返します。必ずiHigh()などとセットで使う癖をつけてください。

  3. データ未ロードによるエラー:
    EAを起動した直後や、異なる時間足に切り替えた直後は、ヒストリカルデータが十分にロードされていないことがあります。この場合、iHighestはエラーを返すか、不正確な値を返す可能性があるため、iBars関数などでデータが存在するか確認するのが堅牢なプログラミングです。

  4. WHOLE_ARRAYの使用:
    countWHOLE_ARRAYを指定すると、チャート上のすべてのバーをスキャンします。バックテストや運用環境で計算負荷が高くなる可能性があるため、基本的には必要な期間(例:20や100)を数値で指定することを推奨します。

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

アルゴリズムの論理が完璧であっても、それを実行する環境が「自宅のPC」であれば、プロのクオンツの世界では致命的な欠陥と見なされます。なぜなら、FXの自動売買において最も重要なのはコードの美しさではなく、ブローカーのサーバーへ注文が届くまでの「物理的な距離とネットワーク遅延(レイテンシ)」だからです。

自宅の光回線から海外のブローカーサーバーへ注文を出す場合、数百ミリ秒(0.1秒単位)の遅延が発生することは避けられません。このコンマ数秒の間に、市場価格は数ピップス動き、本来iHighestで計算した最適なエントリーポイントを逃して「スリッページ」による損失を招きます。極限まで約定スピードを高め、エッジ(優位性)を維持するためには、ブローカーのデータセンターに物理的に近い場所に設置された、FX専用のVPS(仮想専用サーバー)を利用することがプロの開発者にとっての「必須条件」です。安定した電源と高速なバックボーンに支えられたVPS環境を構築して初めて、あなたの書いたアルゴリズムはその真価を発揮します。

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

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

コメント

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