FX-EA System Projectはこちら公式ラインに登録して
プレゼントをもらう

【MQL】移動平均線のパーフェクトオーダーのサインインジケーター【中級編】

MQL パーフェクトオーダー サインインジケーター 作成MT4インジケーター作成

移動平均線のパーフェクトオーダーのサインインジケーター

移動平均線のパーフェクトオーダーのサインインジケーターを作成していきたいと思います。

  • 上昇パーフェクトオーダー時にロングエントリーシグナルを表示させる
  • 下降パーフェクトオーダー時にショートエントリーシグナルを表示させる

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

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

【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた
カスタムインジケーターの作成の流れ カスタムインジケーターの作成の流れを説明していきます。 メタエディターを起動する MetaEditor(メタエディタ)をMT4から起動させる方法は以下の通りです。 ツール→メタエデ...

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

プロパティを記述する

プロパティの記述していきます。

必要なのは

  • 上矢印
  • 下矢印

なのでバッファを2個用意しましょう。

#property indicator_chart_window
#property indicator_buffers 2//バッファ2つ
#property indicator_color0 Blue//青色
#property indicator_color1 Red//赤色
#property indicator_style0 STYLE_SOLID//実線
#property indicator_style1 STYLE_SOLID//実線
#property indicator_width4 1//幅1
#property indicator_width5 1//幅1
Copy

バッファを定義する

バッファを定義しましょう。バッファも2つ用意しましょう。

double BufUP_Arrow[];//上矢印
double BufDOWN_Arrow[];//下矢印
Copy

パラメーターを記述する

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

パラメーターを記述することでインジケーターを使うユーザーが自由に期間を設定することが可能になります。

input int MA_Short_Period = 25;//短期移動平均線の期間
input int MA_Middle_Period = 50;//中期移動平均線の期間
input int MA_Long_Period = 200;//長期移動平均線の期間
Copy

OnInit()関数に記述する

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

   SetIndexBuffer(0,BufUP_Arrow);//インデックス0にBufUP_Arrowを紐付け
   SetIndexBuffer(1,BufDOWN_Arrow);//インデックス1にBufDOWN_Arrowを紐付け
   SetIndexStyle(0,DRAW_ARROW);//インデックス0を矢印表示
   SetIndexArrow(0,233);//インデックス0を矢印の種類
   SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示
   SetIndexArrow(1,234);//インデックス1を矢印の種類
Copy

OnCalculate()関数に記述する

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

未だ計算されていないバー数(チャート上のバー数 – 計算済みバー数)を取得します。

int limit = Bars-IndicatorCounted();

3つの移動平均線をそれぞれの値を格納します。

     MA_Short =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の短期MA
     MA_Middle=iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i);//現在の中期MA
     MA_Long =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の長期MA
     MA_Short_Pre =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の短期MA
     MA_Middle_Pre =iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i+1);//過去の中期MA
     MA_Long_Pre =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去

それぞれの配列を空にします。

     BufUP_Arrow[i] = EMPTY_VALUE;//バッファ空にする
     BufDOWN_Arrow[i] = EMPTY_VALUE;//バッファ空にする

「短期 > 中期 & 中期 > 長期 & 終値 > 短期」という上昇パーフェクトオーダー時に

if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)

上矢印を安値から-30*pointずらした場所に表示させます。

BufUP_Arrow[i] = Low[i]-30*Point;

「短期 < 中期 & 中期 < 長期 & 終値 < 短期」という下降パーフェクトオーダー時に

if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)

下矢印を高江値から+30*pointずらした場所に表示させます。

BufDOWN_Arrow[i] = High[i]-30*Point;

OnCalculate()関数は完了です。

   int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   for(int i=limit-1; i>=0; i--)
   {
     MA_Short =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の短期MA
     MA_Middle=iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i);//現在の中期MA
     MA_Long =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の長期MA
     MA_Short_Pre =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の短期MA
     MA_Middle_Pre =iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i+1);//過去の中期MA
     MA_Long_Pre =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の長期MA

     BufUP_Arrow[i] = EMPTY_VALUE;//バッファ空にする
     BufDOWN_Arrow[i] = EMPTY_VALUE;//バッファ空にする

       // 短期 > 中期 & 中期 > 長期 & 終値 > 短期の場合(上昇パーフェクトオーダー)
       if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
       {
         BufUP_Arrow[i] = Low[i]-30*Point;//上矢印の表示
       }
       // 短期 < 中期 & 中期 < 長期 & 終値 < 短期の場合(下降パーフェクトオーダー)
       if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
       {
         BufDOWN_Arrow[i] = High[i]+30*Point;//下矢印の表示
       }
   }
Copy

コンパイルする

コンパイルして移動平均線とシグナルが表示されていたら完了です。

実はまだこれは実用的ではなく、単純に移動平均線の並びに対してシグナルを表示させているだけです。

MQL MT4 パーフェクトオーダー サインインジケーター

ソースコード全体

//+------------------------------------------------------------------+
//|                                                Perfect-order.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_color0 Blue//青色
#property indicator_color1 Red//赤色
#property indicator_style0 STYLE_SOLID//実線
#property indicator_style1 STYLE_SOLID//実線
#property indicator_width4 1//幅1
#property indicator_width5 1//幅1

/*バッファ*/
double BufUP_Arrow[];//上矢印
double BufDOWN_Arrow[];//下矢印

/*パラメーター*/
input int MA_Short_Period = 25;//短期移動平均線の期間
input int MA_Middle_Period = 50;//中期移動平均線の期間
input int MA_Long_Period = 200;//長期移動平均線の期間

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufUP_Arrow);//インデックス0にBufUP_Arrowを紐付け
   SetIndexBuffer(1,BufDOWN_Arrow);//インデックス1にBufDOWN_Arrowを紐付け
   SetIndexStyle(0,DRAW_ARROW);//インデックス0を矢印表示
   SetIndexArrow(0,233);//インデックス0を矢印の種類
   SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示
   SetIndexArrow(1,234);//インデックス1を矢印の種類
//---
   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();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   for(int i=limit-1; i>=0; i--)
   {
     MA_Short =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の短期MA
     MA_Middle=iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i);//現在の中期MA
     MA_Long =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i);//現在の長期MA
     MA_Short_Pre =iMA(_Symbol,_Period,MA_Short_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の短期MA
     MA_Middle_Pre =iMA(_Symbol,_Period,MA_Middle_Bars,0,MODE_SMA,PRICE_CLOSE,i+1);//過去の中期MA
     MA_Long_Pre =iMA(_Symbol,_Period,MA_Long_Bars, 0,MODE_SMA,PRICE_CLOSE,i+1);//過去の長期MA

     BufUP_Arrow[i] = EMPTY_VALUE;//バッファ空にする
     BufDOWN_Arrow[i] = EMPTY_VALUE;//バッファ空にする

       // 短期 > 中期 & 中期 > 長期 & 終値 > 短期の場合(上昇パーフェクトオーダー)
       if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
       {
         BufUP_Arrow[i] = Low[i]-30*Point;//上矢印の表示
       }
       // 短期 < 中期 & 中期 < 長期 & 終値 < 短期の場合(下降パーフェクトオーダー)
       if(MA_Short> MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MA_Short_Pre> MA_Middle_Pre && MA_Middle_Pre > MA_Long_Pre && Close[i] > MA_Short_Pre)
       {
         BufDOWN_Arrow[i] = High[i]+30*Point;//下矢印の表示
       }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Copy

まとめ

今回は移動平均線のパーフェクトオーダーのサインインジケーターを作成してみました。

少しずつプログラミングにもなれてきたと思います。徐々に高度なことに挑戦していきましょう。

コメント

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