見出し画像

【MQL4】コピペで覚えるオリジナルインジケータ作成講座#01(移動平均線乖離率を作ってみよう)

コピペで覚えるオリジナルインジケータ作成講座。

この作成講座では、コピペでMQL4のコードの書き方を覚えてもらい、オリジナルのインジケータを自分で作成できるようにしてもらうことを目的としています。

実際に私が個人で開発したものをサンプルコードとして載せています。初回のみ無料記事にしていますが、商品として出したものをサンプルコードとして載せていくので、2回目以降は有料記事とさせてください。

最初はまず簡単な「移動平均線乖離率」の作成について。

【移動平均線乖離率】
現在の価格値が移動平均線とどれくらい離れているかを見るための指標です。乖離率そのものは、次の式によって算出できます。
式:{(実価格 ー 移動平均線の価格)/ 移動平均線の価格}*100

これをオシレータとして作成してみましょう。
オシレータとはチャートの画面下に出てくるRSIを表示する際に使用する枠に表示するものです。

完成イメージ

スクリーンショット 2022-03-02 22.45.37

サンプルコードは後ろにあります。

今回のサンプルコードを身に付けることで、オシレータとして表示できる内容を自分で作ることができるようになります。

サンプルコード

//+------------------------------------------------------------------+
//|                                             MA_DeviationRate.mq4 |
//|                              Copyright 2022, システム開発屋じゅにこ  |
//|                https://note.com/junico02_se_blog/n/nae0641418726 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, システム開発屋じゅにこ."
#property link      "https://note.com/junico02_se_blog/n/nae0641418726"
#property version   "1.00"
#property strict
#property indicator_separate_window

// インジケータプロパティ設定
#property  indicator_buffers 1
#property  indicator_color1 clrSpringGreen
#property  indicator_width1 1
#property  indicator_level1 0

double MA_DeviationRate[];

extern int MA_Period = 20;    //■移動平均線
extern int MA_Method = 0;     //■移動平均メソッド
extern int Applied_Price = 0; //■適用価格

int init()
{
  SetIndexBuffer(0,MA_DeviationRate);
  SetIndexLabel(0,"MA_DeviationRate");
  IndicatorShortName("MA_DeviationRate(" + MA_Period + ")");
  SetIndexDrawBegin(0,20);
  return(0);
}

int start()
{
  if(Bars < 20){
     return(0);
  }
  int limit = Bars-IndicatorCounted();
  double Value = 0;
  for(int i = limit - 1; i>=0; i--){
     Value = Close[i];
     double MA = iMA(NULL,0,MA_Period,0,MA_Method,Applied_Price,i);
     MA = NormalizeDouble(MA,MarketInfo(Symbol(),MODE_DIGITS));
     if(MA != 0){
        double temp_MA_DR = ((Value - MA)/MA) * 100;
        MA_DeviationRate[i] = NormalizeDouble(temp_MA_DR,MarketInfo(Symbol(),MODE_DIGITS));
     }

  }  
  return(0);
}

サンプルコード解説

■表示位置
・#property indicator_separate_window
 :サブウインドウで表示する設定。 ​

■プロパティ
・#property indicator_buffers 1
 :サブウインドウに描写したいもの(以下オブジェクト)の数量を選ぶ。
(今回はラインを1本描写するので、"1"を選択。MT4では最大8個。)

・#property indicator_color1 clrSpringGreen
 :描写するオブジェクトの色を選択する。「clr」以下を編集。(clrXXXXXXXX
・#property indicator_width1 1
 :描写するオブジェクトの幅を選択する。数字を大きくするとラインの太さも太くなる。
・#property indicator_level1 0
 :レベルを選択する。サブウインドウに表示されている「0.00」の線のこと。

■変数
・double MA_DeviationRate[];
 :描写するオブジェクト。
・extern int MA_Period = 20; //■移動平均線
・extern int MA_Method = 0; //■移動平均メソッド
・extern int Applied_Price = 0; //■適用価格
 :各パラメータ。インディケータを読込む際に「パラメータの入力」タブで使用者が変更できるパラメータ。「//」以降に日本語を記述することで「パラメータの入力」欄で日本語を表示できる。

■処理1
・int init()
 :MT4で設定されている関数の1つ。EA適用時や時間足変更時、プロパティ変更時、MT4再起動時のタイミングで動作する初期化処理。

・SetIndexBuffer(0,MA_DeviationRate);
 :表示したいオブジェクトを数字で管理できるよう、オブジェクトと数字「0」を紐づける。紐づける数字は必ず「0」からスタートすること。

・SetIndexLabel(0,"MA_DeviationRate");
 :数字「0」と紐づけたオブジェクトの表示名を設定する。

・IndicatorShortName("MA_DeviationRate(" + MA_Period + ")");
 :サブウインドウ内の左上に表示される部分。「MA_Period」は「パラメータの入力」欄で設定される値が入る。

・SetIndexDrawBegin(0,20);
 :オブジェクトを描写する際の条件の1つ。この記述の場合、ローソク足が最低でも20本ないと描写されない。期間20の移動平均線を用いるため、今回は20を設定している。

・return(0);
 :各関数の終わりに「return(0);」が必要。これを読むことで関数をbreakできる。ない場合、コンパイルエラーになる。

■処理2
・int start()
 :MT4で設定されている関数の1つ。EA適用時や時間足変更時、プロパティ変更時、MT4再起動時、適用したチャートの通貨ペアのレートが配信されるタイミングで動作する。メインとなる処理を記述する関数。

・if(Bars < 20){ return(0); }
 :「Bars」は表示されているローソク足の本数を返す関数。チャート内に表示されているローソク足の本数を1本目から読込み始める。20本に満たない場合、処理を行わない。「return(0);」を実行することで後続の処理を行わずbreakする。

・int limit = Bars-IndicatorCounted();
 :変数設定「limit」。ローソク足の順番を格納する。
「IndicatorCounted()」は、インジケータ起動後、変化していないローソク足の本数を返す関数。「Bars-IndicatorCounted();」の計算は、「表示されているローソク足の本数 - インジケータ起動後、変化していないローソク足の本数」。
  少しわかりにくいが、リアルタイムで動いている足は「1」、「現在の1本前足(確定足)」の場合は「0」。2本前以上は「1,2,3,4,5,....」と言ったように過去にさかのぼるだけ数字が増える。

・double Value = 0;
 :変数設定「Value」。後に後述する各ローソク足の終値を格納する。

・for(int i = limit - 1; i>=0; i--){}
 :for文によるループ処理。これが意味するのは読み込まれるローソク足が1本前から過去にさかのぼりながら処理を行う(過去分の処理)。for文を抜けた後(過去分の処理が終わった後)は現在の足のみ処理を行う(現在分の処理)。

・Value = Close[i];
 :「Value」に各ローソク足の終値が格納される。「Close[i]」で各ローソク足の終値を取得できる。

・double MA = iMA(NULL,0,MA_Period,0,MA_Method,Applied_Price,i);
 :変数設定「MA」。同時に「i」番目の移動平均線の値を取得し、格納する。移動平均線の値は「iMA()」を使うことで取得できる。各種設定値は以下を参考。
■MA_Method
「0」:単純移動平均線(SMA)
「1」:指数移動平均線(EMA)
「2」:平滑移動平均線(SMMA)
「3」:線形加重移動平均線(LWMA)
■Applied_Price
「0」:終値
「1」:始値
「2」:高値
「3」:安値
「4」:(高値+安値)÷2
「5」:(高値+安値+終値)÷3
「6」:(高値+安値+終値+終値)÷4

・MA = NormalizeDouble(MA,MarketInfo(Symbol(),MODE_DIGITS));
 :「NormalizeDouble()」は浮動小数点数を指定した精度で丸める関数。割り切れない場合、MAに格納されている値がとんでもなく長いので、これを一定の長さに揃えてあげる。

・if(MA != 0){}
 :移動平均線乖離率は移動平均線を分母に用いるので、移動平均線の値が「0」の場合は計算できない。プログラムでエラーになるので、その要因を排除する必要がある。

・double temp_MA_DR = ((Value - MA)/MA) * 100;
 :変数設定「temp_MA_DR」。同時に終値と移動平均線の移動平均線乖離率を格納している。

・MA_DeviationRate[i] = NormalizeDouble(temp_MA_DR,MarketInfo(Symbol(),MODE_DIGITS));
 :浮動小数点数を指定した精度で丸める関数で再度、値を整えてあげ、「MA_DeviationRate[i]」に格納する。MA_DeviationRate[i]として格納された値がチャートの画面上に出力される。

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