https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b5fa1174-32cf-4af9-80e3-66ff15248d01/chart3.png

ADXは、上昇、下落に関係なく方向性(トレンド)の大きさを表す指標です。どちらのトレンドが強いかは、高値の上昇する強さ+DIラインと、安値の下落する強さ-DIラインで判断できます。

順張りシグナルの一例として、+DIが-DIを上抜けたときに買いシグナル、下抜けたときに売りシグナルを出します。

仕掛けシグナル

<aside> 💡 買いシグナル:2本前から1本前にかけて+DIが-DIを下から上に交差したとき 売りシグナル:2本前から1本前にかけて+DIが-DIを上から下に交差したとき

</aside>

コード

//共通ライブラリ
#include "LibEA.mqh"

sinput double Lots = 0.1; //売買ロット数

//ティック時実行関数
void Tick()
{
   int sig_entry = EntrySignal(); //仕掛けシグナル
   //成行売買
   MyOrderSendMarket(sig_entry, sig_entry, Lots);
}

input int ADXPeriod = 20; //ADXの期間

//仕掛けシグナル関数
int EntrySignal()
{
   //1本前と2本前のADXの±DI
   double PDI1 = iADX(_Symbol, 0, ADXPeriod, PRICE_CLOSE, MODE_PLUSDI, 1);
   double PDI2 = iADX(_Symbol, 0, ADXPeriod, PRICE_CLOSE, MODE_PLUSDI, 2);
   double MDI1 = iADX(_Symbol, 0, ADXPeriod, PRICE_CLOSE, MODE_MINUSDI, 1);
   double MDI2 = iADX(_Symbol, 0, ADXPeriod, PRICE_CLOSE, MODE_MINUSDI, 2);

   int ret = 0; //シグナルの初期化

   //買いシグナル
   if(PDI2 <= MDI2 && PDI1 > MDI1) ret = 1;
   //売りシグナル
   if(PDI2 >= MDI2 && PDI1 < MDI1) ret = -1;

   return ret; //シグナルの出力
}

説明

ADXは、iADX()というテクニカル指標関数で求められます。

ADXの期間として、別途宣言した変数ADXPeriodを引数periodに代入します。

modeの引数には、+DIラインを求める場合、MODE_PLUSDIを、-DIラインを求める場合、MODE_MINUSDIをそれぞれ代入します。

2本前の+DIラインPDI2と-DIラインMDI2、1本前の+DIラインPDI1と-DIラインMDI1の大小関係により、シグナルを判定します。