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を使わないと、このロジックは再現できません。

コメント