MQL実用プログラム

【MQL4】移動平均線のゴールデンクロス・デッドクロスを書いてみよう。

1. ゴールデンクロス・デッドクロスとは?

ゴールデンクロスとは、短期線が長期線を下から上に突き抜けることです。ゴールデンクロスは買いサインに用いられることが多いです。

デッドクロスとは、短期線が長期線を上から下に突き抜けることです。デッドクロスは売りサインに用いられることが多いです。

2. 移動平均線の値を取得しよう。

前章で分かる通り、ゴールデンクロスやデッドクロスは短期線と長期線の期間の違う2種類の移動平均線を利用します。

2種類の移動平均線から、ローソク足1本前と2本前の移動平均線の値を取得します。

なので、短期線からローソク足1本前と2本前、長期線からローソク足1本前と2本前の合計4つの値を取得します。

移動平均線の値を取得するためにはiMA関数を使用し、取得した値はdouble型の変数に格納します。

double ma_one_short = iMA(NULL,PERIOD_M5,100,0,MODE_SMA, PRICE_CLOSE, 1);
double ma_one_long = iMA(NULL,PERIOD_M5,200,0,MODE_SMA, PRICE_CLOSE, 1);
double ma_two_short = iMA(NULL,PERIOD_M5,100,0,MODE_SMA, PRICE_CLOSE, 2); 
double ma_two_long = iMA(NULL,PERIOD_M5,200,0,MODE_SMA, PRICE_CLOSE, 2); 

1行目 短期線からローソク足1本前のMA値を取得し、”ma_one_short“に格納。

2行目 長期線からローソク足1本前のMA値を取得し、”ma_one_long“に格納。

3行目 短期線からローソク足2本前のMA値を取得し、”ma_two_short“に格納。

4行目 長期線からローソク足2本前のMA値を取得し、”ma_two_long“に格納。

現在足(0本前)の値を使わない理由は、現在足の形成途中にクロスを確認したが、形成後、結局クロスしなかったということがあるため、確実にクロスを確認したい場合は1本前と2本前で値を取得するのが良い。

ちゃーと坊主
ちゃーと坊主
何故4つも値を取得するのか…?
それは次の章で解説します。

3. 移動平均線の値を比較しよう。

次は、移動平均線の取得した4つの値を比較します。やることは2つです。

  1. 2本前の短期線と2本前の長期線の値を比較します。
  2. 1本前の短期線と1本前の長期線の値を比較します。

この2つを比較し、条件を満たせば、クロスを確認したことになります。

画像と共に、詳しく見ていきましょう。

3-1. ゴールデンクロス時の値を比較

ゴールデンクロス時の移動平均線の値の比較は次のようになります。

2本前では長期線が短期線より大きい。1本前では短期線が長期線より大きい。

2本前長期線>2本前短期線  且つ  1本前短期線>1本前長期線

if( ma_two_long>ma_two_short && ma_one_short>ma_one_long )
{
//ゴールデンクロス時の処理を書く
}

3-2. デッドクロス時の値を比較

デッドクロス時の移動平均線の値の比較は次のようになります。

2本前では短期線が長期線より大きい。1本前では長期線が短期線より大きい。

2本前短期線>2本前長期線  且つ  1本前長期線>1本前短期線

if( ma_two_short>ma_two_long && ma_one_long>ma_one_short )
{
//デッドクロス時の処理を書く
}

4. まとめ(プログラム)

最後に、ここまでに記事の内容をまとめておきます。

    要点まとめ
  • ゴールデンクロス・デッドクロスは短期線と長期線の2種類の移動平均線を用いる。
  • 短期線と長期線から1本前と2本前の値、計4つの値をiMA関数を利用して取得する。
  • 取得した2本前の短期線と長期線の値を比較する。取得した1本前の短期線と長期線の値を比較する。
  • if文で条件を満たすことでゴールデンクロス・デッドクロスを確認する。

まとめプログラムです。変数名やiMA関数の値は自由に変更してお使い下さい。

void OnTick() {
  //MA値取得
  double ma_one_short = iMA(NULL,PERIOD_M5,100,0,MODE_SMA, PRICE_CLOSE, 1);
  double ma_one_long = iMA(NULL,PERIOD_M5,200,0,MODE_SMA, PRICE_CLOSE, 1);
  double ma_two_short = iMA(NULL,PERIOD_M5,100,0,MODE_SMA, PRICE_CLOSE, 2); 
  double ma_two_long = iMA(NULL,PERIOD_M5,200,0,MODE_SMA, PRICE_CLOSE, 2); 
 //ゴールデンクロス
  if( ma_two_long>ma_two_short && ma_one_short>ma_one_long )
  {
  //ゴールデンクロス時の処理を書く
  }
  //デッドクロス
  if( ma_two_short>ma_two_long && ma_one_long>ma_one_short )
  {
  //デッドクロス時の処理を書く
  }
}