自作インジケーター|自分で引いた水平ラインにタッチしたらアラートを出す方法!(サンプルプログラムあり)

皆さん、みーでございます。

今回のインジケーターは、自分でMT4に引いたラインに、ローソク足がタッチしたらアラート出すものとなります。

ここまで来たら反発するかも!?として引いたラインにタッチしたらアラートが出るインジケーターって便利ですよね。しかも自分で引いたものですので、根拠も明確だし、かなり重宝されるインジケーターだと思います。

サンプルも無料公開していますので、ぜひ、参考にしていただければと思います。

水平ラインとは

水平ラインとは、MT4に標準装備されている、自分で好きなところに引ける水平な線のことです。

表示されている時間のチャートに対して、何本でも引けます。ここで反発するかも!?という箇所に予め水平ラインを引いておいて、そこにローソク足がタッチしたらアラートでお知らせしてくれる、便利なインジケーターの作り方を説明します。

よくライントレードを行っている方は、水平線を引いて、この位置で反発が起こるはず(逆張り)とか、この位置を抜けたらその方向に勢いがある(順張り)とか、そのような判断をされている方も多いかと思います。

自分で引いたラインにタッチしたらアラート

早速、自分で引いたラインにタッチした場合にアラートを出す、サンプルプラグラムをご紹介します。

#property indicator_chart_window
#property indicator_buffers 2

extern bool AlertON = true;
double DrawReverseLowBuffer[];
double DrawReverseHighBuffer[];

static datetime time = Time[0];
int alertFlag = 0;


int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars=IndicatorCounted(); 
   int limit = Bars - counted_bars;

   string objName[200];
   double objPrice[200];
   int hLineCount = 0;
   double entryPrice = 0.0;

   for ( int icount = 0; icount < ObjectsTotal(); icount++ ) {
      if(StringFind(ObjectName(icount),"Horizontal",0)==0){
         objName[hLineCount] = ObjectName(icount);
         objPrice[hLineCount] = ObjectGet(objName[hLineCount],OBJPROP_PRICE1);
         hLineCount++;
      }
   }

   for(int j=0; j<hLineCount; j++){
      if(objPrice[j] < High[0] && objPrice[j] > Low[0]){
         alertFlag = 1;
         Alert("Symbol=",Symbol()," Line Touch!"," Period=",Period());
      }
   }

   if(Time[0] != time){
      time = Time[0];
      alertFlag = 0;
   }

   return(0);
}

 

実行結果

水平ライン(赤色)にタッチしたら、上記のようなアラートが表示されましたよね!

サンプルコード解説

static datetime time = Time[0];
int alertFlag = 0;

アラートを出す方法については、以下の記事が参考になります。

自作サインツール|アラート機能の実装方法(サンプルプログラムあり)

2021年12月25日

以前、ご紹介したアラートの実装方法に従い、現在の時間を”time”に保存しておきます。また、alertFlag は、多重アラート防止(タッチする度にアラートが発生)のためのフラグで、一度アラートを出したら、新しいローソク足に切り替えるまでアラートを表示させないために必要です。

   string objName[200];
   double objPrice[200];
   int hLineCount = 0;
   double entryPrice = 0.0;

   for ( int icount = 0; icount < ObjectsTotal(); icount++ ) {
      if(StringFind(ObjectName(icount),"Horizontal",0)==0){
         objName[hLineCount] = ObjectName(icount);
         objPrice[hLineCount] = ObjectGet(objName[hLineCount],OBJPROP_PRICE1);
         hLineCount++;
      }
   }

今回のインジケーターの肝となる部分です。objNameに水平ラインの名前、objPriceに水平ラインの値が格納されます。上記のサンプルでは、最大200本の水平ラインを格納することが可能です。

次にfor文で、表示されているチャートのオブジェクト分だけループさせます。このとき、”Horizontal”という名前を持つオブジェクトがあれば、それを水平ラインと判断して、objNameとobjPriceに値を格納します。

これにより、チャートに表示されている水平ラインを見つけることができます。見つけた水平ラインの数は、hLineCountに格納されます。

   for(int j=0; j<hLineCount; j++){
      if(objPrice[j] < High[0] && objPrice[j] > Low[0]){
         alertFlag = 1;
         Alert("Symbol=",Symbol()," Line Touch!"," Period=",Period());
      }
   }

次は、見つけた水平ラインの数だけループ処理を行います。見つけた水平ラインの値が、最新のローソーク足の高値(High)と安値(Low)の間にある場合、【水平ラインにタッチ】したと判断します。

そうすると、以下のようなアラートが表示されます。

   if(Time[0] != time){
      time = Time[0];
      alertFlag = 0;
   }

上記が多重アラート防止のための処理となります。最新のローソク足の時間が変わった場合に、alertFlag のフラグを0にリセットすることで、最新のローソク足が水平ラインにタッチした際に、再度、アラートを出すことが出来ます。

今回のインジケーターはどうでしたか?

トレンドラインにタッチした場合は表示されないのか?って思われる方もいらっしゃるかもしれませんね。今回、ご紹介したものは、水平ラインのみで、トレンドラインにタッチした場合は表示されません。

トレンドラインも含めたラインタッチについては、別記事でご紹介しますね。

サインツール作成の記事一覧はこちら

Sponsor Link








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です