iBearsPowerとiBullsPowerは、
Alexander Elderが考案したElder Ray指標の値を、
MQL4で直接取得できる組み込み関数です。
既刊のテクニカルインジケーター関数一覧記事で名前だけは触れていましたが、
このサイトではまだ単独の解説記事がありませんでした。
この記事では、2つの関数の引数と戻り値を整理したうえで、
買い方・売り方のどちらかが「勢い負け」
した瞬間を検知する、実際に動くインジケーターの作り方を解説します。
・iBearsPower/iBullsPowerの5つの引数と戻り値の意味
・既刊iRSI
・既刊iMFI
・既刊iForceとの計算対象の違い
・ブルズパワーとベアーズパワーを2本セットで見る理由
・実際に動くコード全体
設計思想: 高値・安値とEMAの差で何が分かるか
まず、この2指標が既刊のオシレーター系指標と何が違うのかを整理します。
既刊iRSI・既刊iMFI・既刊iForceとの計算対象の違い
ブルズパワーは「高値 – EMA」、ベアーズパワーは「安値 – EMA」
という引き算で求めます。
| 指標 | 使う値 | 何を測るか |
|---|---|---|
| iRSI(既刊) | 終値の上昇・下落幅の比率 | 買われすぎ・売られすぎ |
| iMFI(既刊) | 出来高込みの価格変化 | 出来高を考慮した買われすぎ・売られすぎ |
| iForce(既刊) | 価格変化×出来高 | 値動きの勢い(ゼロクロス) |
| iBearsPower/iBullsPower(本記事) | 高値・安値とEMAの差 | EMA基準に対して買い方・売り方がどれだけ優勢か |
他の指標が終値や出来高を主役にするのに対し、
この2指標は「高値・安値がEMAからどれだけ離れているか」
という、トレンドの基準線に対する優劣を直接測る点が特徴です。
ブルズパワーとベアーズパワーが2本セットである理由
ブルズパワーは買い方の勢い(高値がEMAをどれだけ上回っているか)、
ベアーズパワーは売り方の勢い(安値がEMAをどれだけ下回っているか)を示します。
・ブルズパワーが0以下:高値がEMAに届いていない=買い方が劣勢
・ベアーズパワーが0以上:安値がEMAを下回っていない=売り方が劣勢
・片方だけでは「優勢側」しか分からず、両方見て初めて全体像が分かる
片方の指標だけを見ると判断を誤りやすいため、
本記事のインジケーターでは両方を同時に表示します。
iBearsPower/iBullsPower関数の引数と戻り値
公式リファレンス(MQL4 Reference: iBearsPower・iBullsPower)の内容を整理します。
5つの引数の意味(両関数共通)
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 );
関数名以外は完全に同じ並びのため、
どちらを呼んでいるかを変数名で分かりやすくしておくことを、
おすすめします。
MQL5版との違い: ハンドル化とapplied_price引数の廃止
MQL4の2関数は、値をdoubleで直接返します。
一方、MQL5のiBearsPower・iBullsPowerは、
値ではなくインジケーターのハンドル(int)を返すうえ、
applied_price引数自体が廃止されています。
・MQL5版はハンドルを返すだけで、値そのものは返さない
・実際の値はCopyBuffer()で別途取得する必要がある
・引数はsymbol
・period
・ma_periodの3つだけに減り、applied_priceの指定ができない
既刊のMQL4→MQL5移行チェックリストで扱った「引数が減る」
パターンの中でも、
applied_priceそのものが無くなる点は、
この2関数特有の変化です。
サンプルインジケーター: 勢い負けの瞬間を検知する設計
2本のラインを表示したうえで、どちらかが0ラインを通過した瞬間だけ矢印で知らせます。
ブルズパワーが0以下に落ちた瞬間
高値がEMAに届かなくなった状態であり、
買い方の勢いが弱まったサインとして下向き矢印を出します。
ベアーズパワーが0以上に上がった瞬間
安値がEMAを下回らなくなった状態であり、
売り方の勢いが弱まったサインとして上向き矢印を出します。
・上昇トレンド中にブルズパワーが0以下に落ちた:上昇の勢いが息切れしつつある
・下降トレンド中にベアーズパワーが0以上に上がった:下降の勢いが息切れしつつある
・いずれも単独のエントリー根拠にはせず、トレンド判定と組み合わせることをおすすめする
このインジケーターは「勢いが弱まった兆候」を示すものであり、
反転を保証するものではない点に注意してください。
実際に動くコード全体
実際にMetaEditorでコンパイルできる、
ブルズパワー・ベアーズパワーの2本ラインと、
勢い負け矢印を表示するインジケーターです。
//+------------------------------------------------------------------+
//| BullsBearsPowerIndicator.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 Red
#property indicator_color3 DodgerBlue
#property indicator_color4 Magenta
#property indicator_width3 2
#property indicator_width4 2
input int InpPeriod = 13; //EMAの平均化期間
input int InpAppliedPrice = PRICE_CLOSE; //適用価格
double BullsBuffer[];
double BearsBuffer[];
double BullsWeakArrow[];
double BearsWeakArrow[];
int OnInit()
{
SetIndexBuffer(0, BullsBuffer);
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(1, BearsBuffer);
SetIndexStyle(1, DRAW_LINE);
SetIndexBuffer(2, BullsWeakArrow);
SetIndexStyle(2, DRAW_ARROW, EMPTY, 2);
SetIndexArrow(2, 242);
SetIndexEmptyValue(2, EMPTY_VALUE);
SetIndexBuffer(3, BearsWeakArrow);
SetIndexStyle(3, DRAW_ARROW, EMPTY, 2);
SetIndexArrow(3, 241);
SetIndexEmptyValue(3, EMPTY_VALUE);
IndicatorShortName("Bulls/Bears Power Weakness 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 = InpPeriod + 10;
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, InpAppliedPrice, i);
double bears = iBearsPower(NULL, 0, InpPeriod, InpAppliedPrice, i);
BullsBuffer[i] = bulls;
BearsBuffer[i] = bears;
BullsWeakArrow[i] = EMPTY_VALUE;
BearsWeakArrow[i] = EMPTY_VALUE;
if(i + 1 >= rates_total)
continue;
double prevBulls = iBullsPower(NULL, 0, InpPeriod, InpAppliedPrice, i + 1);
double prevBears = iBearsPower(NULL, 0, InpPeriod, InpAppliedPrice, i + 1);
bool bullsFellBelowZero = (prevBulls >= 0 && bulls < 0);
bool bearsRoseAboveZero = (prevBears <= 0 && bears > 0);
if(bullsFellBelowZero)
BullsWeakArrow[i] = bulls - 0.0003;
if(bearsRoseAboveZero)
BearsWeakArrow[i] = bears + 0.0003;
}
return(rates_total);
}
MetaEditorでのコンパイル・実行手順
実際にMT4で動かすまでの手順です。
- MetaEditorで新規インジケーター「BullsBearsPowerIndicator」を作成し、上のコードを貼り付けてコンパイルする
- エラー・警告が0件であることを確認する
- サブウィンドウに緑(ブルズパワー)と赤(ベアーズパワー)の2本ラインが表示されることを確認する
- ブルズパワーが0以下に落ちたバーに水色矢印が出ることを確認する
- ベアーズパワーが0以上に上がったバーにピンク矢印が出ることを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
ベアーズパワーの値が負であることを忘れる
ベアーズパワーは通常、マイナスの値を取ります。
「値が大きいほど売り方が強い」と誤解しないよう、「0に近づくほど、
または0を超えるほど売り方が弱い」という向きで読んでください。
2つの関数名を打ち間違える
iBullsPower(買い方)とiBearsPower(売り方)は、
スペルが似ているため、変数名を対応させてコード中で混同しないようにしてください。
MQL5移植時にapplied_price引数を書いてしまう
前述のとおり、MQL5版は引数にapplied_priceが無いため、
MQL4のコードをそのまま5引数で呼び出すとコンパイルエラーになります。
既刊のオシレーター系記事との使い分け
似た目的の記事が複数あるため、使い分けを整理します。
| 記事 | 使う値 | 用途 |
|---|---|---|
| 本記事(Bears/Bulls Power) | 高値・安値とEMAの差 | EMA基準に対する買い方・売り方の優劣 |
| iRSI記事(既刊) | 終値の上昇・下落幅の比率 | 買われすぎ・売られすぎの判定 |
| iMFI記事(既刊) | 出来高込みの価格変化 | 出来高を考慮した買われすぎ・売られすぎ |
よくある質問
iBearsPower・iBullsPowerについて、よくある疑問に回答します。
ブルズパワーとベアーズパワー、どちらか1つだけ見てもいいですか?
目的に応じて片方だけ見ることもできますが、
買い方と売り方の全体像を把握するには、
両方を併用することをおすすめします。
本記事のインジケーターも最初から両方を表示する設計にしています。
このインジケーターをEAのフィルターに使えますか?
使えます。
0ライン通過の判定部分だけを関数化すれば、
既刊のクロス判定EA群と同じ要領で、
エントリー条件に組み込めます。
EMAの期間(InpPeriod)はどれくらいが適切ですか?
通貨ペアや時間足によって適切な値は変わります。
Elder自身は13期間を推奨しており、本記事でも既定値を13にしています。
【MQL4】iBearsPower・iBullsPower(ベアーズ/ブルズパワー)で買い方・売り方の「勢い負け」を検知するインジケーターの作り方:まとめ
iBearsPower・iBullsPowerは、
既刊iRSI・既刊iMFI・既刊iForceとは違い、
高値・安値とEMAの差で買い方・売り方の優劣そのものを測る関数です。
0ライン通過を検知することで、トレンドの勢いが弱まった兆候を、
買い方・売り方どちらの視点からも捉えられます。
MQL5では戻り値がハンドルに変わり、
applied_price引数も廃止される点に注意してください。
コメント