iADは、終値が1本のバーの値幅の、

どこに位置するかから資金の出入りを、

累積するMQL4の組み込み関数です。

既刊technical-indicator-functions.mdで、

名前だけ触れていましたが、このサイトでは、

まだiAD単独の解説記事がありませんでした。

この記事では、iADの引数と戻り値を整理し、

価格とiADの動きがズレる、

「ダイバージェンス」を検知するインジケーターの、

作り方を解説します。

この記事で分かること
・iADの3つの引数と戻り値の意味
・既刊iOBV/iMFIとの計算対象の違い
・価格とiADのダイバージェンスの考え方
・実際に動くコード全体

設計思想: 3つの出来高系指標の違い

まず、iADが既刊の2つの指標と、何が違うのかを整理します。

既刊iOBVとの違い

既刊iobv-mt4.mdのOBVは、今の終値が、

前の終値より高いか低いかだけを見て、

出来高を加減算します。

指標 見る位置 加減の基準
iOBV(既刊) 前バーの終値 上げ下げの方向だけ
iAD(本記事) 当バーの値幅内 終値の位置(強さ)

一方、iADは前バーを見ません。

当バーの高値・安値・終値だけから、「どれだけ強く買われたか」を数値化します。

既刊iMFIとの違い

既刊imfi-mt4.mdのMFIは、0〜100の範囲に、

指数化された買われすぎ・売られすぎの指標でした。

補足
・iMFIは範囲が0〜100に固定される
・iADは固定範囲がなく積み上がる
・iOBVと同じ「累積型」の指標
・絶対値ではなく傾きで判断する

iADはiMFIと違い、範囲の決まった指数ではなく、

ずっと積み上がっていく折れ線です。

iAD関数の引数と戻り値

公式リファレンス(MQL4 Reference: iAD)の内容を整理します。

3つの引数の意味

double iAD(
   string symbol,    // 通貨ペア名(NULLで現在のチャート)
   int    timeframe, // 時間足(0で現在の時間足)
   int    shift       // 何本前のバーの値を取得するか
);

iOBVと同じく、期間を指定するperiod引数がありません。

当バーまでの累積値を、そのまま返す設計だからです。

MQL5版との違い: 戻り値とapplied_volume

MQL4のiADは、値をdoubleで直接返します。

一方、MQL5のiADは値ではなく、インジケーターの、

ハンドル(int)を返し、applied_volumeという、

引数が追加されています。

既刊のMQL4→MQL5移行チェックリストと同じ、

テクニカル指標のハンドル方式化という変化点が、

ここにも当てはまります。

サンプルインジケーター: 価格とのダイバージェンス検知

iADの値そのものではなく、価格との、

「ズレ」に注目した設計にします。

ダイバージェンスとは

価格が新高値を更新しているのにiADが新高値を更新していなければ、

「見た目の上昇に資金の出入りが伴っていない」という警戒サインです。

読み方の注意
・ダイバージェンスは必ず反転の予告ではない
・他の指標と組み合わせて判断材料にする
・強いトレンド中は長く続くこともある

直近N本の最大・最小を比較する設計

既刊imfi-divergence-ea-mt4.mdと同じ考え方で、

直近N本の中の価格とiADの最高値・最安値を比較します。

実際に動くコード全体

実際にMetaEditorでコンパイルできる、

ダイバージェンスを矢印表示するインジケーターです。

//+------------------------------------------------------------------+
//|                                   ADDivergenceIndicator.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_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2

input int InpLookback = 20; //ダイバージェンス判定の窓(本)

double BullDivArrow[];
double BearDivArrow[];

int OnInit()
  {
   SetIndexBuffer(0, BullDivArrow);
   SetIndexStyle(0, DRAW_ARROW, EMPTY, 2);
   SetIndexArrow(0, 233);
   SetIndexEmptyValue(0, EMPTY_VALUE);

   SetIndexBuffer(1, BearDivArrow);
   SetIndexStyle(1, DRAW_ARROW, EMPTY, 2);
   SetIndexArrow(1, 234);
   SetIndexEmptyValue(1, EMPTY_VALUE);

   IndicatorShortName("iAD Divergence 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 = InpLookback + 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--)
     {
      BullDivArrow[i] = EMPTY_VALUE;
      BearDivArrow[i] = EMPTY_VALUE;

      if(i + InpLookback >= rates_total)
         continue;

      double curClose = close[i];
      double curAd    = iAD(NULL, 0, i);

      double highestClose = curClose;
      double highestAd    = curAd;
      double lowestClose  = curClose;
      double lowestAd     = curAd;

      for(int k = 1; k <= InpLookback; k++)
        {
         double pastClose = close[i + k];
         double pastAd    = iAD(NULL, 0, i + k);
         if(pastClose > highestClose) highestClose = pastClose;
         if(pastAd > highestAd)       highestAd    = pastAd;
         if(pastClose < lowestClose)  lowestClose  = pastClose;
         if(pastAd < lowestAd)        lowestAd     = pastAd;
        }

      bool priceNewHigh = (curClose >= highestClose);
      bool adNewHigh    = (curAd >= highestAd);
      bool priceNewLow  = (curClose <= lowestClose);
      bool adNewLow     = (curAd <= lowestAd);

      if(priceNewHigh && !adNewHigh)
         BearDivArrow[i] = high[i] + 10 * Point;
      if(priceNewLow && !adNewLow)
         BullDivArrow[i] = low[i] - 10 * Point;
     }

   return(rates_total);
  }

価格が新高値なのにiADが新高値でなければ、高値の少し上に赤い矢印を出します。

価格が新安値なのにiADが新安値でなければ、安値の少し下に緑の矢印を出します。

MetaEditorでのコンパイル・実行手順

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

  1. MetaEditorで新規インジケーター「ADDivergenceIndicator」を作成し、上のコードを貼り付けてコンパイルする
  2. エラー・警告が0件であることを確認する
  3. チャート上に赤・緑の矢印が表示されることを確認する
  4. InpLookbackの値を変え、矢印の出る頻度が変わることを確認する

よくあるエラーと注意点

実装でつまずきやすいポイントをまとめます。

累積系指標は基準点で絶対値が変わる

補足
・iADは計算開始点から積み上がり続ける
・絶対値そのものに意味はない
・既刊iOBVと同様、傾きと比較で読む
・表示期間を変えると見た目も変わる

MQL5移植時にapplied_volumeを指定し忘れる

前述のとおり、MQL5版はapplied_volumeという、

引数が追加されています。MQL4からそのまま、

移植する際は、この引数の指定を忘れないようにしてください。

既刊の出来高系記事との使い分け

似た目的の記事が複数あるため、使い分けを整理します。

記事 見るもの 範囲
本記事(iAD) バー内の終値位置 無限に累積
iOBV記事(既刊) 前バーとの方向 無限に累積
iMFI記事(既刊) 価格×出来高 0〜100

よくある質問

iADについて、よくある疑問に回答します。

iADとiOBV、どちらを使うべきですか?

目的によって使い分けます。前バーとの、

方向だけでよければiOBV、当バー内の、

強さまで見たいならiADが向いています。

FXでiADを使う意味はありますか?

既刊iOBV・iMFIと同じく、MT4のvolumeは、

実出来高ではなくティックボリュームです。

この前提を踏まえたうえで、値動きの傾向を、

測る補助指標として使います。

このインジケーターをEAのフィルターに使えますか?

使えます。ダイバージェンス判定部分だけを関数化すれば、

既刊imfi-divergence-ea-mt4.mdと同じ要領で、

エントリーの見送り条件に組み込めます。

【MQL4】iAD(Accumulation/Distribution)で終値の位置から資金の出入りを判定し価格との「ダイバージェンス」を検知するインジケーターの作り方:まとめ

iADは、既刊iOBVとは違い、当バー内の、

終値の位置から資金の出入りを測る関数です。

既刊iMFIのような0〜100の指数ではなく、

iOBVと同じく積み上がり続ける累積型の指標です。

価格とiADの動きがズレるダイバージェンスを、

検知すれば、見た目の値動きに資金の出入りが、

伴っているかを確認する手がかりになります。

関連記事