見出し画像

(MT4)無料で使えるインジケータ「移動平均線乖離率」+MQL4コード

MT4上で使える「移動平均線乖離率」を作成しました。
インジケータとしては「エンベロープ」の方がメジャーだと思います。

役割としてはそこまで大差ないですが、「エンベロープ」がチャート上に表示されるものに対して、「移動平均線乖離率」はオシレータとして使うことができます。

移動平均線乖離率について

移動平均乖離率は、株式投資の株価分析やFXの分析など含め、世界で最もポピュラーなテクニカル分析である移動平均線(一定期間における終値の平均値の変化をグラフで表したインジゲーター)から値段がどれだけ離れているかを簡単に数値化し、割合で表したテクニカル分析です。一般的にはオシレーター系のテクニカル分析となります。類似のテクニカル分析として、移動平均乖離率をチャートに重ねたエンベロープなどがあります。
引用元:移動平均乖離率とは?FXで買われすぎ・売られすぎを判断する方法


他のツール上でタダで使えるツールをわざわざ有料で公開する理由もないので、こちらは無料で使えるようにしております。ページ下部よりダウンロードできるので、使いたい方はぜひ使ってみてください。

こちらのインジケータでは、移動平均線乖離率を最大3本まで表示できます。
MT4にデフォルトで備わっている他インジケータのようにシンプルなもので、移動平均線乖離率以外の機能は特にありません。

画像1

画像2

商品説明としては画像の通りとなります。特に語ることは特別ないかなと。

具体的な計算方法ですが、下記の通りとなります。

式:{(実価格 ー 移動平均線の価格)/ 移動平均線の価格}x100

パラメータ設定としては、3種類の期間また表示のオンオフを設定することができます。

移動平均メソッドについては、以下の通りに設定可能です。

0:単純移動平均
1:指数移動平均
2:平滑移動平均
3:加重移動平均

適用価格については、以下の通りに設定可能です。

0:終値
1:始値
2:高値
3:安値
4:中間値 (高値 + 安値)/2
5:平均値1 (高値 + 安値 + 終値)/3
6:平均値2 (高値 + 安値 + 終値 + 終値)/4

ダウンロード

こちらは↓より無料でDLしてお使いいただけます。

■ファイルの格納先

ex4ファイルの格納先は、以下の手順で格納してください。
① MT4を開き、MT4画面左上の「ファイル」より「データフォルダを開く」を選択。
②フォルダが開かれるので、「MQL4」のフォルダへ移動。
③「MQL4」のフォルダ内にある「Indicators」を開き、ここへex4ファイルを格納する。
MT4再起動後、.ex4ファイルが読み込まれていることを確認する。

MQL4のコードについては無料コンテンツとして公開しております。
MQLの学習にお役立てください。

MQL4コード

//+------------------------------------------------------------------+
//|                                   MovingAverageDeviationRate.mq4 |
//|                                            Copyright 2022, じゅにこ. |
//|                            https://coconala.com/services/2119358 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, じゅにこ."
#property link      "https://coconala.com/services/2119358"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot Label_short
#property indicator_label1  "Label_short"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrLimeGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label_middle
#property indicator_label2  "Label_middle"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrGoldenrod
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot Label_long
#property indicator_label3  "Label_long"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrMediumOrchid
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- indicator buffers
double         Label_shortBuffer[];
double         Label_middleBuffer[];
double         Label_longBuffer[];

input int short_period = 20;     // ■ 移動平均線乖離率 期間(短期)
input bool short_on = true;      // ■ 短期移動平均線乖離率表示(on: true / off: false)
input int middle_period = 100;   // ■ 移動平均線乖離率 期間(中期)
input bool middle_on = true;     // ■ 中期移動平均線乖離率表示(on: true / off: false)
input int long_period = 200;     // ■ 移動平均線乖離率 期間(長期)
input bool long_on = true;       // ■ 長期移動平均線乖離率表示(on: true / off: false)
input string a;                  //-------------------------------------------------------------
input int MA_Method = 0;         // ■ 移動平均メソッド
input int Applied_Price = 0;     // ■ 適用価格

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- indicator buffers mapping
  SetIndexBuffer(0,Label_shortBuffer);
  SetIndexBuffer(1,Label_middleBuffer);
  SetIndexBuffer(2,Label_longBuffer);

  SetIndexLabel(0,"MADR");
  IndicatorShortName("MADR(" + short_period + ", " + middle_period + ", " + long_period + ")");

//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
 {
//---
  if(Bars < MathMax(long_period,MathMax(short_period,middle_period)))
    {
     return(0);
    }
  for(int icount = 0; icount <= Bars - MathMax(long_period,MathMax(short_period,middle_period)); icount++)
    {
     if(short_on == true)
       {
        Label_shortBuffer[icount] = iMADR(NULL,0,short_period,icount);
       }
     if(middle_on == true)
       {
        Label_middleBuffer[icount] = iMADR(NULL,0,middle_period,icount);
       }
     if(long_on == true)
       {
        Label_longBuffer[icount] = iMADR(NULL,0,long_period,icount);
       }
    }
//--- return value of prev_calculated for next call
  return(rates_total);
 }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double iMADR(const string symbol, int timeframe, int period, int index)
 {

  double MA = iMA(symbol,timeframe,period,0,MA_Method,Applied_Price,index);
  if(MA != 0)
    {
     double MADR = ((iClose(symbol,timeframe,index) - MA) / MA) * 100;
     return(MADR);
    }
  else
    {
     return(NULL);
    }
 }
//+------------------------------------------------------------------+

コード解説

移動平均線乖離率は「iMA()」のようにMQL4では関数として備わっていないので、別途切り出して「iMADR()」として関数を作成しています。

「if(MA != 0)」によって条件を分けている理由としては分母に「MA(移動平均線)」を計算に使うためです。「0」だと割り算できなくなってしまい、MT4上でエラーとなり表示されなくなってしまいます。

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