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

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

MQL5のArrayFill関数は、指定した配列の特定の範囲内を、指定した数値(値)で一括して埋めるための関数です。

実務開発において、初心者は配列を初期化する際やデータをクリアする際、forループを使って一つずつ要素に値を代入しがちです。しかし、数千から数万要素を持つ配列をループで処理するのはコードが冗長になるだけでなく、実行速度の面でも非効率です。

ArrayFillはMQL5の実行エンジンレベルで最適化されており、「計算用バッファのリセット」「統計データの初期化」「インジケーターの描画バッファを一時的に空にする」といった処理を、極めて高速かつシンプルに記述するために多用されます。特に、直近100本の平均値を出すためのテンポラリ配列をリフレッシュする際など、ロジックのクリーンさを保つために必須の関数と言えます。

2. 構文と戻り値

ArrayFillの構文は以下の通りです。

void ArrayFill(
   void&  array[],      // 対象となる配列(参照渡し)
   int    start,        // 開始インデックス
   int    count,        // 埋める要素の数
   double value         // 埋める値
);

パラメーターの解説

  1. array[]: 値を詰め込みたい配列です。数値型の配列(double, int, floatなど)が一般的に使われます。
  2. start: 詰め込みを開始する位置(インデックス)を指定します。最初の要素から始めたい場合は 0 を指定します。
  3. count: start位置から何個の要素を埋めるかを指定します。
  4. value: 書き込みたい値を指定します。

戻り値

  • なし (void): この関数は処理を実行するだけで、値を返しません。

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

以下は、EA(エキスパートアドバイザー)内で価格データを格納する配列を準備し、特定の条件下でデータをリセット(初期化)する実用的なコード例です。

//+------------------------------------------------------------------+
//|                                              SampleArrayFill.mq5 |
//+------------------------------------------------------------------+
void OnStart()
{
    // 1. 動的配列の宣言
    double priceData[];

    // 2. 配列サイズを10に設定
    ArrayResize(priceData, 10);

    // 3. 全ての要素を「-1.0」で初期化(未使用であることを示すフラグなど)
    // 配列の0番目から10個分を -1.0 で埋める
    ArrayFill(priceData, 0, 10, -1.0);

    // ログに出力して確認
    Print("--- 全初期化後のデータ ---");
    for(int i=0; i<ArraySize(priceData); i++) {
        PrintFormat("Index[%d] = %.1f", i, priceData[i]);
    }

    // 4. 部分的な書き換え(実務でよく使う手法)
    // 3番目(インデックス2)から5個分を「105.50」で埋める
    ArrayFill(priceData, 2, 5, 105.50);

    Print("--- 部分変更後のデータ ---");
    for(int i=0; i<ArraySize(priceData); i++) {
        PrintFormat("Index[%d] = %.2f", i, priceData[i]);
    }
}

このコードでは、最初に配列全体を-1.0という「無効値」で埋めることで、ロジック内で未計算のデータが混入するのを防いでいます。その後、必要な箇所だけを一括で特定の数値に書き換えています。


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

開発時に陥りやすいミスがいくつかあります。

  1. 配列の範囲外アクセス (Out of range)
    start + count の合計が、実際の配列サイズ(ArraySize)を超えてしまうと、実行時エラーが発生してEAが停止します。動的な配列を使用する場合は、必ず ArrayResize で領域を確保した後に ArrayFill を呼び出すようにしてください。

  2. 多次元配列への非対応
    ArrayFill は基本的に1次元配列に対して使用するものです。多次元配列(例: data[10][2])に対して使用すると、メモリ構造上、連続した領域として処理されるため、意図しないインデックスが書き換わるリスクがあります。多次元配列の場合は素直にループ回しを検討するか、1次元配列への変換を検討してください。

  3. 型変換の意識
    value パラメーターは double 型で定義されています。整数型の配列(intなど)に ArrayFill を使う場合、小数点以下は切り捨てられて格納されます。意図しない丸め誤差が発生しないよう注意が必要です。


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

アルゴリズム取引において、ArrayFillなどの関数を使ってコードを0.1ミリ秒高速化させる努力は重要ですが、それ以上に収益を左右するのがネットワーク遅延(レイテンシ)です。自宅のPC環境でEAを稼働させる場合、プロバイダー経由の不安定な通信や、物理的な距離による数ミリ秒から数十ミリ秒の遅延が避けられません。

このわずかな遅延は、ボラティリティが高い局面において、計算した価格と実際の約定価格の「スリッページ」を引き起こし、バックテストでは勝てていても実運用で資金を溶かす致命的な原因となります。極限まで約定スピードを高め、優位性を確保するためには、取引サーバーの至近距離に位置する専用のVPS(仮想専用サーバー)導入が不可欠です。プロのクオンツ環境において、安定した低レイテンシ環境の構築は、アルゴリズムのロジック構築と同等、あるいはそれ以上に優先されるべきインフラ投資と言えます。

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

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

コメント

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