既刊のiBearsPower/iBullsPowerインジケーターの記事では、
2つの値の差分で「どちらが優勢か」を判定する設計を解説しました。
この記事ではその優劣判定を使わず、
EMAで上位のトレンド方向を先に決めたうえで、
トレンドと逆側の力(戻り)が弱まった瞬間だけを、
エントリー条件にする順張りEAを作ります。
・既刊の優劣逆転判定との判定軸の違い
・EMAトレンド方向+戻り確認という2段構えの設計
・BearsPower/BullsPowerの符号を使った戻りの弱まりの検知
・実際に動くEAのコード全体
設計思想: なぜ優劣判定ではなく「戻り終了」を見るのか
まず、既刊インジケーターと何が違うのかを整理します。
既刊インジケーターのおさらい
既刊インジケーターは、BullsPowerとBearsPowerを足し合わせ、
その符号が反転した瞬間を、買い方・売り方の優劣逆転として矢印で知らせる設計でした。
既刊のクロス判定EA群との違い
このサイトには、符号が反転した瞬間を、
そのまま発注条件にするEAが既にいくつも存在します。
| EA | 判定方法 | 見ているもの |
|---|---|---|
| 既刊Force Index/Momentum/RVIクロスEA | ゼロライン・基準線クロス | 符号反転の瞬間 |
| 既刊StdDev/MFIダイバージェンスEA | 収縮・反転の形状検知 | ボラティリティ・価格との逆行 |
| 本記事(BullsPower/BearsPower EA) | EMAトレンド方向+戻りの弱まり | トレンド継続中の浅い戻り |
本記事は、優劣が入れ替わる瞬間を待たず、トレンド方向を先に決めた上で、
その逆側の力が弱まる途中の段階を狙う、別の設計です。
EMAトレンド方向+戻り確認の設計思想
・優劣逆転(符号反転)を待つと、戻りの最中に発注してしまう場合がある
・先にEMAでトレンド方向を決めておけば、逆行中のエントリーを避けやすい
・戻りの力(逆側のパワー)が弱まった時点を狙うことで、戻りが終わりかけの位置を取りやすい
優劣が完全に入れ替わるのを待つと、
トレンドの終わり際でエントリーしてしまう危険があります。
本記事は、逆側の力が「まだ残っているが弱まっている」段階を狙います。
iBearsPower/iBullsPower関数のシグネチャ(既刊記事で確認済み)
既刊ibears-ibulls-power-mt4.mdで確認済みの引数構成を再掲します。
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 );
既刊記事と同じく、2関数で引数の並びが完全に同じです。
上昇トレンド中はBearsPower、下降トレンド中はBullsPowerを見る
上昇トレンド中は、下向きの力であるBearsPowerが弱まるかどうかを確認します。
下降トレンド中は逆に、上向きの力であるBullsPowerが弱まるかどうかを確認します。
トレンド方向はEMAとの位置関係で判定する
double ema1 = iMA(_Symbol, 0, InpTrendPeriod, 0, MODE_EMA, PRICE_CLOSE, 1); bool uptrend = (Close[1] > ema1); bool downtrend = (Close[1] < ema1);
確定済みの直近バー(shift1)の終値と、
EMAの位置関係だけで、簡易的にトレンド方向を決めます。
発注条件・損切り・ポジション重複の防止
判定だけでは発注にならないため、安全策を組み込みます。
上昇トレンド中の買いエントリー条件
double bearsNow = iBearsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 1); double bearsPrev = iBearsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 2); bool pullbackEndingUp = (bearsNow < 0 && bearsNow > bearsPrev); bool buySignal = (uptrend && pullbackEndingUp);
BearsPowerがまだ負の値のままでも、
前のバーより弱まっていれば、戻りが終わりかけとみなします。
下降トレンド中の売りエントリー条件
double bullsNow = iBullsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 1); double bullsPrev = iBullsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 2); bool pullbackEndingDown = (bullsNow > 0 && bullsNow < bullsPrev); bool sellSignal = (downtrend && pullbackEndingDown);
上昇トレンド側と対になる、同じ考え方の条件です。
ポジション重複を防ぐチェック
bool HasOpenPosition()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic)
return(true);
}
return(false);
}
同じマジックナンバー・同じ通貨ペアでポジションが既にあるかを確認し、
あれば新規エントリーをスキップします。
実際に動くコード全体
ここまでの要素をまとめた、EAの全体です。
//+------------------------------------------------------------------+
//| PowerPullbackEA.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
input int InpTrendPeriod = 50; //トレンド判定用EMAの期間
input int InpPowerPeriod = 13; //BearsPower/BullsPowerの平均化期間
input double InpLots = 0.1; //発注ロット数
input int InpStopLossPips = 300; //損切り(pips)
input int InpTakeProfitPips = 600; //利確(pips)
input int InpMagic = 20261106; //マジックナンバー
datetime lastBarTime = 0;
bool HasOpenPosition()
{
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic)
return(true);
}
return(false);
}
void OnTick()
{
if(Time[0] == lastBarTime)
return;
lastBarTime = Time[0];
int needed = InpTrendPeriod + InpPowerPeriod + 5;
if(Bars < needed)
return;
double ema1 = iMA(_Symbol, 0, InpTrendPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
bool uptrend = (Close[1] > ema1);
bool downtrend = (Close[1] < ema1);
double bearsNow = iBearsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 1);
double bearsPrev = iBearsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 2);
double bullsNow = iBullsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 1);
double bullsPrev = iBullsPower(_Symbol, 0, InpPowerPeriod, PRICE_CLOSE, 2);
bool pullbackEndingUp = (bearsNow < 0 && bearsNow > bearsPrev);
bool pullbackEndingDown = (bullsNow > 0 && bullsNow < bullsPrev);
bool buySignal = (uptrend && pullbackEndingUp);
bool sellSignal = (downtrend && pullbackEndingDown);
if(HasOpenPosition())
return;
double point = _Point;
if(_Digits == 3 || _Digits == 5)
point *= 10;
if(buySignal)
{
double sl = Bid - InpStopLossPips * point;
double tp = Ask + InpTakeProfitPips * point;
int ticket = OrderSend(_Symbol, OP_BUY, InpLots, Ask, 3, sl, tp,
"PowerPullback", InpMagic, 0, clrBlue);
if(ticket < 0)
Print("買い発注に失敗しました。エラーコード: ", GetLastError());
}
else if(sellSignal)
{
double sl = Ask + InpStopLossPips * point;
double tp = Bid - InpTakeProfitPips * point;
int ticket = OrderSend(_Symbol, OP_SELL, InpLots, Bid, 3, sl, tp,
"PowerPullback", InpMagic, 0, clrRed);
if(ticket < 0)
Print("売り発注に失敗しました。エラーコード: ", GetLastError());
}
}
トレンド方向と、戻りの弱まりが一致した瞬間だけ、新規エントリーが発生します。
MetaEditorでのコンパイル・バックテスト手順
実際に動かすまでの手順です。
- MetaEditorで新規Expert Advisor「PowerPullbackEA」を作成し、上のコードを貼り付ける
- F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
- 「結果」タブで、トレンド方向と逆側の力が弱まった直後にエントリーが発生していることを確認する
- 既刊のiBearsPower/iBullsPowerインジケーターを同時に表示し、エントリーのタイミングを目視で確認する
よくあるエラーと注意点
実際に運用する前に、確認しておきたい点です。
EMA期間とパワー指標の期間を混同する
・InpTrendPeriodはトレンド方向を決めるEMAの期間
・InpPowerPeriodはBearsPower/BullsPower自体の平均化期間
・2つは別のパラメーターであり、同じ値にする必要はない
1本前との比較だけでは早すぎる場合がある
ギザギザした値動きが続く相場では、
1本前との比較だけで「弱まった」と判定すると、
本当の戻り終了より早いタイミングでエントリーしてしまう場合があります。
トレンドの無いレンジ相場で誤検知が増える
EMAによるトレンド判定自体が、
レンジ相場では頻繁に反転するため、
既刊の環境認識系インジケーターと組み合わせて使うことをおすすめします。
既刊テクニカル指標記事との使い分け
似た「勢い系・トレンド系」の記事が複数あるため、使い分けを整理します。
| 記事 | 判定方法 | 用途 |
|---|---|---|
| 本記事(BullsPower/BearsPower EA) | EMAトレンド方向+戻りの弱まり | トレンド継続中の浅い戻りを狙う |
| 既刊iBearsPower/iBullsPower記事 | 差分の符号反転 | どちらが優勢かを常時表示 |
| 既刊mtf-trend-agreement-ea記事 | 上位足・現在足のトレンド一致 | 複数時間足での環境認識 |
よくある質問
BullsPower/BearsPowerの戻り終了EAについて、
よくある疑問に回答します。
既刊の優劣逆転判定インジケーターと何が違いますか?
判定の起点が違います。
既刊インジケーターは、
優劣が入れ替わる「瞬間」を検知しますが、
本記事はトレンド方向を先に決め、
逆側の力が「弱まる途中」を狙います。
下降トレンドでも同じロジックが使えますか?
使えます。コード内ではBullsPowerの弱まりを見る条件として、
同じ考え方を逆方向にそのまま実装しています。
InpPowerPeriodはどの値から試すべきですか?
既刊インジケーターと同じ、
Alexander Elder推奨の13から始めることをおすすめします。
通貨ペアや時間足によって最適値は変わるため、
チャートを見ながら調整してください。
【MQL4】iBullsPower/iBearsPowerで「トレンド中の浅い戻り終了」を検知する順張りEAの作り方(既刊優劣判定インジケーターとの判定軸の違いも解説):まとめ
この記事では、既刊インジケーターの優劣逆転判定ではなく、
EMAトレンド方向と戻りの弱まりを組み合わせた、
順張りEAを解説しました。
既刊のクロス判定EA群が、
符号反転の瞬間を発注条件にしていたのに対し、
本記事はトレンド方向を先に決め、
逆側の力が弱まる途中の段階を狙う設計で差別化しています。
損切り必須・ポジション重複防止という最低限の安全策を備えた上で、
InpTrendPeriod・InpPowerPeriodの2つで、
調整できる構成にしています。
コメント