MT4のADX(DMI)は他社のADXと何が違うのか?

追記:MT4のインディケータで問題なのはRSIではなく、ADX(DMI)です。MT4のADXはどうも一般に使用されているものとはだいぶ違うように思いますので、注意が必要と思います。

とのコメントを頂きましたので、早速注意して見てみたいと思います。
私の愛読書マーケットのテクニカル秘録~独自システム構築のために (ウィザードブックシリーズ)でのADXの定義は、DIもADX単純移動平均を用いて求めています。
この方式でのDIやADXの求め方は、こちら に分かりやすく説明されています。

一方、MT4でのADXの計算式は、http://codebase.mql4.com/280 の ADX.mq4で分かります。
ADX.mq4は、標準機能の Average Directional Movement Indexと上限値と下限値を合わせて重ねると完全に一致するので、このコードが標準機能での計算式だと思います。

…で、その中身は…

PlusDiBuffer[i]=iMAOnArray(PlusSdiBuffer,Bars,ADXPeriod,0,MODE_EMA,i);
MinusDiBuffer[i]=iMAOnArray(MinusSdiBuffer,Bars,ADXPeriod,0,MODE_EMA,i);
ADXBuffer[i]=iMAOnArray(TempBuffer,Bars,ADXPeriod,0,MODE_EMA,i);

なんと、、DIもADXも指数移動平均(EMA)が使われています。


ちなみに日本語版Wikipediaでは、

Wilderは移動平均には、14日の修正移動平均を使っていた。14日の単純移動平均が使われることも多い。それ以外の移動平均が使われることもある。

と書かれており、MT4のADXはそれ以外の移動平均…というパターンなのですね。^^;


単純移動平均を使いたい場合は、MODE_EMAMODE_SMA

PlusDiBuffer[i]=iMAOnArray(PlusSdiBuffer,Bars,ADXPeriod,0,MODE_SMA,i);
MinusDiBuffer[i]=iMAOnArray(MinusSdiBuffer,Bars,ADXPeriod,0,MODE_SMA,i);
ADXBuffer[i]=iMAOnArray(TempBuffer,Bars,ADXPeriod,0,MODE_SMA,i);

Wilderさん純正の修正移動平均を使いたい場合は、ADXPeriodADXPeriod*2-1

PlusDiBuffer[i]=iMAOnArray(PlusSdiBuffer,Bars,ADXPeriod*2-1,0,MODE_EMA,i);
MinusDiBuffer[i]=iMAOnArray(MinusSdiBuffer,Bars,ADXPeriod*2-1,0,MODE_EMA,i);
ADXBuffer[i]=iMAOnArray(TempBuffer,Bars,ADXPeriod*2-1,0,MODE_EMA,i);

の改造を行えばOK....なはずです。