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

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

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

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

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

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

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

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

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

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

プロパティを記述する

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

必要なのは

  • 上矢印
  • 下矢印

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

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

次に色を選択しましょう。

#property indicator_color0 Blue//青色
#property indicator_color1 Red//赤色

次に線を実線に設定しましょう。

#property indicator_style0 STYLE_SOLID//実線
#property indicator_style1 STYLE_SOLID//実線

最後に幅を1に設定しましょう。

#property indicator_width4 1//幅1
#property indicator_width5 1//幅1

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

#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[];//下矢印

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

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

パラメーターを記述する

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

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

移動平均線を3つ使うのでそれぞれの期間を設定できるようにしましょう。

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

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

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を矢印表示
SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示

最後にインデックスの矢印の種類を設定しましょう。

SetIndexArrow(0,233);//インデックス0を矢印の種類
SetIndexArrow(1,234);//インデックス1を矢印の種類

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

   SetIndexBuffer(0,BufUP_Arrow);//インデックス0にBufUP_Arrowを紐付け
   SetIndexBuffer(1,BufDOWN_Arrow);//インデックス1にBufDOWN_Arrowを紐付け
   SetIndexStyle(0,DRAW_ARROW);//インデックス0を矢印表示
   SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示
   SetIndexArrow(0,233);//インデックス0を矢印の種類
   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のソースコード全体は以下に記載しています。

//+------------------------------------------------------------------+
//|                                                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を矢印表示
   SetIndexStyle(1,DRAW_ARROW);//インデックス1を矢印表示
   SetIndexArrow(0,233);//インデックス0を矢印の種類
   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

まとめ

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

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

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をコピーしました