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

【MQL】パーフェクトオーダーとMACDを組み合わせたインジケーター【上級編】

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

パーフェクトオーダーとMACDを組み合わせたインジケーター

パーフェクトオーダーとMACDを組み合わせたインジケーターを作成したいと思います。

  • 上昇パーフェクトオーダーでMACDがゴールデンクロスしている時に上矢印
  • 下降パーフェクトオーダーでMACDがデッドクロスしている時に下矢印

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

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

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

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

プロパティを記述する

プロパティを記述しましょう。今回は、

  • 上矢印
  • 下矢印

の2つになります。

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

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

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

バッファを定義する

バッファを定義しましょう。上矢印と下矢印用を作ります。

double UP_Arrow[],DOWN_Arrow[];//上矢印と下矢印

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

double UP_Arrow[],DOWN_Arrow[];//上矢印と下矢印
Copy

パラメーターを記述する

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

移動平均線の短期、中期、長期をそれぞれの期間を指定します。

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

MACDの期間を指定します。

input int fast_ema_period = 12;//MACDのfast_emaの期間
input int slow_ema_period = 26;//MACDのslow_emaの期間
input int signal_period = 9;//MACDのSignalの期間

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

input int MA_Short_Period = 25;//短期移動平均線の期間
input int MA_Middle_Period = 50;//中期移動平均線の期間
input int MA_Long_Period = 200;//長期移動平均線の期間
input int fast_ema_period = 12;//MACDのfast_emaの期間
input int slow_ema_period = 26;//MACDのslow_emaの期間
input int signal_period = 9;//MACDのSignalの期間
Copy

OnInit()関数を記述する

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

インデックスに紐付けします。

SetIndexBuffer(0, UP_Arrow);//インデックス0にUP_Arrowを格納
SetIndexBuffer(1, DOWN_Arrow);//インデックス1にDOWN_Arrowを格納

矢印の設定をします。

SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス0を上矢印設定
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス1を下矢印設定

矢印の種類を設定します。

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

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

SetIndexBuffer(0, UP_Arrow);//インデックス5にUP_Arrowを格納
SetIndexBuffer(1, DOWN_Arrow);//インデックス6にDOWN_Arrowを格納
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス5を上矢印設定
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス6を下矢印設定
SetIndexArrow(0,233);//矢印の表示設定
SetIndexArrow(1,234);//矢印の表示
Copy

OnCalculate()関数を記述する

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

変数を記述しましょう。

double MA_Short,MA_Middle,MA_Long;//MA変数
double MACDMain,MACDSignal;//MACD変数
double MACDMainPre,MACDSignalPre;//MACD過去変数

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

int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)

それぞれの値を格納します。

MA_Short = iMA(_Symbol,_Period,MA_Short_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Short
MA_Middle = iMA(_Symbol,_Period,MA_Middle_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Middle
MA_Long = iMA(_Symbol,_Period,MA_Long_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Long
MACDMain = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//MACDMain
MACDSignal = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//MACDSignal
MACDMainPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1);//MACDMain過去
MACDSignalPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//MACDSignal過去

配列を空にしましょう。

UP_Arrow[i] = EMPTY_VALUE;//配列を空にする
DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする

次に上昇トレンド時のトレード条件を記述しましょう。

上昇パーフェクトオーダー時にMACDがゴールデンクロス時に

if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre)//上昇パーフェクトオーダー時にMACDがゴールデンクロス

上矢印を表示します。

UP_Arrow[i] = Low[i] - 20 * Point;//上矢印表示

下降パーフェクトオーダー時にMACDがデッドクロス時に

if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre) //下降パーフェクトオーダー時にMACDがデッドクロス

下矢印を表示します。

DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示

これでOnCalculate()関数を記述は完了です。

   double MA_Short,MA_Middle,MA_Long;//MA変数
   double MACDMain,MACDSignal;//MACD変数
   double MACDMainPre,MACDSignalPre;//MACD過去変数

   int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   
   for(int i = limit-1; i >= 0; i--)
   {
   MA_Short = iMA(_Symbol,_Period,MA_Short_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Short
   MA_Middle = iMA(_Symbol,_Period,MA_Middle_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Middle
   MA_Long = iMA(_Symbol,_Period,MA_Long_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Long
   MACDMain = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//MACDMain
   MACDSignal = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//MACDSignal
   MACDMainPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1);//MACDMain過去
   MACDSignalPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//MACDSignal過去
   
   UP_Arrow[i] = EMPTY_VALUE;//配列を空にする
   DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする
     if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre)//上昇パーフェクトオーダー時にMACDがゴールデンクロス
     {
        UP_Arrow[i] = Low[i] - 20 * Point;//上矢印表示
     }
     if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre) //下降パーフェクトオーダー時にMACDがデッドクロス
     {
        DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示
     }
   }
Copy

コンパイルする

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

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

ただ移動平均線の角度などは決めていないので角度などを組み合わせるとまたさらに精度が良くなります。

ソースコード全体

PerfectOrder-MACDのソースコード全体は以下に記載しています。

//+------------------------------------------------------------------+
//|                                            PerfectOrder-MACD.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つ

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

/*パラメーター*/
input int MA_Short_Period = 25;//短期移動平均線の期間
input int MA_Middle_Period = 50;//中期移動平均線の期間
input int MA_Long_Period = 200;//長期移動平均線の期間
input int fast_ema_period = 12;//MACDのfast_emaの期間
input int slow_ema_period = 26;//MACDのslow_emaの期間
input int signal_period = 9;//MACDのSignalの期間
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, UP_Arrow);//インデックス0にUP_Arrowを格納
   SetIndexBuffer(1, DOWN_Arrow);//インデックス1にDOWN_Arrowを格納
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス0を上矢印設定
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス1を下矢印設定
   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[])
  {
//---
   double MA_Short,MA_Middle,MA_Long;//MA変数
   double MACDMain,MACDSignal;//MACD変数
   double MACDMainPre,MACDSignalPre;//MACD過去変数

   int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   
   for(int i = limit-1; i >= 0; i--)
   {
   MA_Short = iMA(_Symbol,_Period,MA_Short_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Short
   MA_Middle = iMA(_Symbol,_Period,MA_Middle_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Middle
   MA_Long = iMA(_Symbol,_Period,MA_Long_Period,0,MODE_SMA,PRICE_CLOSE,i);//MA_Long
   MACDMain = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//MACDMain
   MACDSignal = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//MACDSignal
   MACDMainPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1);//MACDMain過去
   MACDSignalPre = iMACD(_Symbol, _Period, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//MACDSignal過去
   
   UP_Arrow[i] = EMPTY_VALUE;//配列を空にする
   DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする
     if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre)//上昇パーフェクトオーダー時にMACDがゴールデンクロス
     {
        UP_Arrow[i] = Low[i] - 20 * Point;//上矢印表示
     }
     if((MA_Short > MA_Middle && MA_Middle > MA_Long && Close[i] > MA_Short && MACDMain > MACDSignal && MACDMainPre < MACDSignalPre) //下降パーフェクトオーダー時にMACDがデッドクロス
     {
        DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示
     }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Copy

まとめ

知識を応用するだけでパーフェクトオーダーとMACDを組み合わせたインジケーターを作ることができましたね。

これぐらいできると基本的なインジケーターはできてしまいます。

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