1. iVolumes関数の概要と実務での活用法
MQL5におけるiVolumes関数は、指定した通貨ペアや時間足の「ボリューム(出来高)」を取得するためのインジケーターハンドルを作成する関数です。
FX市場は中央集権的な取引所が存在しないため、株式市場のような「正確な売買高」を把握することは困難です。そのため、MT5におけるボリュームは、一般的に価格が動いた回数を示す「ティックボリューム(Tick Volume)」を指します。
実務での活用法とつまずきポイント:
多くの開発者が「ボリュームが増えた=トレンドの継続」と安易に判断しがちですが、実務では「異常なボリュームの突出(クライマックス)による反転の予兆」や「ボラティリティのフィルタリング」として活用するのが効果的です。
また、初心者が最もつまずきやすいのは、iVolumesを呼び出しただけでは数値を取得できない点です。この関数はあくまで「計算の準備(ハンドル作成)」をするものであり、実際の数値を取り出すにはCopyBuffer関数を併用するという2ステップの工程が必要になることを覚えておきましょう。
2. 構文と戻り値
iVolumes関数の基本的な構文は以下の通りです。
int iVolumes(
string symbol, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES period, // 時間足(0またはPERIOD_CURRENTで現在の足)
ENUM_APPLIED_VOLUME applied_volume // ボリュームの種類(ティック or リアル)
);
パラメーターの解説
- symbol:
"EURUSD"などの文字列。_Symbolを指定すれば現在表示中のチャートになります。 - period:
PERIOD_H1(1時間足)やPERIOD_M15(15分足)など。 - applied_volume:
VOLUME_TICK: ティックボリューム(FXでは通常こちらを使用)。VOLUME_REAL: 実際の取引量(株や先物、一部のCFDで利用可能)。
戻り値
- 成功した場合:インジケーターの「ハンドル」と呼ばれる整数値(int)を返します。
- 失敗した場合:
INVALID_HANDLE(-1)を返します。
3. 具体的な使い方・実践サンプルコード
以下に、現在の足のボリュームが直近10本の平均ボリュームを超えた場合にログを出力する、実践的なEA(エキスパートアドバイザー)のテンプレートを示します。
//+------------------------------------------------------------------+
//| VolumeChecker.mq5 |
//+------------------------------------------------------------------+
#property strict
// グローバル変数
int handleVolume; // iVolumesのハンドルを格納
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. iVolumesのハンドルを作成(ティックボリュームを指定)
handleVolume = iVolumes(_Symbol, PERIOD_CURRENT, VOLUME_TICK);
// ハンドル作成に失敗した場合は初期化エラーを返す
if(handleVolume == INVALID_HANDLE)
{
Print("iVolumesハンドルの作成に失敗しました。");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
long volumeArray[]; // ボリューム値を格納する配列(FXはlong型)
// 配列を時系列順(インデックス0が最新)に並び替える
ArraySetAsSeries(volumeArray, true);
// 2. CopyBufferを使って実際のデータを配列にコピー(最新3本分)
if(CopyBuffer(handleVolume, 0, 0, 3, volumeArray) < 0)
{
Print("データのコピーに失敗しました。エラーコード:", GetLastError());
return;
}
// 最新の確定足(インデックス1)のボリュームを取得
long currentVolume = volumeArray[1];
// 例:ボリュームが1000を超えた場合にアラート(数値はブローカーに依存)
if(currentVolume > 1000)
{
Print("大きなボリュームを検知しました: ", currentVolume);
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 使用したハンドルを解放してメモリを節約
IndicatorRelease(handleVolume);
}
4. 使用上の注意点とよくあるエラー
-
データ型の不一致:
iVolumesで取得されるボリューム(特にティックボリューム)は、long型(64ビット整数)です。double型やint型で受け取ろうとすると、大きな数値の場合に計算が狂う可能性があるため、必ずlong型を使用してください。 -
VOLUME_REALの落とし穴:
一般的なFXブローカーでVOLUME_REALを指定しても、データが提供されていないため値が「0」になり続けます。FXで使用する場合は、基本的にVOLUME_TICKを選択するのが鉄則です。 -
ハンドルの重複作成:
OnTick内で毎回iVolumesを呼び出してはいけません。PCのメモリを急激に消費し、MT5がフリーズする原因になります。ハンドル作成は必ずOnInitで行いましょう。 -
ヒストリカルデータの欠如:
起動直後などは過去のデータがロードされていないため、CopyBufferが失敗することがあります。実運用では戻り値を必ずチェックするエラーハンドリングを実装してください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの優位性と同じくらい重要なのが「実行環境」です。どれほど優れたボリューム解析ロジックを組み上げたとしても、自宅のPCから一般的なインターネット回線を通じて注文を出している限り、プロの世界では勝負になりません。ネットワークの物理的な距離が生む「レイテンシ(遅延)」は、MT5上の表示価格と実際の約定価格の間に乖離(スリッページ)を生み、期待利益を瞬く間に食いつぶします。
FXの自動売買を安定させ、極限まで約定スピードを高めるには、ブローカーのサーバーに物理的に近い場所に位置する「専用VPS(仮想専用サーバー)」の導入が不可欠です。24時間365日、停電やOSのアップデートによる中断リスクを排除し、ミリ秒単位のスピード競争に勝つためのインフラを整えることは、システムトレーダーにとっての「最低限の投資」と言えます。遅延による損失を考えれば、VPSのコストは実質的に無料に近い、あるいはそれ以上の利益を守る盾となるはずです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント