1. ArraySetAsSeries関数の概要と実務での活用法
MQL5でシステムトレードを開発する際、避けて通れないのが「配列の並び順」の制御です。ArraySetAsSeriesは、配列のインデックス(添字)の向きを、通常の「古いもの順(時系列)」から「新しいもの順(時系列の逆順)」へと変更するための関数です。
実務での役割
MT5(MQL5)のデフォルトでは、動的配列はインデックス0が最も古く、数値が増えるほど新しいデータになります。しかし、テクニカル分析の現場では「現在の足(最新)をインデックス0」として扱いたいケースが大半です。
たとえば、移動平均線の「1本前の値」を参照したい時、この関数を使って「時系列設定」を有効にしておけば、buffer[1]と記述するだけで直近の確定足データに直感的にアクセスできるようになります。
初心者がつまずきやすいポイント
MQL4から移行した開発者は、MT4のインジケーターバッファがデフォルトで時系列(最新が0)だったため、MQL5でCopyBufferやCopyRatesを使った際に「データが逆転している」ことに混乱しがちです。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. 使用上の注意点とよくあるエラー
開発時に注意すべき重要なポイントがいくつかあります。
- 多次元配列には使用不可:
ArraySetAsSeriesは1次元配列にのみ適用可能です。2次元以上の配列に対して実行しようとすると、エラーになります。 - 静的配列には使用不可:
double arr[10];のようにサイズを固定した静的配列には適用できません。必ずdouble arr[];のように宣言された動的配列を使用してください。 - メモリ構造そのものは変わらない:
この関数はメモリ上のデータの並び替え(ソート)を行うわけではありません。あくまで「インデックスの読み替えルール」を変更するだけのフラグ設定であるため、処理負荷は極めて低いです。 - CopyBuffer関数の挙動:
インジケーターのバッファから値をコピーする際、コピー先の配列をあらかじめArraySetAsSeries(true)にしておかないと、データの順序が意図したもの(最新が0)にならないため注意が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムの論理的な正しさと同じくらい、あるいはそれ以上に重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを運用する場合、プロバイダー経由のネットワーク遅延(レイテンシ)は避けられず、これが致命的な損失を招くことがあります。MQL5でコンマ秒単位の価格変化を捉えるコードを書いても、自宅からの注文が証券会社のサーバーに届くまでに数十〜数百ミリ秒かかれば、画面上の価格と実際の約定価格に乖離(スリッページ)が生じ、バックテスト通りの利益を出すことは不可能です。
極限まで約定スピードを高め、エッジを維持するには、証券会社のサーバーと同じデータセンター内、あるいは物理的に極めて近い距離にある「専用のVPS(仮想専用サーバー)」での運用が必須です。専用VPSを利用することで、物理的な距離に起因する遅延を最小限に抑え、ネットワークの安定性を確保できるため、プロのクオンツエンジニアにとってVPSの導入は「オプション」ではなく、トレードにおける「生命線」と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント