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

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

MQL5におけるCopyRealVolume関数は、指定した通貨ペアや銘柄の「実ボリューム(出来高)」データを取得するための関数です。

FXのメタトレーダー(MT4/MT5)で一般的に使われる「ティックボリューム(価格の更新回数)」とは異なり、CopyRealVolumeは取引された実際の数量(株数やコントラクト数など)を取得します。

実務での活用シーン

  • 需給バランスの分析: 価格の動きだけでなく、実際にどれだけの資金が投入されたかを分析することで、トレンドの信頼性を測ります。
  • VWAP(出来高加重平均価格)の計算: 実ボリュームが取得できる銘柄(先物CFDや株式など)において、より精度の高いインジケーターを作成する際に必須となります。
  • 大口の動向察知: ティック回数は少ないのに実ボリュームが急増している場所を特定し、大口投資家の仕込みを推測します。

つまずきやすいポイント

多くのFX業者の場合、FX銘柄については「実ボリューム」を提供していません。そのため、この関数を使ってもデータが「0」しか返ってこないという事象によく遭遇します。開発時は、取引しているブローカーがその銘柄で実ボリュームを配信しているかを事前に確認することが重要です。


2. 構文と戻り値

CopyRealVolume関数には、取得したいデータの指定方法に合わせて3つのオーバーロード(書き方)があります。

基本構文

// 1. 開始位置と個数を指定する場合
int CopyRealVolume(
   string           symbol_name,      // 銘柄名(NULLなら現在の銘柄)
   ENUM_TIMEFRAMES  timeframe,        // 時間足(0なら現在の時間足)
   int              start_pos,        // 開始位置(0が最新のバー)
   int              count,            // 取得する個数
   long             volume_array[]    // コピー先の配列(long型)
);

// 2. 開始日時と個数を指定する場合
int CopyRealVolume(string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, int count, long volume_array[]);

// 3. 開始日時と終了日時を指定する場合
int CopyRealVolume(string symbol_name, ENUM_TIMEFRAMES timeframe, datetime start_time, datetime stop_time, long volume_array[]);

戻り値

  • 成功時: コピーされた要素の数(0以上の整数)。
  • 失敗時: -1 を返します。

取得したデータは long 型(64ビット整数)の配列に格納されます。ボリュームは非常に大きな数値になる可能性があるため、int 型ではなく必ず long 型を使用してください。


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

以下は、最新の5本分のバーから実ボリュームを取得し、エキスパートログに出力するシンプルなサンプルです。

void OnTick()
{
    // ボリュームを格納する動的配列
    long vol_data[];

    // 配列を時系列順(最新がインデックス0)に設定
    ArraySetAsSeries(vol_data, true);

    // 現在の銘柄・時間足で最新から5本分を取得
    int copied = CopyRealVolume(_Symbol, _Period, 0, 5, vol_data);

    // データの取得に失敗した場合
    if(copied <= 0)
    {
        Print("ボリュームデータの取得に失敗しました。エラーコード: ", GetLastError());
        return;
    }

    // 取得したデータの表示
    for(int i = 0; i < copied; i++)
    {
        PrintFormat("バー[%d] の実ボリューム: %lld", i, vol_data[i]);
    }

    // もし実ボリュームが常に0なら、そのブローカーは実ボリュームを提供していません
    if(vol_data[0] == 0)
    {
        Print("警告: この銘柄の実ボリュームは0です。ティックボリュームの使用を検討してください。");
    }
}

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

① 配列の時系列順に注意

デフォルトの配列(ArraySetAsSeriesをしていない状態)では、インデックス0が一番古いデータになります。最新のバーを0として扱いたい場合は、必ず ArraySetAsSeries(vol_data, true) を実行してください。

② ブローカーによるデータ配信の有無

前述の通り、一般的なFX(ドル円など)では実ボリュームは提供されないことが多いです。その場合は CopyTickVolume(ティックボリューム取得)を使うのが標準的な回避策です。ゴールド(XAUUSD)や指数先物、株式CFDなどで活用するのが一般的です。

③ 履歴データの未ロード

MT5を起動直後や、新しい時間足に切り替えた直後は、過去のヒストリーデータがPCにダウンロードされていないことがあります。この場合、CopyRealVolume は -1 を返したり、要求した数より少ない数を返したりします。実運用では「戻り値が要求数と一致するか」をチェックするガードコードを入れるのが定石です。


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

アルゴリズムトレードにおいて、ロジックの正確さ以上に収益を左右するのが「実行環境の物理的な距離」です。自宅のPCや一般的な汎用クラウドサーバーでEAを稼働させる場合、インターネット網の複雑な経路を経由するため、ブローカーのサーバーに注文が届くまでに数十〜数百ミリ秒の遅延(レイテンシ)が発生します。

このわずかな遅延が、スリッページを引き起こし、バックテストでは勝てている手法を「リアル口座で負けるシステム」へと変貌させます。特にボリュームの急増をトリガーにする戦略では、一瞬の判断遅れが致命傷になりかねません。約定スピードを極限まで高め、優位性を確保するためには、ブローカーの取引サーバーに物理的に近い場所に設置された「FX専用のVPS(仮想専用サーバー)」の導入が不可欠です。ネットワーク遅延を1ミリ秒単位で削ぎ落とすことこそが、クオンツエンジニアが最初に行うべき最適化と言えます。

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

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

コメント

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