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

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

MQL5プログラミングにおいて、配列の「並び順(インデックスの方向)」を正しく把握することは、バグのないロジックを組む上で極めて重要です。ArrayIsSeries関数は、指定した配列が「時系列形式(Series)」として扱われているかどうかを確認するための関数です。

MQL4から移行してきた開発者が最もつまずきやすいのが、この「配列の向き」の違いです。
* 通常の配列: インデックス 0 が最も古いデータ([0, 1, 2…])
* 時系列形式の配列: インデックス 0 が最新のデータ(現在のバー)

実務では、CopyRatesCopyBufferで取得したデータに対して、自分が意図した向き(最新バーを0として扱いたいのか、古い順に処理したいのか)になっているかを検証するために使用します。特に、複数の関数を跨いで配列をやり取りする複雑なEAやインジケーターの開発において、「今の配列の向き」を条件分岐で判定する際の安全装置として重宝します。

2. 構文と戻り値

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

bool ArrayIsSeries(
   const void&  array[]    // チェック対象の配列
);

パラメーター

  • array[]: チェックしたい配列を指定します。動的配列、静的配列、あるいはインジケーターのバッファ配列などが対象となります。

戻り値

  • true: 配列が時系列形式(インデックス0が最新データ)である場合。
  • false: 配列が通常の形式(インデックス0が一番古いデータ)、または時系列設定がされていない場合。

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

以下のサンプルコードは、価格データを取得し、その配列が時系列形式かどうかを判定した上で、必要に応じて並び順を変更する実戦的なスクリプトです。

void OnStart()
{
    // 価格データを格納する動的配列
    double closePrices[];

    // 最新の5本分の終値を取得
    if(CopyClose(_Symbol, _Period, 0, 5, closePrices) < 0)
    {
        Print("データの取得に失敗しました。エラーコード: ", GetLastError());
        return;
    }

    // --- チェック1: 初期状態の確認 ---
    if(ArrayIsSeries(closePrices))
    {
        Print("この配列は【時系列形式】です(0が最新)");
    }
    else
    {
        Print("この配列は【通常形式】です(0が最古)");
    }

    // 実際の値を出力して確認
    Print("Index[0]の値: ", closePrices[0]);

    // --- 処理: 配列を時系列形式にセットする ---
    ArraySetAsSeries(closePrices, true);

    // --- チェック2: 変更後の確認 ---
    if(ArrayIsSeries(closePrices))
    {
        Print("設定変更後:【時系列形式】になりました。");
        Print("新しいIndex[0]の値(最新の終値): ", closePrices[0]);
    }
}

このコードを実行すると、デフォルトのCopyCloseで取得した配列は通常形式(false)ですが、ArraySetAsSeriesを実行した後はArrayIsSeriestrueを返すようになります。

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

開発中によく遭遇するトラブルとして、以下の2点に注意してください。

  1. 「時系列形式 = ソートされている」ではない
    ArrayIsSeriesはあくまで「インデックスの参照方向」を返すだけであり、中身の数値が昇順や降順に並んでいるかを保証するものではありません。時系列フラグを立てると、単に配列へのアクセス順序が逆転するだけです。

  2. 多次元配列には適用不可
    この関数は1次元配列に対して使用することを前提としています。多次元配列を渡した場合、期待した結果が得られない、あるいはコンパイルエラーの原因となります。

  3. ArraySetAsSeriesとのセット運用
    ArrayIsSeriesは「確認用」です。もし意図した向きでなければ、必ずArraySetAsSeries関数を使って明示的に方向を指定するようにしましょう。「おそらく時系列になっているはずだ」という思い込みが、バックテストと実運用で結果が乖離する原因(先読みバグなど)を生みます。

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

アルゴリズムの論理的整合性をArrayIsSeriesで担保できたとしても、それだけではプロのトレード環境としては不十分です。FXの自動売買において、プログラムの実行速度と同じくらい重要なのが「物理的なネットワーク遅延(レイテンシ)」です。

自宅のPCや一般的な共有サーバーでEAを稼働させる場合、証券会社のサーバーとの間に数十から数百ミリ秒の遅延が発生します。この遅延の間に価格は変動し、本来約定すべき価格から滑る(スリッページ)、あるいはリクオートされることで、ロジックが完璧でも期待期待値がマイナスに転じることは珍しくありません。極限まで約定スピードを高め、優位性を確保するためには、証券会社のデータセンターに近い場所に位置する「専用のVPS(仮想専用サーバー)」の導入が必須です。コンマ数秒を争うクオンツの世界では、インフラ環境への投資が勝敗を分ける決定的な要因となります。

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

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

コメント

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