既刊の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でのコンパイル・バックテスト手順

実際に動かすまでの手順です。

  1. MetaEditorで新規Expert Advisor「PowerPullbackEA」を作成し、上のコードを貼り付ける
  2. F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  3. ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
  4. 「結果」タブで、トレンド方向と逆側の力が弱まった直後にエントリーが発生していることを確認する
  5. 既刊の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つで、

調整できる構成にしています。

関連記事