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

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

iForce関数は、アレキサンダー・エルダー博士によって考案された「フォース指数(Force Index)」を計算するためのハンドルを取得するMQL5の組み込み関数です。

フォース指数は、「現在の終値 – 前日の終値」に「出来高(ボリューム)」を掛け合わせることで算出されます。つまり、「価格の変化幅」と「市場のエネルギー(出来高)」を同時に評価する指標です。

実務での活用シーン

実務開発において、iForceは単独のシグナルとしてよりも、「トレンドの強さの裏付け」として活用されることが多いです。
* トレンドの継続確認: 価格が上昇し、かつフォース指数もプラス圏で上昇していれば、強い買い圧力が働いていると判断します。
* 逆張りのフィルタリング: 価格が新高値を更新してもフォース指数が伸び悩んでいる場合、出来高を伴わない「騙し」の可能性を警戒します。

初心者がつまずきやすいポイント

FXにおけるiForceの扱いで最も注意すべきは、「出来高(Volume)」の定義です。株先物とは異なり、FXには中央取引所がないため、MT5で取得できる出来高は「ティック回数(Tick Volume)」であることが一般的です。ブローカーによってこの出来高の定義が微妙に異なるため、バックテストと実運用で差異が出やすい指標であることを理解しておく必要があります。


2. 構文と戻り値

iForce関数を使用するには、まずインジケーターの「ハンドル」を取得し、その後にCopyBuffer関数を用いて実際の数値を取得する2ステップが必要です。

構文

int iForce(
   string              symbol,            // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES     period,            // 時間軸(0またはPERIOD_CURRENTで現在)
   int                 ma_period,         // 平滑化期間(通常は13や2などが使われる)
   ENUM_MA_METHOD      ma_method,         // 移動平均の種類(MODE_EMAが一般的)
   ENUM_APPLIED_VOLUME applied_volume     // 使用する出来高(VOLUME_TICKまたはVOLUME_REAL)
);

戻り値

  • 成功した場合:インジケーターのハンドル(整数値)を返します。
  • 失敗した場合:INVALID_HANDLEを返します。

取得したハンドルは、プログラム終了時にIndicatorRelease関数でメモリから解放するのがマナーです。


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

以下は、iForceの値がゼロラインを上抜けた(あるいは下抜けた)タイミングでログを出力する、EA(エキスパートアドバイザー)のベースとなるテンプレートコードです。

//+------------------------------------------------------------------+
//|                                              SimpleForceIndex.mq5|
//|                                  Copyright 2023, Quant Developer |
//+------------------------------------------------------------------+
#property strict

// 入力パラメーター
input int      InpMAPeriod = 13;          // Force Indexの平均期間
input ENUM_MA_METHOD InpMAMethod = MODE_EMA; // 平滑化メソッド
input ENUM_APPLIED_VOLUME InpVolume = VOLUME_TICK; // 使用するボリューム

// グローバル変数
int handleForce; // iForceのハンドルを格納

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // 1. iForceのハンドルを取得
    handleForce = iForce(_Symbol, _Period, InpMAPeriod, InpMAMethod, InpVolume);

    // ハンドル取得に失敗した場合の処理
    if(handleForce == INVALID_HANDLE)
    {
        Print("iForceハンドルの取得に失敗しました。エラーコード:", GetLastError());
        return(INIT_FAILED);
    }

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // メモリ解放
    IndicatorRelease(handleForce);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    double buffer[]; // 値を格納する動的配列
    ArraySetAsSeries(buffer, true); // 最新のバーを0番目にする

    // 2. CopyBufferを使用して最新2本分のデータを取得
    if(CopyBuffer(handleForce, 0, 0, 2, buffer) < 2)
    {
        Print("データのコピーに失敗しました。");
        return;
    }

    double currentForce = buffer[0];  // 現在の確定直前値
    double prevForce    = buffer[1];  // 1本前の確定値

    // 3. ロジック判定(例:ゼロラインとのクロス)
    if(prevForce <= 0 && currentForce > 0)
    {
        Print("買いシグナル:フォース指数がゼロを上抜けました。Value:", currentForce);
    }
    else if(prevForce >= 0 && currentForce < 0)
    {
        Print("売りシグナル:フォース指数がゼロを下抜けました。Value:", currentForce);
    }
}

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

① CopyBufferの戻り値チェックを怠らない

MQL5では、iForceを呼び出した瞬間に計算が終わるわけではありません。ハンドルを生成した直後のOnTickでは、まだ計算データが準備できていない場合があります。必ずCopyBufferの戻り値(コピーされた要素数)をチェックし、予期せぬゼロや空の値で計算が行われないようにガードをかける必要があります。

② ボリュームデータの信頼性

FXブローカーによっては「リアルボリューム(実際の取引量)」を配信しておらず、VOLUME_REALを選択すると値が常に0になることがあります。FXのシステムトレード開発においては、特別な理由がない限りVOLUME_TICKを選択するのが無難です。

③ インジケーターの解放忘れ

OnInitで取得したハンドルは、EAをチャートから外した際もメモリ内に残ることがあります。微々たる量ですが、大量のインジケーターを組み合わせる場合、OnDeinitIndicatorReleaseを実行しないとターミナルの動作が重くなる原因となります。


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

フォース指数のような「一瞬の価格変化と出来高」をトリガーにするアルゴリズムにおいて、最も致命的な欠陥となるのが「ネットワーク遅延(レイテンシ)」です。自宅のPC環境から一般的なインターネット回線を通じて注文を出す場合、数ミリ秒から数百ミリ秒の遅延が発生します。このわずかな間に、フォース指数が示した「有利な価格」は霧散し、スリッページによって期待利得が削り取られてしまいます。

プロレベルのクオンツエンジニアにとって、取引サーバーの物理的距離をゼロに近づけることは常識です。家庭用PCでの運用は、停電やWindows Updateによる強制再起動といった物理的なリスクに加え、ネットワーク経路の不安定さがアルゴリズムの優位性を完全に破壊します。約定スピードを極限まで高め、コンマ数秒を争うマーケットで生き残るためには、取引サーバーに隣接したデータセンター内に設置された「専用VPS」の導入が不可欠です。インフラへの投資を惜しむことは、シストレ開発において最大の損失リスクであると断言できます。

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

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

コメント

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