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

【MQL】グランビルの法則の2番を表示するインジケーター【上級編】

MQL MT4 グランビル インジケーターMT4インジケーター作成

グランビルの法則の2番を表示するインジケーター

グランビルの法則はご存知ですかね?

ジョセフ・E・グランビル(Joseph E. Granville)が考案した買いと売りの8つのパターンを言います。

具体的には

  • 移動平均線
  • ローソク足

を活用して、価格との位置関係やチャートパターンと組み合わせて見ていきます。

グランビルの法則については以下の記事を参照してください。

今回はその中でも2番を表示するインジケーターです。

また、グランビルをただ表示するだけではなく、

MTFの移動平均線を目安にしたグランビルのインジケーターとなります。

  • グランビルでシグナルを表示
  • MTFの
  • ここにテキストを入力

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

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

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

今回は名前を「Granville」で作成します。

プロパティを記述する

プロパティを記述しましょう。

まず、シグナル2つを表示させるのでindicator_buffersは2つです。

#property indicator_buffers 2//バッファ2つ

それぞれの色を指定します。

#property indicator_color1 clrBlue//青色
#property indicator_color2 clrRed//赤色

幅を指定します。

#property indicator_width1 2//幅2
#property indicator_width2 2//幅2

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

#property indicator_buffers 2//バッファ2つ
#property indicator_color1 clrBlue//青色
#property indicator_color2 clrRed//赤色
#property indicator_width1 2//幅2
#property indicator_width2 2//幅2
Copy

バッファを定義する

バッファを定義しましょう。

今回は上矢印のupArrow[]と下矢印のdownArrow[]の2つを用意します。

double upArrow[], downArrow[];//上矢印と下矢印

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

/*バッファ*/
double upArrow[], downArrow[];//上矢印と下矢印
Copy

パラメータを記述する

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

maPeriodで移動平均線の期間を設定します。

input int maPeriod = 21;//移動平均線の期間

ENUM_TIMEFRAMESはチャート時間軸です。今回は1時間に設定したいので60にします。

input ENUM_TIMEFRAMES timeFrame = 60;//MTFのMAの期間

mtfMaPeriodでMTF(マルチタイムフレーム)用の移動平均線の期間を設定します。

input int mtfMaPeriod = 21;//MTF移動平均線の期間

最後にsignAlerでアラートのON/OFFを設定します。

input bool signAlert = false;//アラートのON/OFF

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

/*パラメーター*/
input int maPeriod = 21;//移動平均線の期間
input ENUM_TIMEFRAMES timeFrame = 60;//MTFのMAの期間
input int mtfMaPeriod = 21;//MTF移動平均線の期間
input bool signAlert = false;//アラートのON/OFF
Copy

OnInit()関数に記述する

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

それぞれのインデックスに紐付けします。

SetIndexBuffer(0, upArrow);//インデックス0にupArrowを紐付け
SetIndexBuffer(1, downArrow);//インデックス1にdownArrowを紐付け

スタイルを矢印の実線を選択しましょう。

SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//矢印の実線
SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//矢印の実線

最後に矢印の種類を決めましょう。

SetIndexArrow(0, 233);//矢印の種類
SetIndexArrow(1, 234);//矢印の種類

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

   SetIndexBuffer(0, upArrow);//インデックス0にupArrowを紐付け
   SetIndexBuffer(1, downArrow);//インデックス1にdownArrowを紐付け
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//矢印の実線
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//矢印の実線
   SetIndexArrow(0, 233);//矢印の種類
   SetIndexArrow(1, 234);//矢印の種類
Copy

OnCalculate()関数に記述する

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

   if(rates_total == prev_calculated) return(rates_total);

   int limit = rates_total-maPeriod-1;//バー総数-maPeriod-1
   int flag = 0;//フラッグを0にする

   for(int i=limit; i>=1; i--)
   {

      upArrow[i] = EMPTY_VALUE;//配列を空にする
      downArrow[i] = EMPTY_VALUE;//配列を空にする

      int shift = iBarShift(NULL, timeFrame, time[i]);//MTFの設定
      double mtfMa1 = iMA(NULL, timeFrame, mtfMaPeriod, 0, MODE_SMA, PRICE_CLOSE, shift+1);//MTFのMAのシフト1
      double mtfMa2 = iMA(NULL, timeFrame, mtfMaPeriod, 0, MODE_SMA, PRICE_CLOSE, shift+2);//MTFのMAのシフト2

      double ma = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, i);//MA
      double ma1 = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, i+1);//MAのシフト1

      if(mtfMa2 < mtfMa1 && mtfMa1 <= close[i])//MTFのMAシフト2の期間よりもMTFのMAシフト1の方が大きく、終値がMTFのMAシフト1以上の場合
      {
         if(flag == 1)//フラッグが1であれば
         {
            if(ma1 <= ma && close[i+1] <= ma1 && ma < close[i])//MAのシフト1がMA以下で終値のシフト1がMAのシフト1以下でMAが終値よりも小さい場合
            {
              upArrow[i] = low[i];//上矢印を安値に表示
            }
         }
         else//フラッグが1以外であれば
         {
            if(ma < close[i]) flag = 1;//MAが終値よりも小さい場合はフラッグを1にする
         }
      }
      if(mtfMa2 > mtfMa1 && mtfMa1 >= close[i])//MTFのMAのシフト1の期間よりもMTFのMAのシフト2の方が大きく、MTFのMAのシフト1が終値以上の場合
      {
         if(flag == -1)//フラッグが-1であれば
         {
            if(ma1 >= ma && close[i+1] >= ma1 && ma > close[i])//MAのシフト1がMA以上で終値のシフト1がMAシフト1以上でMAが終値よりも大きい場合
            {
              downArrow[i] = high[i];//下矢印を高値に表示
            }
         }
         else//フラッグが-1以外であれば
         {
            if(ma > close[i]) flag = -1;//MAが終値より大きい場合はフラッグを-1にする
         }
      }
   }

   if(signAlert)//signAlertがTrunの場合
   {
      if(upArrow[1] != EMPTY_VALUE) Alert("Granville 2nd UP");//upArrowが空ではない場合にアラート
      if(downArrow[1] != EMPTY_VALUE) Alert("Granville 2nd DOWN");//downArrowが空ではない場合にアラート
   }
Copy

コンパイルする

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

MQL MT4 グランビル インジケーター

移動平均線を表示した場合は以下のようになります。

MQL MT4 グランビル インジケーター

ソースコード全体

ソースコード全体です。

//+------------------------------------------------------------------+
//|                                                    Granville.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 2//バッファ2つ
#property indicator_color1 clrBlue//青色
#property indicator_color2 clrRed//赤色
#property indicator_width1 2//幅2
#property indicator_width2 2//幅2

/*バッファ*/
double upArrow[], downArrow[];//上矢印と下矢印

/*パラメーター*/
input int maPeriod = 21;//移動平均線の期間
input ENUM_TIMEFRAMES timeFrame = 60;//MTFのMAの期間
input int mtfMaPeriod = 21;//MTF移動平均線の期間
input bool signAlert = false;//アラートのON/OFF

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, upArrow);//インデックス0にupArrowを紐付け
   SetIndexBuffer(1, downArrow);//インデックス1にdownArrowを紐付け
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//矢印の実線
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//矢印の実線
   SetIndexArrow(0, 233);//矢印の種類
   SetIndexArrow(1, 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[]){

   if(rates_total == prev_calculated) return(rates_total);

   int limit = rates_total-maPeriod-1;//バー総数-maPeriod-1
   int flag = 0;//フラッグを0にする

   for(int i=limit; i>=1; i--)
   {

      upArrow[i] = EMPTY_VALUE;//配列を空にする
      downArrow[i] = EMPTY_VALUE;//配列を空にする

      int shift = iBarShift(NULL, timeFrame, time[i]);//MTFの設定
      double mtfMa1 = iMA(NULL, timeFrame, mtfMaPeriod, 0, MODE_SMA, PRICE_CLOSE, shift+1);//MTFのMAのシフト1
      double mtfMa2 = iMA(NULL, timeFrame, mtfMaPeriod, 0, MODE_SMA, PRICE_CLOSE, shift+2);//MTFのMAのシフト2

      double ma = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, i);//MA
      double ma1 = iMA(NULL, 0, maPeriod, 0, MODE_SMA, PRICE_CLOSE, i+1);//MAのシフト1

      if(mtfMa2 < mtfMa1 && mtfMa1 <= close[i])//MTFのMAシフト2の期間よりもMTFのMAシフト1の方が大きく、終値がMTFのMAシフト1以上の場合
      {
         if(flag == 1)//フラッグが1であれば
         {
            if(ma1 <= ma && close[i+1] <= ma1 && ma < close[i])//MAのシフト1がMA以下で終値のシフト1がMAのシフト1以下でMAが終値よりも小さい場合
            {
              upArrow[i] = low[i];//上矢印を安値に表示
            }
         }
         else//フラッグが1以外であれば
         {
            if(ma < close[i]) flag = 1;//MAが終値よりも小さい場合はフラッグを1にする
         }
       }
      if(mtfMa2 > mtfMa1 && mtfMa1 >= close[i])//MTFのMAのシフト1の期間よりもMTFのMAのシフト2の方が大きく、MTFのMAのシフト1が終値以上の場合
      {
         if(flag == -1)//フラッグが-1であれば
         {
            if(ma1 >= ma && close[i+1] >= ma1 && ma > close[i])//MAのシフト1がMA以上で終値のシフト1がMAシフト1以上でMAが終値よりも大きい場合
            {
              downArrow[i] = high[i];//下矢印を高値に表示
            }
         }
         else//フラッグが-1以外であれば
         {
            if(ma > close[i]) flag = -1;//MAが終値より大きい場合はフラッグを-1にする
         }
      }
   }

   if(signAlert)//signAlertがTrunの場合
   {
      if(upArrow[1] != EMPTY_VALUE) Alert("Granville 2nd UP");//upArrowが空ではない場合にアラート
      if(downArrow[1] != EMPTY_VALUE) Alert("Granville 2nd DOWN");//downArrowが空ではない場合にアラート
   }
   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をコピーしました