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でのコンパイル・表示手順
- MetaEditorで新規カスタムインジケーター「ForceCrossArrow」を作成し、上のコードを貼り付けてコンパイルする
- 任意の通貨ペア・時間足のチャートにドラッグ&ドロップで適用する
- 0ラインを上に抜けたところに上矢印、下に抜けたところに下矢印が出ることを確認する
- `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と同じ考え方で、
折れ線を目で追い続ける負担を減らせます。
コメント