見出し画像

MT4 トレンドラインを自動で引くインジケーター ZigZag対応 コピペOK

MT4でトレンドラインを自動で引くインジケーターがあればいいなと思って作ってみました。プライスアクションで需要になるレジスタンスライン、サポートラインも引くようにしてみました。


最後にコード載せておくので、使ってみたい人はコピペしてください。


良かったらスキしてください。泣いて喜びます。

2020年4月11日 追記

トレンドラインや水平線を引くためのZigZagのポイントを、高値安値のヒゲ先か、始値終値の実体部分か選択できるように追加しました。


2020年6月9日 追記

高値安値を逆に取得してしまう不具合を修正しました。


2020年6月17日 追記

始値終値でトレンドラインを引くコードにて、インデントエラーが生じていた不具合を修正しました。また、ZigZag2を選べていない不具合を修正しました。


2020年6月24日 追記

自動チャネルライン描画インジケータのコードを追記しました。
追記に伴い、値段設定を変更しました。


2020年12月26日 追記

有料部分のコードに関して、ex4ファイル形式でダウンロードできるようにしました。

注意事項

当サイトに含まれる情報の全ては、情報提供を唯一の目的としたものであり、収益の保証、或いは、直接的に投資助言業務、投資勧誘を行うものではありません。投資方針や時期選択等の最終決定は、リスク等を熟知した上、ご自身で判断されますようお願いいたします。
当サイトの利用、あるいは取引により利用者に生じたいかなる損害についても著者及び発行者はそれに対し、一切の責任を負いません。あらかじめご了承ください。
万が一、損失を被った場合でも、著者は一切の責任を負わないものとします。


トレンドラインを決める定義は3種類

トレンドラインって直近の安値・高値を結んだ直線のことを言いますが、この安値・高値の定義っていろいろあります。


多くの人はチャート開いて見た感じでトレンドラインを引くと思います。だいたいこの辺で反発してるから安値、ちょっと前にもV字になってるとこがあるから安値で、これをつないで。。。みたいに。


でも、この人が考える ” だいたいこの辺 ” って、機械的に考えると以下の3種類になるかと思います。


① ある一定期間の高値・安値ポイント
② フラクタルが出来たポイント
③ ZIGZAGインジが反転したポイント


画像1

【 ① ある一定期間の高値・安値 】

①のある一定期間って、適当です。100本のローソク足でも200本のローソク足でもなんでも良いので、決められた期間の最安値・最高値を結ぶだけです。期間が短ければ小さなトレンドを測るトレンドラインになりますし、期間が長ければ大きなトレンドを測るトレンドラインになります。

単純なので、期間の選び方にバリエーションが出てしまうのが難点です。


画像6

【 ② フラクタル 】

②のフラクタルは、5本の足の安値や高値が谷や山を形成している状態のことで、パーをした手の指によく例えられます。

親指(1本目)より人差し指(2本目)が高く、人差し指(2本目)より中指(3本目)が高く、中指(3本目)より薬指(4本目)が低く、薬指(4本目)より小指(5本目)が低い。

この時の中指(3本目)が高値のフラクタルです。安値は逆。3回高値更新して2回高値が切り下げればフラクタルってことです。

形成されたフラクタルを結べばトレンドラインを作れるのですが、レンジなどで無駄に出現しすぎるのが難点です。


【 ③ ZigZag 】

最後の③のZigZagですが、MT4に最初から入っているインジケーターです。決められた期間における暫定的な高値安値から、決められた%分下落もしくは上昇した場合を高値安値として決定します。

このZigZagですが、愛用している方も多く、Depthを初期値の12より大きくすることでより長い時間足のZigZagとして表示させることもできる優れものです。

しかし、直近の部分に関してはリペイントされていくのが難点なので、1個前2個前あたりを使っていくのがポイントです。


以上の3つの定義で直近のトレンドラインとサポートライン、レジスタンスラインを引くインジケータを作りました。


トレンドラインはチャートの推移とともに自動で、勝手に引き直してくれるので新たに描く必要はありません。

*ちなみにこの自動的に描かれたトレンドラインを使った自動売買も作ったので、次のnoteで紹介します。


コードのコピペの仕方

釈迦に説法かもしれませんが、初心者の方もいるかと思い、念のため。。。

① MT4起動


② MetaTrader起動

画像10

このフォルダみたいなアイコンが、MetaEditerの起動アイコンです。


③ 新規作成ボタンクリック

画像11


④ カスタムインジケータ選んで。。。

画像12

¥マークの後ろに、適当な名前を付けて。。。(AutoTrendLineにしました)

画像13

出てきたウィンドウの中身を全部消して。。。

画像14

コードをコピペして。。。

画像15

最後に、『コンパイルボタン』を押せば完成です。

画像16

MT4のインディケータの中に、『AutoTrendLine』が出来ているはずです。



① 一定期間の高値・安値でトレンドラインを自動で引くインジケータの中身


コードの中身はこんな感じです。

 #property  indicator_chart_window

//---- input parameters
extern int BandPeriods = 60;
//----



int init()
{
  ObjectCreate("Line1", OBJ_TREND, 0, 0, 0);
  ObjectCreate("Line2", OBJ_TREND, 0, 0, 0);
  ObjectCreate("Line3", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line4", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line5", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line6", OBJ_HLINE, 0, 0, 0);


  return(0);
}


int deinit()
{
  ObjectDelete("Line1");
  ObjectDelete("Line2");
  ObjectDelete("Line3");
  ObjectDelete("Line4");
  ObjectDelete("Line5");
  ObjectDelete("Line6");


  return(0);
}


int start()
{
  int Low_1 = iLowest(Symbol(),0,MODE_LOW,BandPeriods,2);
  int Low_2 = iLowest(Symbol(),0,MODE_LOW,BandPeriods*2,2+BandPeriods);

  
  int High_1 = iHighest(Symbol(),0,MODE_HIGH,BandPeriods,2);
  int High_2 = iHighest(Symbol(),0,MODE_HIGH,BandPeriods*2,2+BandPeriods);


  ObjectSet("Line1", OBJPROP_PRICE1, Low[Low_2]);
  ObjectSet("Line1", OBJPROP_PRICE2, Low[Low_1]);
  ObjectSet("Line1", OBJPROP_TIME1, Time[Low_2]);
  ObjectSet("Line1", OBJPROP_TIME2, Time[Low_1]);

  ObjectSet("Line2", OBJPROP_PRICE1, High[High_2]);
  ObjectSet("Line2", OBJPROP_PRICE2, High[High_1]);
  ObjectSet("Line2", OBJPROP_TIME1, Time[High_2]);
  ObjectSet("Line2", OBJPROP_TIME2, Time[High_1]);
  
  ObjectSet("Line3", OBJPROP_PRICE1, Low[Low_2]);
  ObjectSet("Line3", OBJPROP_TIME1, Time[Low_2]);
  
  ObjectSet("Line4", OBJPROP_PRICE1, High[High_2]);
  ObjectSet("Line4", OBJPROP_TIME1, Time[High_2]);

  ObjectSet("Line5", OBJPROP_PRICE1, Low[Low_1]);
  ObjectSet("Line5", OBJPROP_TIME1, Time[Low_1]);
  
  ObjectSet("Line6", OBJPROP_PRICE1, High[High_1]);
  ObjectSet("Line6", OBJPROP_TIME1, Time[High_1]);
  
  
  ObjectSet("Line1", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line2", OBJPROP_COLOR, clrAqua);
  ObjectSet("Line3", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line4", OBJPROP_COLOR, clrAqua);
  ObjectSet("Line5", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line6", OBJPROP_COLOR, clrAqua);
  

  return(0);
}


externの外部変数で期間を決められるので、適当な期間を入れるだけでOKです。

画像2

例)BandPeriods=30の場合、直近30本の安値高値と31~60本の安値高値を結ぶトレンドライン、高値安値のサポートライン、レジスタンスラインを引きます。


① おまけ 時間を意識した形に変更

例えば1分足でチャートを見ている時、上記のBandPeriodsに30って入れると直近の30本とその前の30本の安値を使ってトレンドラインを引いてくれます。

でもこれって、時間が意識できていないですよね。ただただ本数だけ。。。


この場合の30って30分足の高値安値が見れた方が良くないですか?つまり、今が13:21だとして、12:50~13:20の高値安値よりも、切りのいい12:00~12:30の安値高値と12:30~13:00の安値高値を見た方が有意義かなと。

切りのいい期間での高値安値はつまり、上位足での高値安値ってことですから。ということで、コードを少しいじりました。

 #property  indicator_chart_window

//---- input parameters
extern int BandPeriods = 60;
extern bool timeshift = true;
//----



int init()
{
//---- indicators
  ObjectCreate("Line1", OBJ_TREND, 0, 0, 0);
  ObjectCreate("Line2", OBJ_TREND, 0, 0, 0);
  ObjectCreate("Line3", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line4", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line5", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line6", OBJ_HLINE, 0, 0, 0);


  return(0);
}


int deinit()
{
//----
  ObjectDelete("Line1");
  ObjectDelete("Line2");
  ObjectDelete("Line3");
  ObjectDelete("Line4");
  ObjectDelete("Line5");
  ObjectDelete("Line6");

  
//----
  return(0);
}


int start()
{
  int shift = 0;

  if(timeshift==true)
  {
     int _Minute = Minute();
     shift = MathMod(_Minute,BandPeriods);
  }

  int Low_1 = iLowest(Symbol(),0,MODE_LOW,BandPeriods,2+shift);
  int Low_2 = iLowest(Symbol(),0,MODE_LOW,BandPeriods*2,2+shift+BandPeriods);

  
  int High_1 = iHighest(Symbol(),0,MODE_HIGH,BandPeriods,2+shift);
  int High_2 = iHighest(Symbol(),0,MODE_HIGH,BandPeriods*2,2+shift+BandPeriods);


  ObjectSet("Line1", OBJPROP_PRICE1, Low[Low_2]);
  ObjectSet("Line1", OBJPROP_PRICE2, Low[Low_1]);
  ObjectSet("Line1", OBJPROP_TIME1, Time[Low_2]);
  ObjectSet("Line1", OBJPROP_TIME2, Time[Low_1]);

  ObjectSet("Line2", OBJPROP_PRICE1, High[High_2]);
  ObjectSet("Line2", OBJPROP_PRICE2, High[High_1]);
  ObjectSet("Line2", OBJPROP_TIME1, Time[High_2]);
  ObjectSet("Line2", OBJPROP_TIME2, Time[High_1]);
  
  ObjectSet("Line3", OBJPROP_PRICE1, Low[Low_2]);
  ObjectSet("Line3", OBJPROP_TIME1, Time[Low_2]);
  
  ObjectSet("Line4", OBJPROP_PRICE1, High[High_2]);
  ObjectSet("Line4", OBJPROP_TIME1, Time[High_2]);

  ObjectSet("Line5", OBJPROP_PRICE1, Low[Low_1]);
  ObjectSet("Line5", OBJPROP_TIME1, Time[Low_1]);
  
  ObjectSet("Line6", OBJPROP_PRICE1, High[High_1]);
  ObjectSet("Line6", OBJPROP_TIME1, Time[High_1]);
  
  
  ObjectSet("Line1", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line2", OBJPROP_COLOR, clrAqua);
  ObjectSet("Line3", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line4", OBJPROP_COLOR, clrAqua);
  ObjectSet("Line5", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line6", OBJPROP_COLOR, clrAqua);
  

//----
  return(0);
}


外部変数でtimeshiftするかどうか決めれるようにしました。

・timeshift:true 時間を意識した設定
・timeshift:false 時間を意識しない設定

画像3


使ってみるとこの違いです。

【timeshift:true 時間を意識した設定】

画像4

【timeshift:false 時間を意識しない設定】

画像5

同じような感じですが、微妙に異なります。上位足も意識するなら、trueで使った方が良さそうです。


これでも良さげですが、次にフラクタルを使った場合を作ってみました。


② フラクタルでトレンドラインを自動で引くインジケータの中身


結論から言うと、これはあんまりよくないですね。


 #property  indicator_chart_window

extern int FirstFractal = 5;
extern int SecondFractal = 10;

int init()
{
//---- indicators
  ObjectCreate("Line1", OBJ_TREND, 0, 0, 0);
  ObjectCreate("Line2", OBJ_TREND, 0, 0, 0);
  ObjectCreate("Line3", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line4", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line5", OBJ_HLINE, 0, 0, 0);
  ObjectCreate("Line6", OBJ_HLINE, 0, 0, 0);


  return(0);
}


int deinit()
{
//----
  ObjectDelete("Line1");
  ObjectDelete("Line2");
  ObjectDelete("Line3");
  ObjectDelete("Line4");
  ObjectDelete("Line5");
  ObjectDelete("Line6");

  
//----
  return(0);
}


int start()
{

  int Low_Array[100],High_Array[100];

  int num = 0;
  for(int i=1; i<1440; i++)
  {
     int FraL = iFractals(Symbol(),0,MODE_LOWER,i);
     if(FraL>0)
     {
        Low_Array[num] = i;
        num += 1;
     }
  }
  
  ArrayResize(Low_Array,num);
  if(SecondFractal>ArrayRange(Low_Array,0)) SecondFractal=ArrayRange(Low_Array,0)-1;
  
  int Low_1 = Low_Array[FirstFractal];
  int Low_2 = Low_Array[SecondFractal];

  num = 0;
  for(i=1; i<1440; i++)
  {
     int FraH = iFractals(Symbol(),0,MODE_UPPER,i);
     if(FraH>0)
     {
        High_Array[num] = i;
        num += 1;
     }
  }

  ArrayResize(High_Array,num);
  if(SecondFractal>ArrayRange(High_Array,0)) SecondFractal=ArrayRange(High_Array,0)-1;
  
  int High_1 = High_Array[FirstFractal];
  int High_2 = High_Array[SecondFractal];


  ObjectSet("Line1", OBJPROP_PRICE1, Low[Low_2]);
  ObjectSet("Line1", OBJPROP_PRICE2, Low[Low_1]);
  ObjectSet("Line1", OBJPROP_TIME1, Time[Low_2]);
  ObjectSet("Line1", OBJPROP_TIME2, Time[Low_1]);

  ObjectSet("Line2", OBJPROP_PRICE1, High[High_2]);
  ObjectSet("Line2", OBJPROP_PRICE2, High[High_1]);
  ObjectSet("Line2", OBJPROP_TIME1, Time[High_2]);
  ObjectSet("Line2", OBJPROP_TIME2, Time[High_1]);
  
  ObjectSet("Line3", OBJPROP_PRICE1, Low[Low_2]);
  ObjectSet("Line3", OBJPROP_TIME1, Time[Low_2]);
  
  ObjectSet("Line4", OBJPROP_PRICE1, High[High_2]);
  ObjectSet("Line4", OBJPROP_TIME1, Time[High_2]);

  ObjectSet("Line5", OBJPROP_PRICE1, Low[Low_1]);
  ObjectSet("Line5", OBJPROP_TIME1, Time[Low_1]);
  
  ObjectSet("Line6", OBJPROP_PRICE1, High[High_1]);
  ObjectSet("Line6", OBJPROP_TIME1, Time[High_1]);
  
  
  ObjectSet("Line1", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line2", OBJPROP_COLOR, clrAqua);
  ObjectSet("Line3", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line4", OBJPROP_COLOR, clrAqua);
  ObjectSet("Line5", OBJPROP_COLOR, clrHotPink);
  ObjectSet("Line6", OBJPROP_COLOR, clrAqua);
  

//----
  return(0);
}


とりあえず、フラクタルって極大値や極小値じゃないところでも5本のローソク足がその形になれば、フラクタルって認識されちゃうんですよね。


よけいなフラクタルを拾ってしまう。。。


コード自体は①の期間で定めた最大値最小値とほとんど同じ感じ。


外部変数で、直近から数えて何個目のフラクタルを結ぶかを決定します。

extern int FirstFractal = 5;
extern int SecondFractal = 10;

上記の場合、直近から5個目と10個目のフラクタルを結ぶトレンドラインを引きます。


フラクタルが発生した足の番号は、配列で保存して抜き出しています。

  int Low_Array[100],High_Array[100];

  int num = 0;
  for(int i=1; i<1440; i++)
  {
     int FraL = iFractals(Symbol(),0,MODE_LOWER,i);
     if(FraL>0)
     {
        Low_Array[num] = i;
        num += 1;
     }
  }
  
  ArrayResize(Low_Array,num);
  if(SecondFractal>ArrayRange(Low_Array,0)) SecondFractal=ArrayRange(Low_Array,0)-1;
  
  int Low_1 = Low_Array[FirstFractal];
  int Low_2 = Low_Array[SecondFractal];

iFractalって、その足がフラクタルだった場合0以上の数字を返してきます。(フラクタルじゃない場合は0)なので、0以上の時だけ配列にその足の番号を保存させていき、ArrayResizeで配列の数を整理してます。

SecondFractalが取得したフラクタルの数を超えていた場合は、最後のフラクタルを選ぶようにしてます。


と、ここまでいろいろと書いてきましたが、このフラクタルのトレンドラインに関しては、挙動が怪しいです。

画像7

上記は良い感じにできていますが、フラクタルの番号の選択が良くないとおかしい挙動になります。

画像8


これじゃあトレンドラインとは言えないですよね。。。


ということで、最終形のZigZagを使ったトレンドラインを引くインジケーターのコードを紹介します。


③ ZigZagでトレンドラインを自動で引くインジケータの中身

まず仕上がりはこんな感じです。

画像9

なかなかいい感じじゃないですか?


外部変数のDepthを変更することで、いくつでも重ね書きできるようにしました。このチャートではDepth=12とDepth=24の二つのインジケータを重ねています。(上記の①と②のコードでは重ね書きできません。)


実際にちゃんと動くか検証するため、インジケータを表示しチャートを眺めていたのですが、なかなかに環境が認識しやすくなります。


移動平均線や一目均衡表より分かりやすいかも。。。


ってことで、参考画像をいくつか。

画像17

例えば、2020年1月2日16時台のAUDJPYの動きですが、ZigZagが描いた直近2つの高値をつないだ水色のトレンドラインとピンク色の安値のトレンドラインが表示されており、見事に直近の足がピンクのラインで反発しています。


画像18

さらに、もう一枚。ZigZagで描かれた直近高値に対し、水色の水平線が描かれていますが、このレジスタンスラインも意識されているのか、上ひげを付けて何度も押し戻されています。最終的にはブレイクしていますが、この後の動きが次の画像になります。

画像19

水平ラインをブレイクしましたが下落、水平ラインと安値トレンドラインでもみ合いになりました。

画像20

もみ合いの結果、売りの圧力が強く下げる展開に。。。


画像21

最後にもう一枚、安値ライン2本とトレンドラインに下値を守られた状態から一気に上昇しましたが、前回高値で押し戻された様子です。


このインジケータを使うことで、どの価格帯が意識されているのか、その価格帯を守られた場合は、あるいはブレイクした場合はどうなるのか?なんてシナリオが考えやすくなります。


これ作ってみて気付いたんですが、かなり使える感じです。例えば、ハイローとかのエントリー判断に使ったりもできそう。


さらに、水平線があと一本くらいあった方が分かりやすそうだったので、3本目の水平線も追加しました。ただ、見づらくなる可能性があるので、選択できるようにはしています。

画像22

トレンドラインとかの色も変えれるようにしました。


【 sanbonme=true 】

画像23


【 sanbonme=false】

画像24


トレード手法として一番簡単なのは、高値切り上げなら上昇トレンドと判断して、下がってきてピンクのラインにタッチする押し目でロングエントリーとかが固そうです。


2020年4月11日 追記

トレンドラインや水平線を引くためのZigZagのポイントを、高値安値のヒゲ先か、始値終値の実体部分か選択できるように追加しました。

まずはZigZagの取得ポイントの違いです。同じパラメータを使用しています。(赤:高値安値、黄:始値終値の実体)

画像29

拡大するとこんな感じです。

画像30

ZigZagをもとに新たにZigZag2としてインジケータを作成しました。これも有料パートにコードを記載しておきます。

画像31

パラメータとしてHighLowを作成しました。

・HighLow = true : 高値安値のZigZag使用
・HighLow = false : 始値終値のZigZag使用

実際にラインを描いた結果がこちらです。

画像32

画像33

上は実体部分を使ってトレンドラインを引かせたもの。下は高値安値を使ってトレンドラインを引かせたものです。


ZigZagを元に自動でトレンドラインを引くインジケータのコード


と、ここからはごめんなさい。
有料にさせてもらいます。すんません。


2020年6月24日 追記

下記記事のチャネルラインインジケータのコードも有料部分に追記しましたので、価格設定を変更させていただきました。



やってることは、上で書いてたコードにZIGZAGの要素を取り入れただけです。コード見たらほとんど同じやんけ!って思うかもしれません。

でも、コードの見た目以上にこだわっています。


ラインの現れ方は他の2つとは全然違って環境把握はやりやすいです。


分からないことがあれば、@ひろぽんにDMしてください。できる範囲で答えます。なお、商品の性質上、返金は出来ませんので、了承された上で購入していただくようお願いします。


また、近いうちにこのインジケータを使った自動売買の検証もnoteに書こうと思いますので、また見てください。


ここまで長文読んでいただき
ありがとうございました。


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

ここから先は有料パートで、コードだけ記載しています。

本note中盤で示したコピペのやり方で、コピペしてください。

ここから先は

32,438字 / 6画像 / 3ファイル

¥ 1,280

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?