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で動かすまでの手順です。
- MetaEditorで新規インジケーター「ADDivergenceIndicator」を作成し、上のコードを貼り付けてコンパイルする
- エラー・警告が0件であることを確認する
- チャート上に赤・緑の矢印が表示されることを確認する
- 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の動きがズレるダイバージェンスを、
検知すれば、見た目の値動きに資金の出入りが、
伴っているかを確認する手がかりになります。
コメント