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

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

MQL5で多次元配列を扱う際、エンジニアが最も頻繁に利用する関数の一つが ArrayRange です。この関数は、「多次元配列の指定した次元の要素数」を取得するために使用されます。

初心者の多くは、配列の全要素数を取得する ArraySize と混同しがちです。しかし、実務レベルのEA開発では、例えば「5つの通貨ペアごとに、直近3本の高値・安値を格納する」といった2次元配列( data[5][2] )を扱う場面が多く、特定の次元(この場合は「通貨ペア数」や「価格データ数」)を正確に把握しなければ、ループ処理で「配列外参照(Out of range)」のエラーを引き起こします。

実務では、動的配列のサイズを ArrayResize で変更した後に、ループの境界条件を動的に取得する際に必須となる、堅牢なコードを書くための守護神のような関数です。

2. 構文と戻り値

ArrayRange 関数の構文は非常にシンプルです。

int  ArrayRange(
   const void&  array[],      // チェックする配列
   int          range_index   // 次元のインデックス(0から始まる)
   );

パラメーター解説

  • array[]: 要素数を調べたい配列を指定します。
  • range_index: 調べたい次元の番号を指定します。
    • 0:最初の次元(例:array[10][20] の「10」の部分)
    • 1:2番目の次元(例:array[10][20] の「20」の部分)

戻り値

指定した次元の要素数を int 型で返します。もし指定した次元が存在しない場合やエラーが発生した場合は 0 を返します。

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

以下は、複数の通貨ペアの価格情報を多次元配列で管理し、ArrayRange を使って安全にループ処理を行う実用的な例です。

//+------------------------------------------------------------------+
//| 複数通貨ペアの価格データを管理するサンプル                               |
//+------------------------------------------------------------------+
void OnStart()
{
   // 2次元配列の宣言 [通貨ペア数][データ種類(0:High, 1:Low)]
   double pairData[3][2];

   // データの代入(例として適当な値を入力)
   pairData[0][0] = 150.50; pairData[0][1] = 150.10; // USDJPY
   pairData[1][0] = 1.0850; pairData[1][1] = 1.0820; // EURUSD
   pairData[2][0] = 190.20; pairData[2][1] = 189.80; // GBPJPY

   // ArrayRangeを使用して各次元の要素数を取得
   int symbolCount = ArrayRange(pairData, 0); // 1次元目(通貨ペア数)を取得
   int dataCount   = ArrayRange(pairData, 1); // 2次元目(データ種類数)を取得

   Print("登録されている通貨ペア数: ", symbolCount); // 結果: 3
   Print("各ペアのデータ項目数: ", dataCount);     // 結果: 2

   // ループ処理での活用(マジックナンバーを避け、動的に範囲を指定できる)
   for(int i = 0; i < symbolCount; i++)
   {
      for(int j = 0; j < dataCount; j++)
      {
         PrintFormat("Index[%d][%d] の価格: %.3f", i, j, pairData[i][j]);
      }
   }
}

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

開発中に陥りやすい罠がいくつかあります。

  1. ArraySizeとの使い分け
    ArraySize は多次元配列であっても「全要素の合計(例:[3][2] なら 6)」を返します。対して ArrayRange は「特定の次元のサイズ(例:[3][2] の1次元目なら 3)」を返します。これを間違えると、ループ回数が過剰になり、不正なメモリへのアクセスが発生します。

  2. インデックスの指定ミス
    range_index は0から始まります。3次元配列の3番目のサイズを知りたい場合は 2 を指定する必要があります。存在しないインデックス(例:1次元配列に対して range_index=1)を指定すると 0 が返るため、戻り値のチェックを怠るとゼロ除算やループ未実行の原因になります。

  3. 動的配列の初期化前参照
    ArrayResize でサイズを決定する前に ArrayRange を呼ぶと、当然ながら 0 が返ります。配列の準備が整ってから呼び出す癖をつけましょう。

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

アルゴリズムトレードにおいて、ArrayRange を使った計算効率化以上に重要なのが「物理的な実行環境」です。どれほど完璧なロジックを組んだとしても、自宅のPCから一般的なインターネット回線でEAを稼働させるのは、プロの視点から見れば極めてリスクが高い行為です。家庭用回線では、ブローカーのサーバーとの間に数百ミリ秒単位のネットワーク遅延(レイテンシ)が発生し、さらに通信の揺らぎ(ジッター)によって、プログラムが意図した価格での約定を逃す「スリッページ」が頻発します。

この遅延は、ボラティリティが高い局面では致命的な損失に直結します。極限まで約定スピードを高め、24時間365日安定したトレードを実現するためには、ブローカーのデータセンターに近い場所に位置する「専用のVPS(仮想専用サーバー)」の利用が不可欠です。インフラに妥協することは、システムの期待値を自ら削り捨てることと同義であると理解してください。

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

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

コメント

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