1. CopyTickVolume関数の概要と実務での活用法
MQL5のCopyTickVolume関数は、指定した通貨ペアおよび時間軸の「ティックボリューム(出来高)」データを配列に取得するための関数です。
FX市場において、株式市場のような「正確な全取引高」を知ることは困難ですが、メタトレーダー(MT5)におけるティックボリュームは「価格が動いた回数」をカウントしており、これが実質的な市場の活性度を示す指標として機能します。
実務での活用シーン:
* トレンドの信頼性確認: 価格上昇時にボリュームが伴っていれば強いトレンド、伴っていなければ「だまし」の可能性が高いと判断します。
* ボラティリティの予兆検知: ボリュームの急増をトリガーに、ブレイクアウト戦略のフィルタリングに使用します。
* 独自インジケーターの開発: VPA(Volume Price Analysis)や、ボリューム加重移動平均などの算出に必須です。
開発者がつまずきやすい点として、「ティックボリューム(価格変化回数)」と「リアルボリューム(実際の取引量)」の混同が挙げられます。FX業者の多くはリアルボリュームを提供していないため、通常はCopyTickVolumeを使用してティックの回転数を確認するのが定石です。
2. 構文と戻り値
CopyTickVolume関数には、取得したいデータの範囲指定の方法によって3つのオーバーロード(書き方)がありますが、最も一般的に使われる「開始位置と個数を指定する形式」を中心に解説します。
基本構文
int CopyTickVolume(
string symbol_name, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES timeframe, // 時間軸(0またはPERIOD_CURRENTで現在の時間軸)
int start_pos, // 開始位置(0が最新のバー)
int count, // コピーする個数
long volume_array[] // コピー先の配列(long型であることに注意)
);
戻り値
- 成功時: コピーされた要素の数(int型)。
- 失敗時: -1 を返します。エラーの詳細は
GetLastError()関数で確認できます。
3. 具体的な使い方・実践サンプルコード
以下は、最新のバーを含む過去20本分のティックボリュームを取得し、直近のボリュームが平均を超えているかを判定する実用的なEAコードの例です。
//+------------------------------------------------------------------+
//| SampleTickVolume.mq5|
//+------------------------------------------------------------------+
void OnTick()
{
// ティックボリュームを格納する動的配列
long volume_data[];
// 配列を時系列順(インデックス0を最新のバー)に設定
ArraySetAsSeries(volume_data, true);
// 現在のチャートのボリュームを20本分取得
// 引数:通貨ペア, 時間軸, 開始位置(0=現在), 取得本数, 格納先
int copied = CopyTickVolume(_Symbol, _Period, 0, 20, volume_data);
// エラーチェック
if(copied <= 0)
{
Print("ボリュームデータの取得に失敗しました。エラーコード: ", GetLastError());
return;
}
// 最新のボリュームと過去の平均を比較するロジック例
long current_volume = volume_data[0];
long sum = 0;
for(int i = 1; i < copied; i++)
{
sum += volume_data[i];
}
double average_volume = (double)sum / (copied - 1);
// ログ出力
if(current_volume > average_volume * 1.5)
{
Print("【警告】現在のティックボリュームが急増しています! Vol:", current_volume);
}
}
4. 使用上の注意点とよくあるエラー
① 配列の型は必ず「long」にする
MQL5において、ティックボリュームは大きな数値になる可能性があるため、int型ではなくlong型(64ビット整数)の配列を使用する必要があります。doubleやintを使用するとコンパイルエラーや予期せぬ計算ミスを招きます。
② ArraySetAsSeriesの使用
デフォルトの配列は古い順([0]が最も古いデータ)に格納されます。EA開発においては「[0]を最新のバー」として扱うほうが直感的であるため、ArraySetAsSeries(array, true)を忘れずに行いましょう。
③ 履歴データの不足
MT5を起動した直後や、新しい通貨ペアでEAを動かした直後は、過去のボリュームデータがPC内にダウンロードされていないことがあります。CopyTickVolumeが期待した数(count)を返さない場合は、少し時間を置くか、手動でチャートを遡ってデータを読み込ませる処理が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズム取引において、ロジックの優位性と同じくらい重要なのが「実行環境」です。自宅のデスクトップPCや一般的なノートPCでEAを稼働させることは、プロのクオンツから見れば極めてリスクの高い行為と言わざるを得ません。
家庭用インターネット回線は、プロバイダー経由の物理的な距離により、ブローカーのサーバーとの間に数十〜数百ミリ秒の「レイテンシ(遅延)」を発生させます。ティックボリュームが急増し、価格が激しく動く局面では、1ミリ秒の遅れがスリッページを引き起こし、期待した利益を削り取るだけでなく、致命的な損失を生む原因となります。
FXの自動売買を安定させ、極限まで約定スピードを高めるためには、ブローカーのデータセンターに近い場所に設置された専用の「VPS(仮想専用サーバー)」の導入が必須です。24時間365日の安定稼働はもちろん、ネットワーク遅延を最小化することで初めて、プログラムは本来のパフォーマンスを発揮できるようになります。プロレベルのトレード環境を整えることは、手法を磨くこと以上に優先されるべき「勝つための大前提」です。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント