iBearsPowerとiBullsPowerは、
それぞれ「売り方の勢い」「買い方の勢い」を数値化する、
MQL4の組み込み関数です。
既刊のテクニカルインジケーター関数一覧記事では名前だけ触れていましたが、
このサイトではまだ単独の解説記事がありませんでした。
この記事では、2つの関数の引数と戻り値を整理したうえで、
既刊iForce・既刊iOsMAとの計算対象の違いを明らかにし、
どちらの勢いが優勢かを1つのヒストグラムで判定する、
実際に動くインジケーターの作り方を解説します。
・iBearsPower/iBullsPowerの5つの引数と戻り値の意味
・既刊iForce・既刊iOsMAとの計算対象の違い
・BearsPowerが負値基準である理由
・実際に動くコード全体
設計思想: 高値・安値とEMAの差で勢いを測る理由
まず、この2関数が何を計算しているのかを整理します。
BearsPower・BullsPowerの計算対象
Bulls Powerは、
その期間の高値から移動平均(EMA)を引いた値です。
Bears Powerは、
その期間の安値から移動平均(EMA)を引いた値です。
| 指標 | 計算式 | 示すもの |
|---|---|---|
| Bulls Power | 高値 – EMA(期間) | 買い方がEMAをどこまで押し上げたか |
| Bears Power | 安値 – EMA(期間) | 売り方がEMAをどこまで押し下げたか |
高値・安値という「行き過ぎた値」とEMAの距離を見ることで、
買い方・売り方それぞれの力の強さを別々に取り出せます。
既刊iForce・既刊iOsMAとの計算対象の違い
・iForce(既刊): 価格変化×出来高
・iOsMA(既刊): MACDと主線(SMA)の差
・iBearsPower/iBullsPower(本記事): 高値or安値とEMAの差
iForceが出来高を含むのに対し、
BearsPower/BullsPowerは、
高値・安値という値動きの形だけで勢いを測る点が異なります。
iBearsPower/iBullsPower関数の引数と戻り値
公式リファレンス(MQL4 Reference: iBearsPower・iBullsPower)の内容を整理します。
5つの引数の意味(2関数で共通)
double iBearsPower( string symbol, // 通貨ペア名(NULLで現在のチャート) int timeframe, // 時間足(0で現在の時間足) int period, // 平均化期間(EMAの期間) int applied_price, // 適用価格(PRICE_CLOSE等) int shift // 何本前のバーの値を取得するか ); double iBullsPower( string symbol, int timeframe, int period, int applied_price, int shift );
2つの関数は引数の並びが完全に同じです。
periodとapplied_priceを2関数で揃えないと、
正しく比較できなくなるので注意してください。
MQL5版との違い: 戻り値と引数の数
MQL4の2関数は、値をdoubleで直接返します。
一方、MQL5版は値ではなくハンドル(int)を返し、
引数もsymbol・period・ma_periodの3つに減ります。
・MQL5版はハンドルを返すだけで、値そのものは返さない
・実際の値はCopyBuffer()で別途取得する必要がある
・applied_price引数が無くなり、常に終値ベースで計算される
既刊のMQL4→MQL5移行チェックリストと同じ、
テクニカル指標のハンドル方式化という変化点がここにも当てはまります。
サンプルインジケーター: 優勢判定ヒストグラム
2つの値を別々に見るだけでなく、
差分を取って「いまどちら側が優勢か」を1本のヒストグラムで示します。
2つの値を同時に取得する
double bulls = iBullsPower(NULL, 0, InpPeriod, PRICE_CLOSE, i); double bears = iBearsPower(NULL, 0, InpPeriod, PRICE_CLOSE, i); double diff = bulls + bears;
BearsPowerは通常負の値になるため、
bulls + bearsという足し算が「優勢度」を表す差分になります。
ゼロラインクロスでの優劣逆転検知
diffの符号が前のバーから変わった瞬間を、
買い方・売り方の優劣が逆転したタイミングとして矢印で示します。
実際に動くコード全体
実際にMetaEditorでコンパイルできる、
優勢判定ヒストグラムと逆転矢印を表示するインジケーターです。
//+------------------------------------------------------------------+
//| BearsBullsBalance.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 3
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_width3 2
input int InpPeriod = 13; //BearsPower/BullsPowerの平均化期間
double BullBuffer[];
double BearBuffer[];
double FlipArrow[];
int OnInit()
{
SetIndexBuffer(0, BullBuffer);
SetIndexStyle(0, DRAW_HISTOGRAM);
SetIndexBuffer(1, BearBuffer);
SetIndexStyle(1, DRAW_HISTOGRAM);
SetIndexBuffer(2, FlipArrow);
SetIndexStyle(2, DRAW_ARROW);
SetIndexArrow(2, 159);
SetIndexEmptyValue(2, EMPTY_VALUE);
IndicatorShortName("Bears/Bulls Power Balance");
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 = InpPeriod + 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--)
{
double bulls = iBullsPower(NULL, 0, InpPeriod, PRICE_CLOSE, i);
double bears = iBearsPower(NULL, 0, InpPeriod, PRICE_CLOSE, i);
double diff = bulls + bears;
BullBuffer[i] = (diff >= 0) ? diff : EMPTY_VALUE;
BearBuffer[i] = (diff < 0) ? diff : EMPTY_VALUE;
FlipArrow[i] = EMPTY_VALUE;
double diffPrev = 0;
if(i + 1 < rates_total)
{
double bullsPrev = iBullsPower(NULL, 0, InpPeriod, PRICE_CLOSE, i + 1);
double bearsPrev = iBearsPower(NULL, 0, InpPeriod, PRICE_CLOSE, i + 1);
diffPrev = bullsPrev + bearsPrev;
}
bool flipped = (diff >= 0 && diffPrev < 0) || (diff < 0 && diffPrev >= 0);
if(flipped)
FlipArrow[i] = diff;
}
return(rates_total);
}
MetaEditorでのコンパイル・実行手順
実際にMT4で動かすまでの手順です。
- MetaEditorで新規インジケーター「BearsBullsBalance」を作成し、上のコードを貼り付けてコンパイルする
- エラー・警告が0件であることを確認する
- サブウィンドウにヒストグラムが青(買い方優勢)と赤(売り方優勢)で色分けされて表示されることを確認する
- 優劣が逆転したバーに矢印が出ることを確認する
- InpPeriodの値を変えて、優劣の切り替わり頻度がどう変わるか確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
BearsPowerが負値基準であることを忘れる
Bears Powerは「安値-EMA」のため、
通常は負の値になります。
「値が大きいほど売り圧力が強い」という直感とは逆で、
マイナス方向に大きいほど売り圧力が強いことになります。
periodとapplied_priceを2関数で揃え忘れる
BullsPowerとBearsPowerで期間や適用価格が違うと、
比較している前提がずれてしまいます。
必ず同じ値を両方の関数に渡してください。
bulls + bearsという足し算に違和感を覚える
「引き算では」と思うかもしれませんが、
BearsPowerがすでに負の値のため、
足し算が正しく「buy-sell」の差分になります。
既刊テクニカル指標記事との使い分け
似た「勢い系」の記事が複数あるため、使い分けを整理します。
| 記事 | 計算対象 | 用途 |
|---|---|---|
| 本記事(Bears/BullsPower) | 高値or安値とEMAの差 | 買い方・売り方どちらが優勢か |
| iForce記事(既刊) | 価格変化×出来高 | 出来高を含めた勢い |
| iOsMA記事(既刊) | MACDと主線の差 | MACDのクロス予兆 |
よくある質問
iBearsPower/iBullsPowerについて、よくある疑問に回答します。
なぜ2つの関数を1つの記事で解説するのですか?
Bulls PowerとBears Powerは、
Alexander Elderが同じ「Elder-Ray」という理論の中で、
買い方・売り方という対になる概念として考案したためです。
このインジケーターをEAのフィルターに使えますか?
使えます。
本記事の優劣逆転判定部分を関数化すれば、
「買い方優勢に切り替わったら買いエントリーを許可する」
といった環境認識フィルターに組み込めます。
InpPeriodはどれくらいの値が適切ですか?
Alexander Elderは13を推奨していますが、
通貨ペアや時間足によって最適値は変わります。
まずは既定値の13から始め、
チャートを見ながら調整することをおすすめします。
【MQL4】iBearsPower/iBullsPowerで「買い方・売り方どちらの勢いが強いか」を判定するインジケーターの作り方:まとめ
iBearsPower/iBullsPowerは、
高値・安値とEMAの差から、
買い方・売り方それぞれの勢いを別々に取り出せる関数です。
2つの値を足し合わせることで、
既刊iForce・既刊iOsMAとは違う視点から、
いまどちら側が優勢かを1本のヒストグラムで判定できます。
Bears Powerが負値基準であることを忘れずに実装してください。
コメント