MQL4関数ギャップ#23(iOsMA/iForce/iOBV)のうち、

iOsMAは既刊`osma-cross-arrow-indicator.md`、

iOBVは既刊`iobv-mt4.md`で解説済みで、

残っていたのが`iForce()`(フォースインデックス)です。

この記事では、価格変化と出来高を組み合わせて勢いを測るこの指標の考え方と、

0ラインをまたいだ瞬間だけを矢印で知らせるインジケーターの実装コードを解説します。

この記事で分かること
・iForce(フォースインデックス)が何を計算しているか
・iForce関数の引数の指定方法
・0ラインのクロスだけを矢印で検知する考え方
・既刊osma-cross-arrow-indicator.mdと同じ設計パターンの応用

iForce(フォースインデックス)とは何を計算する指標か

まず、iForceが何を計算しているのかを確認します。

「価格変化」×「出来高」で勢いを測る

Force Indexは、直前のバーからの価格変化の大きさに、

そのバーの出来高を掛け合わせ、

さらに移動平均で均した値です。

0ラインより上なら買い勢力、下なら売り勢力

補足
・値がプラスで大きいほど買いの勢いが強い
・値がマイナスで大きいほど売りの勢いが強い
・0に近いほど勢いが弱い(方向感が無い)状態

MACD・OsMAとの違いは「出来高」が入ること

MACDやOsMAは価格の情報だけから勢いを計算しますが、

Force Indexは出来高の情報も加味する点が異なります。

iForce関数のシグネチャと引数

次に、iForce関数の書式を確認します。

iForce()のシグネチャ(docs.mql4.com確認済み)

double iForce(
   string symbol,       //通貨ペア(NULLで現在の通貨ペア)
   int    timeframe,    //時間足(0で現在の時間足)
   int    period,       //平均化する期間
   int    ma_method,    //平均化メソッド(MODE_SMA等)
   int    applied_price,//適用価格(PRICE_CLOSE等)
   int    shift          //何本前の値を取得するか
   );

periodとma_methodの指定方法

`period`は、

MT4標準のForce Indexと同じ「13」が一般的な目安です。

`ma_method`は`MODE_SMA`・`MODE_EMA`等、

iMAで使うのと同じ定数をそのまま指定します。

戻り値はプラス・マイナスを含むdouble型

戻り値は、

そのまま符号(プラス・マイナス)を持つ`double`型の値です。

絶対値ではない点に注意してください。

0ラインのクロスをどう矢印で検知するか

判定ロジックの考え方を確認します。

値そのものでなく「クロスした瞬間」を知らせる理由

Force Indexの値を折れ線でそのまま見ると、

0の前後で細かく上下して読みづらいことがあります。

そこで、0ラインを越えた「瞬間」だけを矢印にします。

1本前の値と符号を比較してクロスを判定する

対象のバーの`iForce()`の値と、

1本前のバーの`iForce()`の値の符号を比較し、

マイナスからプラスに変わった瞬間に上矢印、

プラスからマイナスに変わった瞬間に下矢印を出します。

既刊osma-cross-arrow-indicator.mdと同じ設計パターン

これは既刊のOsMAゼロクロス矢印インジケーターと同じ考え方で、

「状態」ではなく「変化が起きた瞬間」を矢印で可視化する設計です。

実際に動くサンプルコード

0ラインのクロスを矢印で表示するインジケーターです。

//+------------------------------------------------------------------+
//|                                       ForceCrossArrow.mq4         |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
#property indicator_buffers 2

double UpArrow[];
double DownArrow[];

input int InpPeriod       = 13;          //Force Indexの平均化期間
input int InpMaMethod     = MODE_SMA;    //平均化メソッド
input int InpAppliedPrice = PRICE_CLOSE; //適用価格

int OnInit()
  {
   SetIndexBuffer(0, UpArrow);
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 233);

   SetIndexBuffer(1, DownArrow);
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 234);

   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int start = (prev_calculated > 1) ? rates_total - prev_calculated : rates_total - 2;
   if(start < 1)
      start = 1;

   for(int i = start; i < rates_total; i++)
     {
      int shift = rates_total - 1 - i;
      if(shift + 1 > rates_total - 1)
         continue;

      double forceNow  = iForce(_Symbol, 0, InpPeriod, InpMaMethod, InpAppliedPrice, shift);
      double forcePrev = iForce(_Symbol, 0, InpPeriod, InpMaMethod, InpAppliedPrice, shift + 1);

      UpArrow[i]   = EMPTY_VALUE;
      DownArrow[i] = EMPTY_VALUE;

      if(forcePrev <= 0 && forceNow > 0)
         UpArrow[i] = low[i] - 10 * _Point;
      else if(forcePrev >= 0 && forceNow < 0)
         DownArrow[i] = high[i] + 10 * _Point;
     }

   return(rates_total);
  }

`forcePrev <= 0 && forceNow > 0`のように、

「以前は0以下・今回は0超」という条件で、

ちょうど跨いだ瞬間だけを矢印にしています。

MetaEditorでのコンパイル・表示手順

  1. MetaEditorで新規カスタムインジケーター「ForceCrossArrow」を作成し、上のコードを貼り付けてコンパイルする
  2. 任意の通貨ペア・時間足のチャートにドラッグ&ドロップで適用する
  3. 0ラインを上に抜けたところに上矢印、下に抜けたところに下矢印が出ることを確認する
  4. `InpPeriod`の値を変え、矢印が出る頻度が変わる様子を確認する

よくあるエラーと注意点

実際に使う前に確認しておきたい注意点をまとめます。

FXの出来高はティックボリュームである点に注意

注意
・既刊iobv-mt4.mdで解説した通り、FXの出来高は実出来高ではない
・多くのブローカーはティックボリューム(値動きの回数)を代わりに使う
・Force Indexの『勢い』も、実際の取引量そのものではない点を理解しておく

periodを大きくしすぎると矢印が出なくなる

`InpPeriod`を極端に大きくすると、

平均化が強くかかりすぎて0ラインを跨ぎにくくなり、

矢印がほとんど出なくなることがあります。

矢印はあくまで事後の可視化であって予測ではない

矢印が出た時点では、

すでにクロスが完了したあとの確定したバーの話であり、

将来の値動きを予測しているわけではありません。

よくある質問

iForceのゼロクロス矢印について、よく検索される疑問に回答します。

Force Indexは単独で使うべき指標ですか?

単独での断定的な売買判断には向いていません。

既刊記事群と同様、

トレンド系の指標(iMA等)と組み合わせて、

勢いの確認役として使うことをおすすめします。

このロジックをEAのエントリー条件に組み込めますか?

できます。

`iForce()`の現在値・1本前の値の符号を比較する部分を、

そのままEAの`OnTick()`内のフィルター条件として使えます。

MT4標準インジケーターのForce Indexと何が違いますか?

計算内容は同じ`iForce()`関数を使っています。

違いは、折れ線ではなく0クロスの瞬間だけを矢印にして、

見た目の負担を減らしている点です。

【MQL4】iForce(フォースインデックス)のゼロクロスを矢印表示するインジケーターの作り方:まとめ

MQL4関数ギャップ#23の最後の1項目だったiForceは、

価格変化と出来高を組み合わせて勢いを測る指標です。

0ラインを跨いだ瞬間だけを矢印にすることで、

既刊osma-cross-arrow-indicator.mdと同じ考え方で、

折れ線を目で追い続ける負担を減らせます。

関連記事