既刊iAD(Accumulation/Distribution)インジケーターの記事では、

価格とiADが新高値・新安値でズレる「ダイバージェンス」を検知する設計を解説しました。

この記事では価格との比較を一切使わず、

iAD自身の「傾きが反転した瞬間」だけを発注条件にするEAを作ります。

既刊のiMFIダイバージェンスEAとは、判定の仕組みそのものが異なる設計です。

この記事で分かること
・ダイバージェンスを使わない、iAD単体での判定の作り方
・2点間の差で「傾き」を計算し、反転を検知する方法
・既刊imfi-divergence-ea-mt4.mdとの判定軸の違い
・実際に動くEAのコード全体

設計思想: なぜダイバージェンスではなく「傾きの反転」を使うのか

まず、既刊のダイバージェンス型とは別の判定軸を選んだ理由を整理します。

既刊iADインジケーターのおさらい

既刊インジケーターは、

直近N本の中で価格が新高値・新安値を更新しているのに、

iADが新高値・新安値を更新していないかを比較する設計でした。

既刊iMFIダイバージェンスEAとの重複を避ける

記事 判定の仕組み 価格との比較
既刊iMFIダイバージェンスEA 直近N本の最高値・最安値の比較 使う
既刊iADインジケーター(ダイバージェンス) 直近N本の最高値・最安値の比較 使う
本記事(iAD傾き反転EA) 2点間の差(傾き)の符号反転 使わない

既刊iMFIダイバージェンスEAと同じ「N本の最高値・最安値を比較する」設計を、

iADでそのまま繰り返すと同一骨格の3匹目になってしまうため、

本記事は価格を一切見ない別の仕組みを採用しました。

「絶対値でなく傾きで判断する」を発注条件に落とし込む

補足
・既刊iADインジケーターの注意点: 累積系指標は基準点で絶対値が変わる
・絶対値そのものには意味がなく、傾きと比較で読むのが正しい使い方
・この記事は、その「傾き」自体を発注のトリガーにする

iADの値そのものがいくつかではなく、

直前と比べて増える方向から減る方向へ変わった瞬間(またはその逆)を、

買い方・売り方の勢いが転換したサインとして使います。

iADの傾きを計算し反転を検知するロジック

価格を使わず、iADの値だけで判定を組み立てます。

2点間の差で「傾き」を計算する

double GetAdSlope(int shift, int period)
  {
   return(iAD(NULL, 0, shift) - iAD(NULL, 0, shift + period));
  }

InpSlopePeriod本前のiADと比べた増減を、傾きとして扱います。

傾きの符号が反転した瞬間を検知する

double slopeNow  = GetAdSlope(1, InpSlopePeriod);
double slopePrev = GetAdSlope(2, InpSlopePeriod);

bool bullTurn = (slopePrev <= 0 && slopeNow > 0);
bool bearTurn = (slopePrev >= 0 && slopeNow < 0);

前のバーでは0以下(下降か横ばい)だった傾きが、

今のバーで上向きに変わった瞬間をbullTurnとして検知します。

発注条件・損切り・ポジション重複の防止

判定だけでは発注にならないため、安全策を組み込みます。

買い・売りの発注条件

bool buySignal  = bullTurn;
bool sellSignal = bearTurn;

傾きの反転以外の条件は付けず、シンプルな単一トリガーにしています。

損切り・利確を必ず指定する

`sl`(損切り)・`tp`(利確)は発注時点で必ず計算し、未設定のまま放置しません。

ポジション重複を防ぐチェック

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の全体です。

//+------------------------------------------------------------------+
//|                                   ADSlopeReversalEA.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    InpSlopePeriod    = 10;       //傾きを測るバー数
input double InpLots           = 0.1;      //発注ロット数
input int    InpStopLossPips   = 300;      //損切り(pips)
input int    InpTakeProfitPips = 600;      //利確(pips)
input int    InpMagic          = 20261114; //マジックナンバー

datetime lastBarTime = 0;

double GetAdSlope(int shift, int period)
  {
   return(iAD(NULL, 0, shift) - iAD(NULL, 0, shift + period));
  }

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 = InpSlopePeriod + 5;
   if(Bars < needed)
      return;

   double slopeNow  = GetAdSlope(1, InpSlopePeriod);
   double slopePrev = GetAdSlope(2, InpSlopePeriod);

   bool bullTurn = (slopePrev <= 0 && slopeNow > 0);
   bool bearTurn = (slopePrev >= 0 && slopeNow < 0);

   bool buySignal  = bullTurn;
   bool sellSignal = bearTurn;

   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,
                             "ADSlopeReversal", 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,
                             "ADSlopeReversal", InpMagic, 0, clrRed);
      if(ticket < 0)
         Print("売り発注に失敗しました。エラーコード: ", GetLastError());
     }
  }

iADの傾きが0をまたいだ瞬間だけ、新規エントリーが発生します。

MetaEditorでのコンパイル・バックテスト手順

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

  1. MetaEditorで新規Expert Advisor「ADSlopeReversalEA」を作成し、上のコードを貼り付ける
  2. F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  3. ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
  4. 「結果」タブで、傾きが反転したタイミングと既刊iADインジケーターの折れ線の向きが変わるタイミングが一致しているか目視確認する

よくあるエラーと注意点

実際に運用する前に、確認しておきたい点です。

InpSlopePeriodを短くしすぎるとノイズに反応する

注意
・期間を短くすると反転の検知は早くなるが、小さな上下動にも反応しやすくなる
・初期値10本のまま、まず過去チャートで反転の頻度を確認する
・通貨ペアや時間足によって適切な期間は変わる

出来高がティックボリュームである前提

MT4のiAD自体が内部で使う出来高は、

実出来高ではなくティックボリューム(約定件数相当)です。

この前提を踏まえたうえで、補助的な判断材料として扱ってください。

既刊iMFIダイバージェンスEAと混同する

既刊imfi-divergence-ea-mt4.mdは、

価格とiMFIの新高値・新安値のズレを見る設計ですが、

本EAは価格を一切見ておらず、iAD自身の傾きだけで判定します。

両者は同時にシグナルを出すとは限りません。

既刊の出来高系EA・インジケーターとの使い分け

似た「出来高系」の記事が複数あるため、使い分けを整理します。

記事 判定方法 価格との比較
本記事(iAD傾き反転EA) iAD自身の傾きの符号反転 使わない
既刊iMFIダイバージェンスEA 価格とiMFIの最高値・最安値のズレ 使う
既刊iADインジケーター(本記事の元ネタ) 価格とiADの最高値・最安値のズレ 使う

よくある質問

iAD傾き反転EAについて、よくある疑問に回答します。

既刊のダイバージェンス型と比べてどちらが優れていますか?

優劣ではなく、見ているものが異なります。

ダイバージェンス型は価格とのズレに注目し、

本記事は価格を見ずにiAD自身の勢いの変化だけに注目しています。

InpSlopePeriodはどれくらいが適切ですか?

本記事の初期値10本は目安です。

短くすると反応が早くなりますが、

小さな上下動にも反応する頻度が増えるため、チャートを見ながら調整してください。

傾きが反転してもすぐ元に戻ることはありますか?

あります。

本記事の判定は2点間の差だけを見る単純な設計のため、

一時的な上下動でも反転として検知されることがあります。

【MQL4】iADの「傾きの反転」をエントリー条件にするEAの作り方(ダイバージェンスとは別の判定軸):まとめ

この記事では、既刊iADインジケーターのダイバージェンス設計とは別に、

価格との比較を一切使わない、

iAD自身の傾きの符号反転だけを発注条件にするEAを解説しました。

既刊iMFIダイバージェンスEAと同じ『N本の最高値・最安値を比較する』設計を、

そのまま繰り返すのではなく、

既刊iAD記事自身が示した『絶対値でなく傾きで判断する』という考え方を、

発注ロジックに採用しています。

損切り必須・ポジション重複防止という最低限の安全策を備えた上で、

InpSlopePeriod1つで調整できる、シンプルな構成にしています。

関連記事