1. iRealVolume関数の概要と実務での活用法
MQL5のiRealVolumeは、指定した通貨ペアおよび時間足の「実ボリューム(Real Volume)」を取得するためのハンドルを作成する関数です。
FXのシステムトレードにおいて、多くの開発者が「出来高(Volume)」という言葉を聞くと、MT4でおなじみの「ティック回数(価格が動いた回数)」を想像しがちです。しかし、MT5では「ティックボリューム」と、実際の取引枚数を示す「リアルボリューム」が明確に区別されています。
実務での活用法とつまずきポイント:
FX(外国為替証拠金取引)においては、中央取引所が存在しないため、ほとんどのブローカーで「リアルボリューム」は配信されず、値がゼロになります。一方で、株式、先物、または一部の透明性の高いECN方式を採用しているFXブローカーでは、この実ボリュームが提供されます。
実務開発では、以下の用途で活用されます。
– 大口投資家の動向分析: ティック回数ではなく、実際に取引された「量」を見ることで、トレンドの真実味を測定する。
– VAP(価格帯別出来高)の実装: どの価格帯で多くの売買が成立したかを可視化する。
初心者の方は、まず自分が利用しているブローカーが「リアルボリューム」を配信しているかを確認してください。配信されていない環境でこの関数を使っても、インジケーターやEAは正しく動作しません。
2. 構文と戻り値
iRealVolume関数の構文は非常にシンプルです。
int iRealVolume(
string symbol, // 通貨ペア名(NULLならカレント)
ENUM_TIMEFRAMES period // 時間足(0ならカレント)
);
パラメーター
- symbol: データを取得したい通貨ペアを指定します。例:
"USDJPY"。 - period: 取得する時間足を指定します。例:
PERIOD_H1(1時間足)。
戻り値
- 成功した場合:ボリュームデータにアクセスするための「ハンドル(整数値)」を返します。
- 失敗した場合:
INVALID_HANDLEを返します。
注意: この関数自体はボリュームの数値を返すのではなく、数値を取得するための「窓口(ハンドル)」を作るだけのものです。実際の数値を取得するには、後述する CopyBuffer 関数を併用する必要があります。
3. 具体的な使い方・実践サンプルコード
以下は、iRealVolume を使用して最新の確定足のリアルボリュームを取得し、エキスパートログに出力するシンプルなEAのコード例です。
//+------------------------------------------------------------------+
//| RealVolumeSample.mq5|
//| Copyright 2024, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// グローバル変数:ハンドルの保持用
int handleRealVolume;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. リアルボリューム取得用のハンドルを作成
handleRealVolume = iRealVolume(_Symbol, _Period);
// ハンドル作成に失敗した場合は初期化エラーを返す
if(handleRealVolume == INVALID_HANDLE)
{
Print("ハンドルの作成に失敗しました。リアルボリューム非対応の可能性があります。");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// ボリュームデータを格納する配列
long volumeArray[];
// 配列を時系列順(最新がインデックス0)に設定
ArraySetAsSeries(volumeArray, true);
// 2. CopyBufferを使用してハンドルからデータを配列にコピー(最新から2本分)
if(CopyBuffer(handleRealVolume, 0, 0, 2, volumeArray) < 0)
{
Print("データのコピーに失敗しました。エラーコード:", GetLastError());
return;
}
// 3. 確定足(インデックス1)のリアルボリュームを取得
long lastRealVolume = volumeArray[1];
// 取得した値を表示
Comment("確定足のリアルボリューム: ", lastRealVolume);
// もし値が0なら、そのブローカーはリアルボリュームを提供していない
if(lastRealVolume == 0)
{
Print("警告: リアルボリュームが0です。ブローカーの仕様を確認してください。");
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 作成したハンドルを解放してメモリを節約
IndicatorRelease(handleRealVolume);
}
4. 使用上の注意点とよくあるエラー
-
戻り値の型に注意:
iRealVolumeで取得される出来高データはlong型(64ビット整数)です。価格データに使用するdouble型や通常のint型で受け取ると、大きな数値の場合にデータが欠損したり、予期せぬ挙動をしたりする可能性があります。 -
「0」しか返ってこない問題:
前述の通り、多くのFXブローカーではリアルボリュームが配信されません。開発前に必ず「表示」→「銘柄」から該当通貨ペアの仕様を確認するか、チャート上で右クリックし「リアルボリュームを表示」を選択して、グラフが表示されるか確認してください。 -
データの同期遅延:
iRealVolumeを呼び出した直後にCopyBufferを実行すると、データの準備ができておらずエラーになることがあります。特にEAの起動直後は、数ティック待つか、ループでデータが準備できるまでリトライする処理を入れるのが実務的な Tips です。 -
ハンドルの解放:
OnInitで作成したハンドルは、OnDeinitでIndicatorReleaseを使って必ず解放しましょう。これを忘れると、バックテストや長期間の運用でメモリを無駄に消費する原因になります。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの優位性と同じか、それ以上に重要なのが「実行環境」です。自宅のPC環境から一般的な光回線を利用して自動売買を行う場合、ブローカーのサーバーに注文が届くまでに数十から数百ミリ秒(ms)のネットワーク遅延(レイテンシ)が発生します。この一瞬の遅れが、スリッページを増大させ、バックテストの結果とリアルトレードの結果を乖離させる最大の要因となります。
特にボリューム分析を用いるような精緻なトレード戦略では、価格の瞬時の変化に反応する必要があるため、物理的な距離によるロスは致命的です。プロレベルの約定スピードを確保し、ネットワークの不安定さによる不意の切断リスクを回避するには、ブローカーのデータセンターに近い場所に位置する専用のVPS(仮想専用サーバー)を利用することがエンジニアにとっての「必須装備」と言えます。安定した高稼働率と低レイテンシ環境を構築することこそが、長期的な収益を守るための最初のステップです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント