FX-EA System Projectはこちら公式ラインに登録して
プレゼントをもらう

【MQL】移動平均線のゴールデンクロス・デッドクロス時にシグナルを表示するインジケーター【中級編】

MQL ゴールデンクロス・デッドクロス インジケーター 作成MT4インジケーター作成

移動平均線のゴールデンクロス・デッドクロス時にシグナルを表示するインジケーター

移動平均線のゴールデンクロス・デッドクロス時に

シグナルを表示するインジケーターを作成していきたいと思います。

  • 2つの移動平均線を表示する
  • シグナルを表示する

メタエディタ(MetaEditor)を立ち上げる

メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。

【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた

今回は名前を「GCDC-SIGNAL」で作成します。

プロパティを記述する

今回は、

  • 短期移動平均線
  • 長期移動平均線
  • 上矢印
  • 下矢印

なので4つのプロパティが必要になります。

#property indicator_chart_window
#property indicator_buffers 4//バッファ4つ
#property indicator_color1 clrDeepPink//ピンク色
#property indicator_color2 clrDeepSkyBlue//青色
#property indicator_color3 clrWhite//白色
#property indicator_color4 clrWhite//白色
#property indicator_style1 STYLE_SOLID//実線
#property indicator_style2 STYLE_SOLID//実線
#property indicator_width1 3//幅3
#property indicator_width2 3//幅3
#property indicator_width3 3//幅3
#property indicator_width4 3//幅3
Copy

バッファを定義する

バッファを定義しましょう。バッファも4つ必要になります。

FMA[]は短い移動平均線でSMA[]は長い移動平均線です。

GC[]はゴールデンクロスのシグナル用でDC[]はデッドクロスのシグナル用です。

double FMA[];//期間の短い移動平均線
double SMA[];//期間の長い移動平均線
double GC[];//ゴールデンクロスのシグナル用
double DC[];//デッドクロスのシグナル用
Copy

パラメータを記述する

パラメータを記述しましょう。

短期移動平均線の期間と長期移動平均線の期間を2つ作ります。

input int FMA_Period = 20;//短期移動平均線の期間
input int SMA_Period = 75;//長期移動平均線の期間
Copy

OnInit()関数に記述する

OnInit()関数に記述しましょう。

これは今までと同じような手順を踏めばよいですね。

   SetIndexBuffer(0,FMA);//インデックスにFMA配列を紐付け
   SetIndexBuffer(1,SMA);//インデックスにSMA配列を紐付け
   SetIndexBuffer(2,GC);//インデックスにGC配列を紐付け
   SetIndexBuffer(3,DC);//インデックスにDC配列を紐付け
   SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定
   SetIndexArrow(2, 233);//矢印のアイコンの種類を指定
   SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定
   SetIndexArrow(3, 234);//矢印のアイコンの種類を指定
Copy

OnCalculate()関数に記述する

OnCalculate()関数を記述していきます。

未だ計算されていないバー数(チャート上のバー数 – 計算済みバー数)を取得します。

int limit = Bars-IndicatorCounted();

OnCalculate()関数では移動平均線2つを表示と上矢印と下矢印の4つを記述します。

いつものようにfor文のループを作り、FMA[]とSMA[]にima関数を記載していきます。

 FMA[i]=iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,i); 
 SMA[i]=iMA(NULL,0,75,0,MODE_SMA,PRICE_CLOSE,i)

GC[]とDC[]にはEMPTY_VALUEで配列を空にしています。

GC[i] = EMPTY_VALUE;
DC[i] = EMPTY_VALUE;

そしてゴールデンクロスとデッドクロスというのは言語化すると以下のようになります。

  • ゴールデンクロス:短期(過去)<長期(過去)→短期(現在)>長期(現在)
  • デッドクロス:短期(過去)>長期(過去)→短期(現在)<長期(現在)

つまり、過去と現在の2点の線を結んでそれぞれが交わっているかどうかを判断する必要があります。

ゴールデンクロスは以下のような条件になります。

if(FMA[i+2] <= SMA[i+2] && FMA[i+1] > SMA[i+1])

この条件を満たしていれば、安値の30*Point低い場所に上矢印を表示させます。

GC[i] = Low[i]-30*Point;

デッドクロスは以下のような条件になります。

if(FMA[i+2] >= SMA[i+2] && FMA[i+1] < SMA[i+1])

この条件を満たしていれば、高値の30*Point高い場所に下矢印を表示させます。

DC[i] = High[i]+30*Point;

これでOnCalculate()関数に記述は完了です。

int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
  
   if(counted_bar == 0) limit -= 2;//counted_barが0ならlimitを-2ずらす
    for(int i = limit-1; i>=0; i--) // 確定足で矢印を表示
    {
       FMA[i]=iMA(NULL,0,FMA_Period,0,MODE_SMA,PRICE_CLOSE,i); //短期の移動平均線
       SMA[i]=iMA(NULL,0,SMA_Period,0,MODE_SMA,PRICE_CLOSE,i); //長期の移動平均線
       GC[i] = EMPTY_VALUE;//GC配列を空に
       DC[i] = EMPTY_VALUE;//DC配列を空に
     /*2本前の75SMAが2本前の20SMA以上で且つ1本前の20SMAの方が1本前の75SMAより大きい*/
       if(FMA[i+2] <= SMA[i+2] && FMA[i+1] > SMA[i+1])
       {
         GC[i] = Low[i]-30*Point;//安値の30ポイント高い位置にシグナル表示
       }
     /*2本前の20SMAが2本前の75SMA以上で且つ1本前の75SMAの方が1本前の20SMAより大きい*/
       if(FMA[i+2] >= SMA[i+2] && FMA[i+1] < SMA[i+1])
       {
         DC[i] = High[i]+30*Point;//高値の30ポイント低い位置にシグナル表示
       }
    }
Copy

コンパイルする

コンパイルしてシグナルが表示されていたら完了です。

ただ、角度などは考慮していないシンプルなインジケーターです。

MQL インジケーター作成 ゴールデンクロス・デッドクロス

ソースコード全体

//+------------------------------------------------------------------+
//|                                                  GCDC-SIGNAL.mq4 |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict

/*プロパティ*/
#property indicator_chart_window
#property indicator_buffers 4//バッファ4つ
#property indicator_color1 clrDeepPink//ピンク色
#property indicator_color2 clrDeepSkyBlue//青色
#property indicator_color3 clrWhite//白色
#property indicator_color4 clrWhite//白色
#property indicator_style1 STYLE_SOLID//実線
#property indicator_style2 STYLE_SOLID//実線
#property indicator_width1 3//幅3
#property indicator_width2 3//幅3
#property indicator_width3 3//幅3
#property indicator_width4 3//幅3

/*バッファ*/
double FMA[];//期間の短い移動平均線
double SMA[];//期間の長い移動平均線
double GC[];//ゴールデンクロスのシグナル用
double DC[];//デッドクロスのシグナル用

/*パラメータ*/
input int FMA_Period = 20;//短期移動平均線の期間
input int SMA_Period = 75;//長期移動平均線の期間

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,FMA);//インデックスにFMA配列を紐付け
   SetIndexBuffer(1,SMA);//インデックスにSMA配列を紐付け
   SetIndexBuffer(2,GC);//インデックスにGC配列を紐付け
   SetIndexBuffer(3,DC);//インデックスにDC配列を紐付け
   SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定
   SetIndexArrow(2, 233);//矢印のアイコンの種類を指定
   SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定
   SetIndexArrow(3, 234);//矢印のアイコンの種類を指定
//---
   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[])
  {
//---
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
  
   if(counted_bar == 0) limit -= 2;//counted_barが0ならlimitを-2ずらす
    for(int i = limit-1; i>=0; i--) // 確定足で矢印を表示
    {
       FMA[i]=iMA(NULL,0,FMA_Period,0,MODE_SMA,PRICE_CLOSE,i); //短期の移動平均線
       SMA[i]=iMA(NULL,0,SMA_Period,0,MODE_SMA,PRICE_CLOSE,i); //長期の移動平均線
       GC[i] = EMPTY_VALUE;//GC配列を空に
       DC[i] = EMPTY_VALUE;//DC配列を空に
     /*2本前の75SMAが2本前の20SMA以上で且つ1本前の20SMAの方が1本前の75SMAより大きい*/
       if(FMA[i+2] <= SMA[i+2] && FMA[i+1] > SMA[i+1])
       {
         GC[i] = Low[i]-30*Point;//安値の30ポイント高い位置にシグナル表示
       }
     /*2本前の20SMAが2本前の75SMA以上で且つ1本前の75SMAの方が1本前の20SMAより大きい*/
       if(FMA[i+2] >= SMA[i+2] && FMA[i+1] < SMA[i+1])
       {
         DC[i] = High[i]+30*Point;//高値の30ポイント低い位置にシグナル表示
       }
    }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Copy

まとめ

これでゴールデンクロスとデッドクロスでシグナルを表示させることができましたね。

期間を変えればシグナル表示も変わるのでぜひ改良して見てください。

コメント

タイトルとURLをコピーしました