MQL4

【MQL4】トレンドラインを描画するインジケーターの作成方法

どうも、こっこです。

今回はMQL4でトレンドラインを描画する方法について解説していきます。

つい最近ご依頼でトレンドラインを自動で引くインジケーターを作ってくれとのことで、いろいろ調べながら開発できたので共有させていただきます。

 

トレンドラインを引く条件を考える

水平線を描画するときは1つだけポイントをおさえれば横の1本線を引くことができます。ただMT4上でトレンドラインを引くためには2つのポイントを準備しなければなりません

MQL4でトレンドラインを描画するときも、2つのポイントをおさえなければ描画することができません。

今回はトレンドラインを描画する方法ですので、シンプルに

直近60本以内の最高値と直近30本以内の最高値のポイントを結ぶトレンドラインを描画する。

もしもその2点の最高値が同じ足である場合は描画しない。

このような条件で描画するように進めていきます。

ひとまずは最高値を結ぶように条件を書いていきますが、同じように作れば逆の最安値のトレンドラインも描画可能です。

トレンドラインをオブジェクトで作成する

トレンドラインをMQL4で描画するためにはオブジェクトを使っていきます。

使うソースの全体像

string obj_name = "trend_line";

ObjectCreate(0, obj_name, OBJ_TREND, 0, Time[first_top_index], first_high_price, Time[second_high_index], second_high_price);
ObjectSetInteger(0, obj_name, OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, obj_name. OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, obj_name, OBJPROP_WIDTH, 1);

ひとつずつ解説をしていきます。

オブジェクト名変数宣言

まずは1つのトレンドラインオブジェクトは何回も名前を使っていきますので、どこかしらでオブジェクト名を変数に入れておくと便利です。各種関数の外側に出しておくとどの関数からでもアクセス可能です。変数名、オブジェクト名はご自由に変更してください。

string obj_name = "trend_line";

 

オブジェクト初期化

続いてオブジェクトの初期化を行います。

ObjectCreate(0, 
        obj_name, 
        OBJ_TREND, 
        0, 
        Time[first_high_index], 
        first_high_price, 
        Time[second_high_index], 
        second_high_price
        ;
第1引数 チャートID。今のチャートに描画なら0。
第2引数 オブジェクト名
第3引数 オブジェクトタイプ。今回は「OBJ_TREND」
第4引数 サブウィンドウ番号。メインチャートに引くと思うので0。
第5引数 描画ポイント1つ目の時間
第6引数 描画ポイント1つ目の価格
第7引数 描画ポイント2つ目の時間
第8引数 描画ポイント2つ目の価格

第1〜4までは特に変更の必要はありません。今回トレンドラインを引くということで描画ポイントの時間と価格がそれぞれ2つずつ必要になります。第3引数のオブジェクトタイプでは「OBJ_TREND」にすることを忘れずに。

時間と価格の取得

ここまではコピペなので問題は2つのポイントの時間と価格をどう取得してくるかです。ここは条件次第で好きに変わるものですが、今回は先に上げた条件で情報取得をするというテイで進めていきます。

int first_high_index = iHighest(Symbol(), Period(), MODE_HIGH, 60, 0);
double first_high_price = iHigh(Symbol(), Period(), high_index);
   
int second_high = first_high_index - 30;
if(0 <= second_high)
{
 int second_high_index = iHighest(Symbol(), Period(), MODE_HIGH, 30, 0);
  double second_high_price = iHigh(Symbol(), Period(), second_high_index);
  //以下先程のオブジェクト描画、初期化関数
}

iHighest関数で最高値の足の時間を取得、iHigh関数でその足の最高値価格を取得しています。

4行目の「second_high」という変数ではhigh_indexから30という数字を引き、先程のポイント1がすでに直近30本以内になっていないかどうかをチェックしています。

30本よりも多いローソク足での最高値であればif分内部に入り、次のポイントの時間と価格を取得してからトレンドラインを描画します。

30本以内でそれが最高値であればポイント2つ目を取得することはできないので、2つ目ポイントの情報取得もしない、オブジェクトで描画もしないように弾きます。

トレンドラインサンプルソース

ここまでのまとめで全体のソースを書き残しておきます。

解説していない箇所もちょこちょこありますが、これでトレンドラインを描画することができます。

//+------------------------------------------------------------------+
//|                                                   trend_line.mq4 |
//|                                     Copyright 2021,こっこの趣味ブログ |
//|                                           http://www.kocco36.xyz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021,こっこの趣味ブログ"
#property link      "http://www.kocco36.xyz"
#property version   "1.00"
#property strict
#property indicator_chart_window

string obj_name = "trend_line";

int OnInit()
{   
   return(INIT_SUCCEEDED);
}

int deinit()
{
   ObjectDelete(obj_name);
   return(0);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{   
   //一度オブジェクト削除
   ObjectDelete(obj_name);
   
   //上のトレンドライン
   int first_high_index = iHighest(Symbol(), Period(), MODE_HIGH, 60, 0);
   double first_high_top = iHigh(Symbol(), Period(), first_high_index);
   
   int second_high = first_high_index - 30;
   if(0 <= second_high)
   {
      int second_high_index = iHighest(Symbol(), Period(), MODE_HIGH, 30, 0);
      double second_high_price = iHigh(Symbol(), Period(), second_high_index);
   
      ObjectCreate(0, obj_name, OBJ_TREND, 0, Time[high_index], high_top, Time[second_high_index], second_high_price);
      ObjectSetInteger(0, obj_name, OBJPROP_COLOR, clrYellow);   //オブジェクトカラー設定
      ObjectSetInteger(0, obj_name, OBJPROP_STYLE, STYLE_SOLID); //オブジェクトラインスタイル設定
      ObjectSetInteger(0, obj_name, OBJPROP_WIDTH, 1);           //オブジェクトラインの太さ設定
   }
   return(rates_total);
}

 

2箇所のポイントで時間と価格を取得できている場合はこのようにちゃんとトレンドラインが現れるはずです。

まとめ

いかがだったでしょうか?

今回はMQL4でトレンドラインを描画する方法を解説してきました。このサンプルソースでは最高値が更新されるとその最高値に追尾していくような作りになっているので、バイナリーでもFXでも裁量取引にとても便利になります。

MQL4で条件を書くようなプログラマだったら初歩的なことかもしれませんが、今回自分で学びになったので共有させていただきました。今後もMQL4関係でできることをもっと記事で紹介していきます。

ではまた!

【広告枠】初心者向けMQL4開発ができる格安パソコン
・Let’s note(CF-SZ5) 価格:39800円
https://amzn.to/3ktKsay
└中古品、軽量コンパクト、画面サイズ小さめ
・Think Pad(L580) 価格:37230円
https://amzn.to/3krdIip
└中古品、CPU第8世代i5とだいぶ新しい、画面サイズが15.6インチなのでちょっと大きめ
・NEC(VK26) 価格:42880円
https://amzn.to/3QN88mB
└中古品、CPUが第7世代i7なので心配無し、画面サイズが15.6インチなのでちょっと大きめ、ディスクドライブ付きなので分厚い
※各価格は掲載当時の価格になります。