皆さん、みーでございます。
今回のインジケーターは、自分で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;
アラートを出す方法については、以下の記事が参考になります。
以前、ご紹介したアラートの実装方法に従い、現在の時間を”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にリセットすることで、最新のローソク足が水平ラインにタッチした際に、再度、アラートを出すことが出来ます。
今回のインジケーターはどうでしたか?
トレンドラインにタッチした場合は表示されないのか?って思われる方もいらっしゃるかもしれませんね。今回、ご紹介したものは、水平ラインのみで、トレンドラインにタッチした場合は表示されません。
トレンドラインも含めたラインタッチについては、別記事でご紹介しますね。
コメントを残す