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

【MQL】MACDとRSIを組み合わせたインジケーター【上級編】

MQL MT4 インジケーター MACD RSIMT4インジケーター作成

MACDとRSIを組み合わせたインジケーター

MACDとRSIを組み合わせたインジケーターを作成したいと思います。

  • RSIが70以上でMACDがゴールデンクロスした場合にロングシグナル
  • RSIが30以下でMACDがデッドクロスした場合にショートシグナル

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

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

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

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

プロパティを記述する

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

今回は、

  • 上矢印
  • 下矢印

の2つになります。

#property indicator_buffers 2//バッファ
Copy

バッファを定義する

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

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

パラメータを記述する

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

input int RSIPeriod = 14;//RSIの期間
input int fast_ema_period = 12;//fast_emaの期間
input int slow_ema_period = 26;//slow_emaの期間
input int signal_period = 9;//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);//インデックス4を上矢印設定
   SetIndexArrow(0,233);//矢印の表示設定
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス5を下矢印設定
   SetIndexArrow(1,234);//矢印の表示設定
Copy

OnCalculate()関数を記述する

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

それぞれの変数を用意します。

double RSI;
double MACDMainNow,MACDSignalNow;
double MACDMainPre,MACDSignalPre;

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

int limit = Bars-IndicatorCounted();

それぞれの変数にテクニカル指標を値を代入させます。

RSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);//RSI
MACDMainNow = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);
MACDSignalNow = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);
MACDMainPre = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1); 
MACDSignalPre = iMACD(NULL, 0,fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);

配列を空にしましょう。

UP_Arrow[i] = EMPTY_VALUE;
DOWN_Arrow[i] = EMPTY_VALUE;

RSIが70以上でMACDがゴールデンクロスした場合に

if(RSI >70 && MACDSignalPre > MACDMainPre && MACDMainNow > MACDSignalNow)

上矢印表示させます。

UP_Arrow[i] = Low[i] - 20 * Point;

RSIが30以下でMACDがデッドクロスした場合

else if(RSICurrent[i] < 30 && MACDSignal[i] > MACDMain[i])

下矢印表示させます。

DOWN_Arrow[i] = High[i] + 20 * Point;

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

   double RSI;//RSIの変数
   double MACDMainNow,MACDSignalNow;//現在のMACDの変数
   double MACDMainPre,MACDSignalPre; //過去のMACDの変数

   int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   for(int i = limit-1; i >= 0; i--)
   {
     RSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);//RSI
     MACDMainNow = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//現在のメインライン
     MACDSignalNow = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//現在のシグナルライン
     MACDMainPre = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1); //過去のメインライン
     MACDSignalPre = iMACD(NULL, 0,fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//過去のシグナルライン
     
    UP_Arrow[i] = EMPTY_VALUE;//配列を空にする
    DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする
 
    if(RSI >70 && MACDSignalPre > MACDMainPre && MACDMainNow > MACDSignalNow)//RSIが70以上でMACDがゴールデンクロスした場合
     {
       UP_Arrow[i] = Low[i] - 20 * Point; //上矢印表示
     }
     else if(RSICurrent[i] < 30 && MACDSignal[i] > MACDMain[i]) //RSIが30以下でMACDがデッドクロスした場合
     {
       DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示
     }
   }
Copy

コンパイルする

コンパイルしましょう。しっかりとロジック通りに動いていれば完成です。

MQL MT4 MACD RSI インジケーター

ソースコード全体

//+------------------------------------------------------------------+
//|                                                     MACD-RSI.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[];//上矢印
double DOWN_Arrow[];//下矢印

/*パラメーター*/
input int RSIPeriod = 14;//RSIの期間
input int fast_ema_period = 12;//fast_emaの期間
input int slow_ema_period = 26;//slow_emaの期間
input int signal_period = 9;//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を上矢印設定
   SetIndexArrow(0,233);//矢印の表示設定
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Yellow);//インデックス1を下矢印設定
   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 RSI;//RSIの変数
   double MACDMainNow,MACDSignalNow;//現在のMACDの変数
   double MACDMainPre,MACDSignalPre;//過去のMACDの変数

   int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   for(int i = limit-1; i >= 0; i--)
   {
   
     RSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);//RSI
     MACDMainNow = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i);//現在のメインライン
     MACDSignalNow = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_SIGNAL, i);//現在のシグナルライン
     MACDMainPre = iMACD(NULL, 0, fast_ema_period, slow_ema_period, signal_period, PRICE_CLOSE, MODE_MAIN, i+1); //1つ前のメインライン
     MACDSignalPre = iMACD(NULL, 0, fast_ema_period,slow_ema_period , signal_period, PRICE_CLOSE, MODE_SIGNAL, i+1);//1つ前のシグナルライン
     
     UP_Arrow[i] = EMPTY_VALUE;//配列を空にする
     DOWN_Arrow[i] = EMPTY_VALUE;//配列を空にする
     if(RSI >70 && MACDSignalPre > MACDMainPre && MACDMainNow > MACDSignalNow)//RSIが70以上でMACDがゴールデンクロスした場合
     {
       UP_Arrow[i] = Low[i] - 20 * Point; //上矢印表示
     }
     else if(RSI < 30 && MACDSignalPre < MACDMainPre && MACDMainNow < MACDSignalNow //RSIが30以下でMACDがデッドクロスした場合
     {
       DOWN_Arrow[i] = High[i] + 20 * Point;//下矢印表示
     }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Copy

まとめ

 

コメント

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