移動平均線のゴールデンクロス・デッドクロス時にシグナルを表示するインジケーター
移動平均線のゴールデンクロス・デッドクロス時に
シグナルを表示するインジケーターを作成していきたいと思います。
- 2つの移動平均線を表示する
- シグナルを表示する
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。
今回は名前を「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
バッファを定義する
バッファを定義しましょう。バッファも4つ必要になります。
FMA[]は短い移動平均線でSMA[]は長い移動平均線です。
double FMA[];//期間の短い移動平均線 double SMA[];//期間の長い移動平均線
GC[]はゴールデンクロスのシグナル用でDC[]はデッドクロスのシグナル用です。
double GC[];//ゴールデンクロスのシグナル用 double DC[];//デッドクロスのシグナル用
これでバッファを定義は完了です。
double FMA[];//期間の短い移動平均線 double SMA[];//期間の長い移動平均線 double GC[];//ゴールデンクロスのシグナル用 double DC[];//デッドクロスのシグナル用
パラメータを記述する
パラメータを記述しましょう。
短期移動平均線の期間と長期移動平均線の期間を2つ作ります。
input int FMA_Period = 20;//短期移動平均線の期間 input int SMA_Period = 75;//長期移動平均線の期間
これでパラメータの記述は完了です。
input int FMA_Period = 20;//短期移動平均線の期間 input int SMA_Period = 75;//長期移動平均線の期間
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);//矢印のアイコンの種類を指定
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ポイント低い位置にシグナル表示
}
}
コンパイルする
コンパイルしてシグナルが表示されていたら完了です。
ただ、角度などは考慮していないシンプルなインジケーターです。
ソースコード全体
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);
}
//+------------------------------------------------------------------+
まとめ
これでゴールデンクロスとデッドクロスでシグナルを表示させることができましたね。
期間を変えればシグナル表示も変わるのでぜひ改良して見てください。
コメント