1,000人限定!!企画に参加してEAをGetする公式ラインに登録して
プレゼントをもらう

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

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

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

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

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

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

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

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

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

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

プロパティを記述する

今回は、

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

なので4つ必要になります。

#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

これでプロパティの記述は完了です。

#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[]は長い移動平均線です。

double FMA[];//期間の短い移動平均線
double SMA[];//期間の長い移動平均線

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

double GC[];//ゴールデンクロスのシグナル用
double DC[];//デッドクロスのシグナル用

これでバッファを定義は完了です。

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

パラメータを記述する

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

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

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

これでパラメータの記述は完了です。

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);//矢印のシグナルを指定
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定

最後に矢印の種類を設定します。

SetIndexArrow(2, 233);//矢印のアイコンの種類を指定
SetIndexArrow(3, 234);//矢印のアイコンの種類を指定

これでOnInit()関数の記述は完了です。

   SetIndexBuffer(0,FMA);//インデックスにFMA配列を紐付け
   SetIndexBuffer(1,SMA);//インデックスにSMA配列を紐付け
   SetIndexBuffer(2,GC);//インデックスにGC配列を紐付け
   SetIndexBuffer(3,DC);//インデックスにDC配列を紐付け
   SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定
   SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定
   SetIndexArrow(2, 233);//矢印のアイコンの種類を指定
   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のソースコード全体は以下になります。

//+------------------------------------------------------------------+
//|                                                  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);//矢印のシグナルを指定
   SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//矢印のシグナルを指定
   SetIndexArrow(2, 233);//矢印のアイコンの種類を指定
   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

まとめ

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

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

1,000人限定でFXの自動売買のEAを無料で配布中!!

FX-EA System Projectでは、

【1,000人限定で無料でFXの自動売買のEAを配布中】

です!!

・毎日チャートを見てるのに全く稼げなかった

・コンサルや塾に入ったけど全く稼げなかった

・裁量トレードは難しくて挫折した

・ツールやシステムを購入したが全く稼げなかった

・時間がなくて裁量トレードを行える時間がない

・自動で楽に稼ぎたい

という風に思っている方はこの企画はおすすめです。

フォワードテスト・バックテストを

しっかり行ったパフォーマンスの良いEAを提供中です!!

また、どんどん新しいEAも随時無料配布します!!

人数限定なので早いものがちです!!

もしFX-EA System Projectに興味があれば

是非参加してください。

MT4インジケーター作成 中級編
\記事が役に立ったらシェアしてね/
FX-EA System Projectをフォローする
FX-EA System Project Creator

コメント

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