MACDとRSIを組み合わせたインジケーター
MACDとRSIを組み合わせたインジケーターを作成したいと思います。
- RSIが70以上でMACDがゴールデンクロスした場合にロングシグナル
- RSIが30以下でMACDがデッドクロスした場合にショートシグナル
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。
【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた
今回は名前を「RSI-MACD」で作成します。
プロパティを記述する
プロパティを記述しましょう。
今回は、
- 上矢印
- 下矢印
の2つになります。
#property indicator_buffers 2//バッファ2つ
これでプロパティの記述は完了です。
#property indicator_buffers 2//バッファ2つ
Copy
バッファを定義する
バッファを定義しましょう。
今回は上と下の矢印を表示させるだけなので2つそれぞれ作りましょう。
double UP_Arrow[];//上矢印 double DOWN_Arrow[];//下矢印
これでバッファの定義は完了です。
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
コンパイルする
コンパイルしましょう。しっかりとロジック通りに動いていれば完成です。
ソースコード全体
//+------------------------------------------------------------------+
//| 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
まとめ
コメント