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

1. iTickVolume関数の概要と実務での活用法

MQL5のiTickVolume関数は、指定した通貨ペアおよび時間軸において、特定のバー(ローソク足)の「ティックボリューム」を取得するための関数です。

FX市場におけるティックボリュームとは、株式市場のような「売買高(取引された数量)」ではなく、「価格が動いた回数(更新頻度)」を指します。一見すると実際の取引量とは無関係に思えますが、実はティックボリュームと実際の取引量(リアルボリューム)には強い相関関係があることが知られています。

実務での活用法

実務においては、主に以下のようなシーンで活用されます。
* 市場の活性化判断: ティックボリュームが急増している時は、大口投資家の参入や重要指標発表による価格変動の激化を示唆します。
* ブレイクアウトの信頼性確認: 価格がレジスタンスラインを抜けた際、ボリュームが伴っていなければ「だまし」の可能性が高いと判断するフィルタリングに使用します。
* ボラティリティの測定: ATR(Average True Range)と組み合わせて、現在の相場がトレンド形成中かレンジ内での乱高下かを判別します。

つまずきやすいポイント

初心者がよく陥る罠は、「ティックボリューム=取引金額」と勘違いすることです。FXは中央集権的な取引所が存在しない相対取引(OTC)であるため、正確な全市場の取引高を知ることは不可能です。あくまで「業者の価格配信頻度」を見ているという前提を忘れないようにしましょう。


2. 構文と戻り値

iTickVolume関数の基本的な構文は以下の通りです。

long iTickVolume(
   string           symbol,          // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES  timeframe,       // 時間軸(PERIOD_CURRENTで現在の時間軸)
   int              shift            // シフト(0: 現在の足、1: 1本前の足...)
);

パラメーター解説

  1. symbol: データを取得したい通貨ペアを指定します。現在のチャートで良ければ _Symbol または NULL を指定します。
  2. timeframe: 時間軸を指定します。PERIOD_M1(1分足)から PERIOD_MN1(月足)まで選択可能です。
  3. shift: 何本前の足からデータを取得するかを指定します。「0」は現在形成中の足、「1」は確定した直近の足を指します。

戻り値

  • 指定したバーのティックボリュームが long型 で返されます。
  • データの取得に失敗した場合は 0 を返します。詳細なエラーを確認したい場合は GetLastError() 関数を呼び出します。

3. 具体的な使い方・実践サンプルコード

以下のサンプルコードは、直近10本の平均ティックボリュームを算出し、現在の足のボリュームが平均の1.5倍を超えた場合に「市場が活性化した」と判断してログを出力するEAの断片です。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // 調べたい通貨ペアと時間軸
    string symbol = _Symbol;
    ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT;

    // 現在の足(0番目)のティックボリュームを取得
    long currentVolume = iTickVolume(symbol, timeframe, 0);

    // 過去10本の平均ボリュームを算出(1〜10本前の足)
    long totalVolume = 0;
    int period = 10;

    for(int i = 1; i <= period; i++)
    {
        totalVolume += iTickVolume(symbol, timeframe, i);
    }

    double averageVolume = (double)totalVolume / period;

    // 現在のボリュームが平均の1.5倍を超えているかチェック
    if(currentVolume > averageVolume * 1.5)
    {
        PrintFormat("【アラート】ボリューム急増を検知! 現在: %I64d, 平均: %.2f", 
                    currentVolume, averageVolume);

        // ここにエントリーロジックやフィルタ処理を記述
    }
}

このコードでは、iTickVolume をループ内で使用して過去の統計をとっています。MQL5ではボリュームの型が long であるため、平均計算時に double へキャスト(型変換)している点に注目してください。


4. 使用上の注意点とよくあるエラー

ヒストリーデータの未ロード

iTickVolume は、ターミナル内のヒストリーデータ(過去足)を参照します。EAを起動した直後や、普段開いていない時間軸のデータを取得しようとすると、データがまだダウンロードされておらず 0 が返ってくることがあります。これを防ぐには、取得前に SeriesInfoInteger などでデータが準備できているか確認する実装が望ましいです。

全FX業者で同じ値にはならない

ティックボリュームは「その業者が配信した価格の回数」です。A社では500回動いても、B社では300回しか動いていないということが日常的に起こります。そのため、特定の絶対数(例:1000以上なら買い)でロジックを組むのではなく、「その口座における過去の平均と比べてどうか」という相対的な評価を行うのが鉄則です。

型の不一致

MQL4ではボリュームは double 型でしたが、MQL5では long 型になっています。古いコードを移植する際に計算誤差やコンパイル警告が出る原因となるため、必ず long で受けるようにしましょう。


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

アルゴリズムトレードにおいて、iTickVolumeなどの指標を用いて完璧なエントリータイミングを導き出したとしても、それを執行する「環境」が劣悪であればすべては水の泡となります。FXにおけるチャンスはミリ秒単位で変化します。自宅のPCから一般的なインターネット回線を通じて注文を出す場合、プロバイダーによる通信の揺らぎや物理的な距離によって、数十から数百ミリ秒の遅延(レイテンシ)が発生します。この遅延が原因で、分析した時点の価格とは異なる価格で約定する「スリッページ」が発生し、期待利得を大幅に削り取ってしまうのです。

特にMQL5で高度なスキャルピングや高頻度トレードを行うエンジニアにとって、専用のVPS(仮想専用サーバー)導入は「オプション」ではなく「必須インフラ」です。取引サーバーの目と鼻の先に位置するデータセンターのVPSを利用することで、ネットワーク遅延を極限まで排除し、バックテスト通りのパフォーマンスをリアル口座で再現することが可能になります。プロのクオンツとして断言しますが、安定した24時間の稼働環境と超低遅延なネットワークへの投資を惜しむことは、自動売買における最大の敗因となります。

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

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

コメント

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