移動平均線のゴールデンクロス・デッドクロス時にシグナルを表示するインジケーターを作成します。
- 2つの移動平均線を表示する
- シグナルを表示する
MetaEditorを起動する
まずはMetaEditorを起動しましょう。
操作については以下の記事をご覧ください
-
MT4インジケーター・EA作成手順
propertyを記述する
ゴールデンクロス・デッドクロスに必要な以下の4つの情報をpropertyに記述していきましょう。
- 短期移動平均線
- 長期移動平均線
- 上矢印
- 下矢印
プロパティの設定

#property indicator_chart_window
インジゲータをチャートウインドウに表示する。
#property indicator_buffers 4
インジゲータのバッファを格納する。今回は4つ。
#property indicator_color1 DodgerBlue
インジゲータの色を指定する。
短期移動平均線の色、今回はDodgerBlueを使用。
#property indicator_color2 HotPink
インジゲータの色を指定する。
長期移動平均線の色、今回はHotPinkを使用。
#property indicator_color3 Blue
インジゲータの色を指定する。
ゴールデンクロス時の上矢印の色、今回はBlueを使用。
#property indicator_color4 Red
インジゲータの色を指定する。
デッドクロス時の下矢印の色、今回はRedを使用。
変数の設定

double BufMA01[];
double型の変数を指定。今回は短期移動平均線用にBufMA01という配列を指定。
double BufMA02[];
double型の変数を指定。今回は長期移動平均線用にBufMA02という配列を指定。
double BufBuy[];
double型の変数を指定。今回は上矢印用にBufBuyという配列を指定。
double BufSell[];
double型の変数を指定。今回は下矢印用にBufSellという配列を指定。
extern int MA01_Period = 25;
外部パラメーターの設定。短期移動平均線の期間を25に設定。パラメーターで変更可能。
extern int MA02_Period = 100;
外部パラメーターの設定。長期移動平均線の期間を100に設定。パラメーターで変更可能。
OnInit()関数に変数を記述する
ここでは平均線の描画や矢印のスタイルなどの設定を記述していきます。

SetIndexBuffer(0,BufMA01);
インジケーターバッファーをインジケーターバッファー領域に割り当てる。
ここでは、0番目のインデックスを指定し、BufMa01という配列を指定。
SetIndexBuffer(1,BufMA02);
インジケーターバッファーをインジケーターバッファー領域に割り当てる。
ここでは、1番目のインデックスを指定し、BufMa02という配列を指定。
SetIndexBuffer(2,BufBuy);
インジケーターバッファーをインジケーターバッファー領域に割り当てる。
ここでは、2番目のインデックスを指定し、BufBuyという配列を指定。
SetIndexBuffer(3,BufSell);
インジケーターバッファーをインジケーターバッファー領域に割り当てる。
ここでは、3番目のインデックスを指定し、BufSellという配列を指定。
SetIndexStyle(2,DRAW_ARROW,STYLE_SOLID,5,Blue);
描画スタイルを指定する。ここでは、2番目のインデックスに指定したBufBuyの設定を指定する。
SetIndexArrow(2,233);
記号を表示させる。ここでは、2番目のインデックスに指定したBufBuyの設定を指定する。
SetIndexStyle(3,DRAW_ARROW,STYLE_SOLID,5,Red);
描画スタイルを指定する。ここでは、3番目のインデックスに指定したBufSellの設定を指定する。
SetIndexArrow(3,234);
記号を表示させる。ここでは、3番目のインデックスに指定したBufSellの設定を指定する。
intstart()関数に変数を記述する
ゴールデンクロスとデッドクロスはプログラミング言語化すると以下のようになります。
- ゴールデンクロス
短期の移動平均線が長期の移動平均線を下から上に突き抜けるポイント - デッドクロス
短期の移動平均線が長期の移動平均線を上から下に突き抜けるポイント
- ゴールデンクロス
BufMA01がBufMA02をLowからHighに突き抜けたポイントに BufBuy - デッドクロス
BufMA01がBufMA02をHighからLowに突き抜けたポイントにBufSell
上記の内容をintstart()に記述したものが以下の内容になります。

int counted_bar = IndicatorCounted();
int型の変数counted_barにバー(確定値が計算されたバー(現在のバー以外))の本数を代入。
int limit = Bars-counted_bar;
int型の変数limitに表示されているバーの本数からcounted_barを引いた値を代入。
if(counted_bar == 0) limit -= MA02_Period-1;
if文。
for (int i = limit-1; i>=0; i--)
for文。
BufMA01[i] = iMA(NULL,0,MA01_Period,0,MODE_EMA,PRICE_CLOSE,i);
BurMA01[i]にiMAの値を代入。
BufMA02[i] = iMA(NULL,0,MA02_Period,0,MODE_EMA,PRICE_CLOSE,i);
BurMA02[i]にiMAの値を代入。
if(counted_bar == 0) limit -= 2;
if文。
for (i = limit-1; i>=0; i--)
for文。
BufBuy[i] = EMPTY_VALUE;
BufBuy[i]にEMPTY_VALUEを代入。
if(BufMA01[i+2] <= BufMA02[i+2] && BufMA01[i+1] > BufMA02[i+1])
if文。
BufBuy[i] = Low[i]-10*Point;
安値の1pips下に上矢印を表示させる。
BufSell[i] = EMPTY_VALUE;
BufSell[i]にEMPTY_VALUEを代入。
if(BufMA01[i+2] >= BufMA02[i+2] && BufMA01[i+1] < BufMA02[i+1])
if文。
BufSell[i] = High[i]+10*Point;
高値の1pips上に下矢印を表示させる。
コンパイルする
最後にコンパイルしましょう。
以下の画像のようにチャート上にシグナルが表示されていたら完成です。
