iBWMFIは、1本のバーの値幅を、
その間に成立した出来高で割るという、
ちょっと変わった計算をするMQL4の組み込み関数です。
既刊technical-indicator-functions.mdで、
名前だけ触れていましたが、
このサイトではまだiBWMFI単独の解説記事がありませんでした。
この記事では、iBWMFIの引数と戻り値を整理したうえで、
値動きと出来高の「伴い」をGreen/Fade/Fake/Squatという、
4つのパターンに色分けして判定するインジケーターの作り方を解説します。
・iBWMFIの3つの引数と戻り値の意味(periodが無い理由)
・既刊iForceとの計算対象の違い
・Green/Fade/Fake/Squatという4色判定の考え方
・実際に動くコード全体
設計思想: なぜ値幅÷出来高を見るのか
まず、iBWMFIが既刊の出来高系指標と何が違うのかを整理します。
既刊iForceとの計算対象の違い
既刊iforce-mt4.mdのForce Indexは、
価格の変化量に出来高を掛け算し、
「勢いの大きさ」を測る指標でした。
一方、iBWMFIは掛け算ではなく割り算で、
「1ティックあたりどれだけ価格が動きやすかったか」を測ります。
| 指標 | 計算 | 意味 |
|---|---|---|
| iForce(既刊) | 価格変化×出来高 | 勢いの大きさ |
| iBWMFI(本記事) | 値幅÷出来高 | 出来高1単位あたりの動きやすさ |
出来高が少ないのに大きく動いた場合、
iBWMFIの値は大きくなり、
「少ない参加者で動いた=信頼性が低い動き」を示唆します。
ビル・ウィリアムズ系指標群、最後の1つ
既刊iac-mt4.md・iao-awesome-oscillator-mt4.md・
ialligator.md・ifractals.md・igator-mt4.mdは、
いずれもビル・ウィリアムズが考案した指標群でした。
・ビル・ウィリアムズ系指標はMT4の標準インジケーターに5種類ある
・iAC・iAlligator・iAO・iFractals・iGatorは既刊済み
・iBWMFIが最後に残っていた1つ
・これで標準インジケーターのビル・ウィリアムズ系5関数が揃う
iBWMFI関数の引数と戻り値
公式リファレンス(MQL4 Reference: iBWMFI)の内容を整理します。
3つの引数、periodが無い理由
double iBWMFI( string symbol, // 通貨ペア名(NULLで現在のチャート) int timeframe, // 時間足(0で現在の時間足) int shift // 何本前のバーの値を取得するか );
iRSIやiMFIと違い、
計算期間を指定するperiod引数がありません。
これは、BWMFIが「このバー1本だけ」の値幅と出来高から計算され、
複数バーにわたる平均化を行わない指標だからです。
MQL5版との違い: 戻り値とapplied_volume
MQL4のiBWMFIは、値をdoubleで直接返します。
一方、MQL5のiBWMFIは、
値ではなくインジケーターのハンドル(int)を返し、
applied_volumeという引数でティックボリュームか実出来高かを選べます。
既刊のMQL4→MQL5移行チェックリストと同じ、
テクニカル指標のハンドル方式化という変化点がここにも当てはまります。
サンプルインジケーター: 4色の組み合わせ判定
BWMFIの値そのものだけでなく、
前バーとの増減の組み合わせで4パターンに色分けします。
Green/Fade/Fake/Squatの4パターン
| パターン | BWMFI | 出来高 | 意味 |
|---|---|---|---|
| Green | 上昇 | 増加 | 伴いのある本物の動き |
| Fade | 下降 | 減少 | 伴いのある落ち着き |
| Fake | 上昇 | 減少 | 参加者が少ないのに動いた(警戒) |
| Squat | 下降 | 増加 | 参加者は多いのに動かない(拮抗) |
・4色はあくまで経験則的な分類
・FakeやSquatが出た=必ず反転するわけではない
・他の指標と組み合わせて判断材料の1つにする
前バーとの比較で色を判定する設計
今のバーのBWMFIと出来高を、
1本前のバーの値と比較し、
上昇/下降・増加/減少の組み合わせから4色を決めます。
実際に動くコード全体
実際にMetaEditorでコンパイルできる、
4色のヒストグラムで表示するインジケーターです。
//+------------------------------------------------------------------+
//| BWMFIFourColorIndicator.mq4 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Blue
#property indicator_color3 Magenta
#property indicator_color4 Gray
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3
double GreenBuffer[];
double FadeBuffer[];
double FakeBuffer[];
double SquatBuffer[];
int OnInit()
{
SetIndexBuffer(0, GreenBuffer);
SetIndexStyle(0, DRAW_HISTOGRAM);
SetIndexEmptyValue(0, EMPTY_VALUE);
SetIndexBuffer(1, FadeBuffer);
SetIndexStyle(1, DRAW_HISTOGRAM);
SetIndexEmptyValue(1, EMPTY_VALUE);
SetIndexBuffer(2, FakeBuffer);
SetIndexStyle(2, DRAW_HISTOGRAM);
SetIndexEmptyValue(2, EMPTY_VALUE);
SetIndexBuffer(3, SquatBuffer);
SetIndexStyle(3, DRAW_HISTOGRAM);
SetIndexEmptyValue(3, EMPTY_VALUE);
IndicatorShortName("BWMFI 4-Color Detector");
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 needed = 2;
if(rates_total < needed)
return(0);
int limit = (prev_calculated == 0) ? rates_total - needed : rates_total - prev_calculated + 1;
for(int i = limit; i >= 0; i--)
{
GreenBuffer[i] = EMPTY_VALUE;
FadeBuffer[i] = EMPTY_VALUE;
FakeBuffer[i] = EMPTY_VALUE;
SquatBuffer[i] = EMPTY_VALUE;
if(i + 1 >= rates_total)
continue;
double curMfi = iBWMFI(NULL, 0, i);
double prevMfi = iBWMFI(NULL, 0, i + 1);
double curVol = (double)volume[i];
double prevVol = (double)volume[i + 1];
bool mfiUp = (curMfi > prevMfi);
bool volUp = (curVol > prevVol);
if(mfiUp && volUp)
GreenBuffer[i] = curMfi;
else if(!mfiUp && !volUp)
FadeBuffer[i] = curMfi;
else if(mfiUp && !volUp)
FakeBuffer[i] = curMfi;
else
SquatBuffer[i] = curMfi;
}
return(rates_total);
}
4つのバッファに同時に値を入れず、
その瞬間に当てはまる1色だけへ値を入れ、
残り3色はEMPTY_VALUEのままにする設計です。
MetaEditorでのコンパイル・実行手順
実際にMT4で動かすまでの手順です。
- MetaEditorで新規インジケーター「BWMFIFourColorIndicator」を作成し、上のコードを貼り付けてコンパイルする
- エラー・警告が0件であることを確認する
- サブウィンドウに緑・青・マゼンタ・灰色の4色ヒストグラムが表示されることを確認する
- 値動きが大きいバーの色と、出来高の多さを見比べて4パターンの対応関係を確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
出来高0のバーでの扱い
・出来高(volume)が0のバーが混在することがある
・iBWMFI自体は0除算を内部処理するため落ちない
・本記事の色判定は前バーとの大小比較のみで影響は小さい
・値そのものを使う場合はvolume=0のバーを除外する
MQL5移植時にapplied_volumeを指定し忘れる
前述のとおり、MQL5版はapplied_volumeという引数が追加されています。
MQL4からそのまま移植する際は、
この引数の指定を忘れないようにしてください。
既刊のビル・ウィリアムズ系・出来高系記事との使い分け
似た目的の記事が複数あるため、使い分けを整理します。
| 記事 | 系統 | 見るもの |
|---|---|---|
| 本記事(iBWMFI) | ビル・ウィリアムズ系 | 値幅÷出来高の伴い |
| iForce記事(既刊) | オシレーター系 | 価格変化×出来高の勢い |
| iGator記事(既刊) | ビル・ウィリアムズ系 | アリゲーターの口の開き |
よくある質問
iBWMFIについて、よくある疑問に回答します。
iBWMFIにperiodが無いのはなぜですか?
BWMFIは1本のバーの値幅と出来高だけから計算される指標で、
複数バーの平均を取らない設計だからです。
移動平均のような期間指定はそもそも不要です。
4色のうちどれが最も重要ですか?
一般的にはFakeとSquatが注目されます。
価格と出来高の動きが一致していないため、
トレンドの転換や一時的な動きを警戒するサインとして使われます。
このインジケーターをEAのフィルターに使えますか?
使えます。
4色の判定部分だけを関数化すれば、
既刊のボラティリティ判定EAと同じ要領でエントリーの見送り条件に組み込めます。
【MQL4】iBWMFI(マーケット・ファシリテーション・インデックス)で値動きと出来高の「伴い」を4色で判定するインジケーターの作り方:まとめ
iBWMFIは、既刊iForceとは違い、
値幅を出来高で割ることで「動きやすさ」を測る関数です。
periodという引数が無いのは、
1本のバーだけで完結する計算だからです。
Green/Fade/Fake/Squatの4色判定は、
既刊のビル・ウィリアムズ系指標群に続く、
最後の1関数として、同じ系統の読み方に慣れておくと理解しやすくなります。
コメント