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

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

MQL5でシステムトレードを開発する際、避けて通れないのが「配列の並び順」の制御です。ArraySetAsSeriesは、配列のインデックス(添字)の向きを、通常の「古いもの順(時系列)」から「新しいもの順(時系列の逆順)」へと変更するための関数です。

実務での役割
MT5(MQL5)のデフォルトでは、動的配列はインデックス0が最も古く、数値が増えるほど新しいデータになります。しかし、テクニカル分析の現場では「現在の足(最新)をインデックス0」として扱いたいケースが大半です。
たとえば、移動平均線の「1本前の値」を参照したい時、この関数を使って「時系列設定」を有効にしておけば、buffer[1]と記述するだけで直近の確定足データに直感的にアクセスできるようになります。

初心者がつまずきやすいポイント
MQL4から移行した開発者は、MT4のインジケーターバッファがデフォルトで時系列(最新が0)だったため、MQL5でCopyBufferCopyRatesを使った際に「データが逆転している」ことに混乱しがちです。MQL5では、プログラマが明示的にこの関数を呼び出す必要があります。

2. 構文と戻り値

ArraySetAsSeries関数の仕様は非常にシンプルです。

bool ArraySetAsSeries(
   const void&  array[],    // 設定対象の配列
   bool         flag        // true: 時系列(最新が0)、false: 通常(最古が0)
);
  • 第一引数(array[]): 向きを変更したい配列を指定します。動的配列である必要があります。
  • 第二引数(flag): 時系列フラグを指定します。trueに設定すると、インデックス0が最新の要素を指すようになります。
  • 戻り値: 設定に成功した場合は true、失敗した場合は false を返します。

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

以下は、最新のローソク足3本分の終値(Close)を取得し、ArraySetAsSeriesを使って直近の値を簡単に取り出すEA(エキスパートアドバイザー)のサンプルです。

//+------------------------------------------------------------------+
//|                                              SampleAsSeries.mq5  |
//+------------------------------------------------------------------+
void OnTick()
{
    // 終値を格納するための動的配列
    double closePrices[];

    // 1. 配列を時系列設定にする(最新の足がインデックス0になる)
    ArraySetAsSeries(closePrices, true);

    // 2. 最新の3本分の終値データを取得
    // _Symbol: 通貨ペア, _Period: 時間軸, 0: 開始位置, 3: 取得数, closePrices: 格納先
    if(CopyClose(_Symbol, _Period, 0, 3, closePrices) < 0)
    {
        Print("データの取得に失敗しました。エラーコード:", GetLastError());
        return;
    }

    // 3. 値を出力して確認
    // 時系列設定が有効なので、[0]が現在動いている足、[1]が1本前の確定足になる
    double currentClose = closePrices[0];  // 最新の価格
    double lastClose    = closePrices[1];  // 1本前の終値
    double prevClose    = closePrices[2];  // 2本前の終値

    PrintFormat("現在足の終値: %.5f", currentClose);
    PrintFormat("1本前の終値: %.5f", lastClose);
    PrintFormat("2本前の終値: %.5f", prevClose);
}

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

開発時に注意すべき重要なポイントがいくつかあります。

  1. 多次元配列には使用不可:
    ArraySetAsSeriesは1次元配列にのみ適用可能です。2次元以上の配列に対して実行しようとすると、エラーになります。
  2. 静的配列には使用不可:
    double arr[10]; のようにサイズを固定した静的配列には適用できません。必ず double arr[]; のように宣言された動的配列を使用してください。
  3. メモリ構造そのものは変わらない:
    この関数はメモリ上のデータの並び替え(ソート)を行うわけではありません。あくまで「インデックスの読み替えルール」を変更するだけのフラグ設定であるため、処理負荷は極めて低いです。
  4. CopyBuffer関数の挙動:
    インジケーターのバッファから値をコピーする際、コピー先の配列をあらかじめ ArraySetAsSeries(true) にしておかないと、データの順序が意図したもの(最新が0)にならないため注意が必要です。

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

アルゴリズムの論理的な正しさと同じくらい、あるいはそれ以上に重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを運用する場合、プロバイダー経由のネットワーク遅延(レイテンシ)は避けられず、これが致命的な損失を招くことがあります。MQL5でコンマ秒単位の価格変化を捉えるコードを書いても、自宅からの注文が証券会社のサーバーに届くまでに数十〜数百ミリ秒かかれば、画面上の価格と実際の約定価格に乖離(スリッページ)が生じ、バックテスト通りの利益を出すことは不可能です。

極限まで約定スピードを高め、エッジを維持するには、証券会社のサーバーと同じデータセンター内、あるいは物理的に極めて近い距離にある「専用のVPS(仮想専用サーバー)」での運用が必須です。専用VPSを利用することで、物理的な距離に起因する遅延を最小限に抑え、ネットワークの安定性を確保できるため、プロのクオンツエンジニアにとってVPSの導入は「オプション」ではなく、トレードにおける「生命線」と言えます。

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

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

コメント

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