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

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 リアル)
);

パラメーターの解説

  1. symbol: "EURUSD"などの文字列。_Symbolを指定すれば現在表示中のチャートになります。
  2. period: PERIOD_H1(1時間足)やPERIOD_M15(15分足)など。
  3. 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. 使用上の注意点とよくあるエラー

  1. データ型の不一致:
    iVolumesで取得されるボリューム(特にティックボリューム)は、long型(64ビット整数)です。double型やint型で受け取ろうとすると、大きな数値の場合に計算が狂う可能性があるため、必ずlong型を使用してください。

  2. VOLUME_REALの落とし穴:
    一般的なFXブローカーでVOLUME_REALを指定しても、データが提供されていないため値が「0」になり続けます。FXで使用する場合は、基本的にVOLUME_TICKを選択するのが鉄則です。

  3. ハンドルの重複作成:
    OnTick内で毎回iVolumesを呼び出してはいけません。PCのメモリを急激に消費し、MT5がフリーズする原因になります。ハンドル作成は必ずOnInitで行いましょう。

  4. ヒストリカルデータの欠如:
    起動直後などは過去のデータがロードされていないため、CopyBufferが失敗することがあります。実運用では戻り値を必ずチェックするエラーハンドリングを実装してください。

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

アルゴリズムトレードにおいて、ロジックの優位性と同じくらい重要なのが「実行環境」です。どれほど優れたボリューム解析ロジックを組み上げたとしても、自宅のPCから一般的なインターネット回線を通じて注文を出している限り、プロの世界では勝負になりません。ネットワークの物理的な距離が生む「レイテンシ(遅延)」は、MT5上の表示価格と実際の約定価格の間に乖離(スリッページ)を生み、期待利益を瞬く間に食いつぶします。

FXの自動売買を安定させ、極限まで約定スピードを高めるには、ブローカーのサーバーに物理的に近い場所に位置する「専用VPS(仮想専用サーバー)」の導入が不可欠です。24時間365日、停電やOSのアップデートによる中断リスクを排除し、ミリ秒単位のスピード競争に勝つためのインフラを整えることは、システムトレーダーにとっての「最低限の投資」と言えます。遅延による損失を考えれば、VPSのコストは実質的に無料に近い、あるいはそれ以上の利益を守る盾となるはずです。

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

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

コメント

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