【MQL5でADXの値を取得する方法】

EA制作お役立ち記事

スポンサーリンク
スポンサーリンク

DMI・ADXとは?

DMIは「Directional Movement Index」の略で、

RSI(Relative Strength Index)を開発した、J.W.ワイルダー氏によって開発されたインジケータです。

MT5では「平均」の意味を冠した[Average]が頭について、Average Directional Movement Indexという名前で、インジケータとして登録されています。

Average Directional Movement IndexもDirectional Movement Indexも同じ意味で

「方向性指数」と一般的に訳されています。

ADXで検索すると、DMIも数多くヒットしますが、2つは同じもの、という事です。

ここから先は、MT5に登録されている呼称の略語ADXで、統一して話を進めていきます。

ADXは3本のラインで構成されるマルチバッファインディケーターです。

+DIラインが上昇トレンドの強さ、

-DIラインが下降トレンドの強さ、

ADXラインは発生しているトレンド自体の強弱度合い

をそれぞれ示している、と言われています。

ADXの計算式を例えば、オアンダジャパンのホームページなどで見てもらうとわかるのですが、

  • まずDMを計算し、
  • DM(とTR)をもとにDIを計算し
  • DIをもとにDXを計算し
  • DXをもとにADXを計算

・・・と数値にトンチレベルの、度重なる加工が為されていることがわかります。

個人的にはこのインジケータにどこまでの優位性があるのか、疑問ではありますが、

この記事の本旨はADXの優位性を検証することではありません。

MQL5で、ADXの各種値を取得する記述を見ていきましょう。

ADXの値取得のロードマップ

以下の手順でコードを記述していきます

  • ADXの値を格納する変数配列を宣言
  • ADXのハンドルを取得
  • 配列を時系列にセット
  • 正規化と、現在足のADX値を取得し変数に格納

ADXの値を格納する変数配列を宣言

MQL4とは違い、MQL5ではADXの値の取得がiADX関数だけでは完結しません。

↑以上の工程をたどる必要があります。

//ADXの各値を格納する配列を宣言
      double mainLineArray[],plusDIArray[],minusDIArray[];

ADXは3つのバッファを持つマルチバッファインディケーターなので、格納する変数配列も3つ用意します。

マルチバッファインディケーターについてはコチラの記事も参考になるかと思います。↓

ADXのハンドルを取得

ADXのハンドル値をiADX関数を使って取得し、変数ADXHandleに格納します。

ADXの第3引数、期間についてはメタトレーダー5内蔵のADXデフォルト値である14を採用します。

 //ADXのハンドルを取得
      int ADXHandle=iADX(_Symbol,_Period,14);

配列を時系列にセット

メインライン、+DI、-DIの値を格納する配列を時系列にセットします。

この作業はArraySetAsSeries関数を使って行います。

  //配列を時系列にセット 
      ArraySetAsSeries(mainLineArray,true);
      ArraySetAsSeries(plusDIArray,true);
      ArraySetAsSeries(minusDIArray,true);

ArraySetAsSeries関数についてはこちらをご覧ください↓

正規化と、現在足のADX値を取得し変数に格納

配列を時系列にセットしたので、mainLineArray,plusDIArray,minusDIArrayそれぞれの配列の[0]に、最新のADXの値が格納されています。

正規化とは数値データを特定のルールに従った形に整えることを言います。

正規化にはNormalizeDouble関数を用います。

NormalizeDouble関数については↓をご覧ください

第一引数に入れたデータを、第2引数の小数点以下桁数で表現します。

  //正規化と、現在足のADXの値を取得し変数に格納
      double mainLineValue=NormalizeDouble(mainLineArray[0],2);
      double plusDIValue=NormalizeDouble(plusDIArray[0],2);
      double minusDIValue=NormalizeDouble(minusDIArray[0],2);

全体のプログラムコード

全体のプログラムコードは以下のようになります。


void OnTick()
  {
      //ADXの各値を格納する配列を宣言
      double mainLineArray[],plusDIArray[],minusDIArray[];
      
      //ADXのハンドルを取得
      int ADXHandle=iADX(_Symbol,_Period,14);
      
      //配列を時系列にセット 
      ArraySetAsSeries(mainLineArray,true);
      ArraySetAsSeries(plusDIArray,true);
      ArraySetAsSeries(minusDIArray,true);
      
      //取得したADXの値情報を配列にコピー
      CopyBuffer(ADXHandle,0,0,3,mainLineArray);
      CopyBuffer(ADXHandle,1,0,3,plusDIArray);
      CopyBuffer(ADXHandle,2,0,3,minusDIArray);
     
     
    
      //正規化と、現在足のADXの値を取得し変数に格納
      double mainLineValue=NormalizeDouble(mainLineArray[0],2);
      double plusDIValue=NormalizeDouble(plusDIArray[0],2);
      double minusDIValue=NormalizeDouble(minusDIArray[0],2);
      
      
      //コメント出力
      Comment("メインラインの値: ",mainLineValue,"\n",
              "+DIの値: ",plusDIValue,"\n",
              "-DIの値: ",minusDIValue,"\n"
             );
  }

サンプルコードの挙動は以下のようになります↓

最後までお読みいただきありがとうございました<(_ _)>

※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる

<MQL5でEAを作ろう講座>

をメインコンテンツとして展開しています。

【言語基礎編】

【中級実際にEAを作ろう編】

【発展編・MT5用EAを作る工程をカスタマイズしていく】

第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。

コメント

タイトルとURLをコピーしました