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

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

ArraySize関数は、MQL5で扱う「配列の全要素数」を取得するための非常に基本的かつ重要な関数です。

実務開発において、この関数が活躍するのは主に動的配列(サイズが固定されていない配列)を扱う場面です。FXのシステムトレードでは、過去の価格データ(レート)やティックデータ、あるいは計算したインジケーターの値などを配列に格納しますが、取得できるデータ数は相場状況や通信環境によって変動することがあります。

初心者がよく陥るミスとして、「100個のデータを取得するつもりで、ループ処理をi < 100と固定値で書いてしまう」ことがあります。しかし、何らかの理由でデータが90個しか取得できなかった場合、配列外参照(Out of range)エラーが発生し、EAが停止してしまいます。ArraySizeを使って「今、実際に配列にいくつデータが入っているか」を常に確認するように組むことで、堅牢で止まりにくいEA(エキスパートアドバイザー)を開発することができます。

2. 構文と戻り値

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

int ArraySize(
   const void&  array[]   // チェックしたい配列
);
  • 引数(array[]): サイズを確認したい配列を指定します。型は問わず、int型、double型、構造体配列など、あらゆる配列を渡せます。
  • 戻り値: 配列内の全要素数を int 型で返します。

※多次元配列(例: double data[10][2])を渡した場合、1次元目の要素数ではなく、全要素の合計(この場合は20)が返される点に注意してください。

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

以下のコードは、過去のロウソク足データを取得し、そのサイズに応じて安全にループ処理を行うEAのテンプレートです。

void OnTick()
{
    // MqlRates構造体の配列を宣言(動的配列)
    MqlRates rates[];

    // 最新のロウソク足から10本分を取得を試みる
    // CopyRatesは実際に取得できた数を返すが、今回はArraySizeの解説のため配列からサイズを取る
    int copied = CopyRates(_Symbol, _Period, 0, 10, rates);

    if(copied <= 0)
    {
        Print("データの取得に失敗しました。");
        return;
    }

    // ArraySizeを使用して、実際に配列に格納されている要素数を取得
    int size = ArraySize(rates);

    // 配列の要素数分だけループ処理を行う
    // これにより「配列外参照」のエラーを確実に防ぐことができる
    for(int i = 0; i < size; i++)
    {
        PrintFormat("インデックス[%d]: 終値 = %f", i, rates[i].close);
    }

    PrintFormat("現在の配列のサイズは %d です。", size);
}

このサンプルでは、CopyRatesで取得したデータ数をArraySizeで再確認しています。実戦的なコードでは、このように「実際に確保されているメモリサイズ」に基づいてループを回すのが鉄則です。

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

① 多次元配列での挙動

前述の通り、ArraySizeは「全要素の合計」を返します。

double my_array[5][2];
Print(ArraySize(my_array)); // 結果は「10」になります

特定の次元(例えば1次元目の「5」)だけを知りたい場合は、ArrayRange関数を使用してください。

② 計算負荷の最適化

forループの条件式の中に直接 ArraySize(array) を書くと、ループのたびに関数が呼び出されます。配列のサイズが変わらないループであれば、以下のように一度変数に代入してから使う方が、わずかですが処理が高速化されます。

// 微妙に遅い
for(int i = 0; i < ArraySize(data); i++) { ... }

// 推奨
int count = ArraySize(data);
for(int i = 0; i < count; i++) { ... }

③ 動的配列の初期化忘れ

ArrayResizeを行っていない動的配列に対して ArraySize を呼ぶと 0 が返ります。意図しない 0 戻り値によって、後続の計算がスキップされるロジックになっていないか注意しましょう。

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

アルゴリズムトレードにおいて、ArraySizeなどの関数を使いこなし、どれほどロジックを最適化したとしても、実行環境が貧弱であればその努力は水の泡となります。特に、日本の自宅PCから海外のFXサーバーへ接続して運用する場合、物理的な距離に起因する「ネットワーク遅延(レイテンシ)」が致命的なリスクとなります。相場の急変時に、プログラムがミリ秒単位で発注の判断を下しても、自宅の不安定な回線では約定までに数百ミリ秒のタイムラグが発生し、意図しない価格での約定(スリッページ)やリクオートを招くからです。

プロレベルのクオンツエンジニアが、自宅PCでの24時間稼働を絶対に避けるのは、電気代や停電リスクだけが理由ではありません。真の目的は、ブローカーの取引サーバーと同じデータセンター内、あるいは至近距離に設置された「専用のVPS(仮想専用サーバー)」を利用することで、ネットワーク遅延を極限までゼロに近づけることにあります。1ミリ秒の遅れが年間収支を大きく左右する自動売買の世界において、高速で安定したVPS環境の構築は、手法の開発と同じ、あるいはそれ以上に優先すべき投資と言えます。

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

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

コメント

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