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

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

MQL5のArrayMaximumは、配列の中から「最大値を持つ要素のインデックス(番号)」を探し出す関数です。

実務レベルの開発、特にEA(自動売買エージェント)のロジック構築においては、以下のような場面で頻繁に使用されます。
* 直近の最高値の取得: 過去20本(20期間)のローソク足の中で、最も高い価格を見つける。
* ブレイクアウト戦略: 直近の高値を更新したタイミングでエントリーするトリガーとして利用。
* 損切りの設定: 過去数日間の最高値の少し上にストップロスを置く。

初心者の方が陥りやすいミスとして、「この関数は最大値(価格)そのものを返すのではなく、何番目の箱に最大値が入っているか(インデックス)を返す」という点があります。実際の価格を知るには、取得したインデックスを使って再度配列にアクセスする必要があることを覚えておきましょう。

2. 構文と戻り値

ArrayMaximum関数の構文は以下の通りです。

int ArrayMaximum(
   const void&  array[],    // 検索対象の配列
   int          start=0,    // 検索を開始するインデックス
   int          count=WHOLE_ARRAY // 検索する要素数(デフォルトは最後まで)
);

パラメーター解説

  1. array[]: 数値が格納された配列(double型やint型など)を指定します。
  2. start: 配列のどの位置から検索を始めるかを指定します。0なら最初から、10なら10番目の要素からです。
  3. count: 検索する範囲の長さです。例えば「5」を指定すれば、startから数えて5つの要素内を調べます。

戻り値

  • 見つかった最大値のインデックス番号を返します。
  • エラーが発生した場合は「-1」を返します。

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

以下のコードは、直近20本のローソク足の最高値を検索し、その価格を取得してチャート上に表示する実践的な例です。

void OnTick()
{
    // 1. 高値を格納するための配列を用意
    double highPrices[];

    // 2. 配列を時系列(最新が[0]になるよう)にセット
    ArraySetAsSeries(highPrices, true);

    // 3. 過去20本分の高値データを配列にコピー
    // 第1引数:通貨ペア、第2引数:時間足、第3引数:開始位置、第4引数:個数、第5引数:コピー先
    if(CopyHigh(_Symbol, _Period, 0, 20, highPrices) < 0)
    {
        Print("高値データのコピーに失敗しました。");
        return;
    }

    // 4. ArrayMaximumで最大値の「インデックス」を取得
    // 0番目(最新)から20本分を検索
    int maxIndex = ArrayMaximum(highPrices, 0, 20);

    // 5. 取得したインデックスを使って実際の「価格」を取り出す
    if(maxIndex != -1)
    {
        double highestValue = highPrices[maxIndex];

        // チャート左上にコメント表示
        Comment("直近20本の最高値のインデックス: ", maxIndex, "\n",
                "直近20本の最高値: ", highestValue);
    }
}

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

インデックスと値の混同

前述の通り、ArrayMaximumが返すのは「何番目か」です。double maxPrice = ArrayMaximum(highPrices); と書いてしまうと、maxPriceにはインデックス番号(例:5.0)が入ってしまい、価格として扱うと全く異なる値になります。必ず highPrices[maxIndex] のように記述しましょう。

ArraySetAsSeriesの影響

MQL5では、CopyHighなどで取得した配列の並び順に注意が必要です。ArraySetAsSeries(array, true) を実行していない場合、インデックス[0]は「最も古いデータ」を指します。MT4の感覚で「最新の足=0番目」として扱いたい場合は、必ず ArraySetAsSeries を適用する癖をつけましょう。

配列のサイズ不足

指定した startcount が、実際の配列のサイズを超えている場合、エラーが発生します。配列を動的に扱う場合は、事前に ArraySize() 関数で現在の要素数を確認するようにしてください。

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

アルゴリズムトレードにおいて、ArrayMaximumなどの関数を使いこなして精度の高いロジックを組むことは重要ですが、それ以上に重要なのが「取引環境」です。どれほど完璧なエントリー判断をプログラムが行っても、自宅のPCから一般的なインターネット回線を通じて注文を出している場合、FX業者のサーバーに届くまでに数十〜数百ミリ秒の遅延(レイテンシ)が発生します。このわずかな遅延の間に価格が滑り、本来得られるはずだった利益が削られ、あるいは損失に転じる「スリッページ」が致命的な問題となります。

特に秒単位で優位性を競うシステムトレードにおいて、ネットワーク遅延は物理的な壁です。この壁を打破し、プロレベルの約定スピードを実現するためには、FX業者のデータセンターに物理的に近い場所に設置された「専用のVPS(仮想専用サーバー)」での稼働が必須条件となります。安定した電源、24時間の稼働保証、そして極限まで抑えられたネットワーク遅延を備えたVPS環境を構築して初めて、あなたの書いたロジックは真のパフォーマンスを発揮することができるのです。

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

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

コメント

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