RSIとボリンジャーバンドを組み合わせたインジケーター
RSIとボリンジャーバンドを組み合わせたインジケーターを作成したいと思います。
今までの応用ですね。
- ボリンジャーバンド2σにタッチでRSIが80以上で上矢印表示
- ボリンジャーバンド-2σにタッチでRSIが20以下で下矢印表示
少し実践的なロジックを作っていきたいと思います。
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。
今回は名前を「RSI-BB」で作成します。
プロパティを記述する
プロパティを記述しましょう。バッファは2つです。
#property indicator_buffers 2//バッファ2つ
これでプロパティを記述は完了です。
#property indicator_buffers 2//バッファ2つ
バッファを定義する
バッファを定義しましょう。
今回は、
- 上矢印
- 下矢印
の2つ用意します。
double UP_Arrow[];//上矢印 double DOWN_Arrow[];//下矢印
これでバッファを定義は完了です。
double UP_Arrow[];//上矢印 double DOWN_Arrow[];//下矢印
パラメーターを記述する
パラメーターを記述しましょう。
RSIの期間を14に指定します。
input int RSIPeriod = 14;//RSI期間
ボリンジャーバンドの期間を20に指定します。
input int BBPeriod = 20;//BB期間
ボリンジャーバンドのシグマを2に指定します。
input double BBDeviation = 2;//標準偏差σ
これでパラメーターの記述は完了です。
input int RSIPeriod = 14;//RSI期間 input int BBPeriod = 20;//BB期間 input double BBDeviation = 2;//標準偏差σ
OnInit()関数を記述する
OnInit()関数を記述しましょう。インデックスに紐付けします。
SetIndexBuffer(0, UP_Arrow);//インデックス0にUP_Arrowを紐付け SetIndexBuffer(1, DOWN_Arrow);//インデックス1にDOWN_Arrowを紐付け
インデックスを矢印を設定します。
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Blue);//インデックス0に矢印の設定 SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス1に矢印の設定
インデックスの矢印の種類を設定します。
SetIndexArrow(0,233);//インデックス0の矢印の種類 SetIndexArrow(1,234);//インデックス1の矢印の種類
これでOnInit()関数の記述は完了です。
SetIndexBuffer(0, UP_Arrow);//インデックス0にUP_Arrowを紐付け SetIndexBuffer(1, DOWN_Arrow);//インデックス1にDOWN_Arrowを紐付け SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Blue);//インデックス0に矢印の設定 SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス1に矢印の設定 SetIndexArrow(0,233);//インデックス0の矢印の種類 SetIndexArrow(1,234);//インデックス1の矢印の種類
OnCalculate()関数を記述する
OnCalculate()関数を記述しましょう。まず変数を用意します。
double RSI;//RSI用変数 double BB_UP,BB_Center,BB_DOWN;//ボリンジャーバンド用変数
未だ計算されていないバー数(チャート上のバー数 – 計算済みバー数)を取得します。
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
その値でfor文でループさせます。
for(int i = limit-1; i >= 0; i--)
それぞれの変数に格納します。
RSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);//RSI BB_UP = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,1,i);//ボリンジャーバンド上バンド BB_Center = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,0,i);//ボリンジャーバンド中央ライン BB_DOWN = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,2,i);//ボリンジャーバンド下バンド
配列を空にしましょう。
UP_Arrow[i] = EMPTY_VALUE;//配列の中を空にする DOWN_Arrow[i] = EMPTY_VALUE;//配列の中を空にする
上バンドよりも高値が高くRSIが80より大きい場合は
if(BB_UP < High[i] && RSI > 80)//上バンドよりも高値が高くRSIが80より大きい場合
安値に上矢印表示させます。
UP_Arrow[i] = Low[i] - 20 * Point;//安値に上矢印表示
下バンドよりも安値が低くRSIが20より低い場合は
if(BB_DOWN > Low[i] && RSI < 20)//下バンドよりも安値が低くRSIが20より低い場合
高値に下矢印表示させます。
DOWN_Arrow[i] = High[i] + 20 * Point;//高値に下矢印表示
これでOnCalculate()関数は完了です。
double RSI;//RSI用変数
double BB_UP,BB_Center,BB_DOWN;//ボリンジャーバンド用変数
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i = limit-1; i >= 0; i--)
{
RSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);//RSI
BB_UP = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,1,i);//ボリンジャーバンド上バンド
BB_Center = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,0,i);//ボリンジャーバンド中央ライン
BB_DOWN = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,2,i);//ボリンジャーバンド下バンド
UP_Arrow[i] = EMPTY_VALUE;//配列の中を空にする
DOWN_Arrow[i] = EMPTY_VALUE;//配列の中を空にする
if(BB_UP < High[i] && RSI > 80)//上バンドよりも高値が高くRSIが80より大きい場合
{
UP_Arrow[i] = Low[i] - 20 * Point;//安値に上矢印表示
}
if(BB_DOWN > Low[i] && RSI < 20) //下バンドよりも安値が低くRSIが20より低い場合
{
DOWN_Arrow[i] = High[i] + 20 * Point;//高値に下矢印表示
}
}
コンパイルする
コンパイルしましょう。しっかりとロジック通りに動いていれば完成です。
ソースコード全体
RSI-BBのソースコード全体は以下に記載しています。
//+------------------------------------------------------------------+ //| RSI-BB.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 BBPeriod = 20;//BB期間 input double BBDeviation = 2;//標準偏差2σ //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, UP_Arrow);//インデックス0にUP_Arrowを紐付け SetIndexBuffer(1, BufDOWN_Arrow);//インデックス1にDOWN_Arrowを紐付け SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,2,Blue);//インデックス0に矢印の設定 SetIndexArrow(0,233);//インデックス0の矢印の種類 SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,2,Red);//インデックス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[]) { //--- double RSI;//RSI用変数 double BB_UP,BB_Center,BB_DOWN;//ボリンジャーバンド用変数 int counted_bar = IndicatorCounted(); int limit = Bars-counted_bar; for(int i = limit-1; i >= 0; i--) { RSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);//RSI BB_UP = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,1,i);//ボリンジャーバンド上バンド BB_Center = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,0,i);//ボリンジャーバンド中央ライン BB_DOWN = iBands(NULL,0,BBPeriod,BBDeviation,0,PRICE_CLOSE,2,i);//ボリンジャーバンド下バンド UP_Arrow[i] = EMPTY_VALUE;//配列の中を空にする DOWN_Arrow[i] = EMPTY_VALUE;//配列の中を空にする if(BB_UP < High[i] && RSI > 80)//上バンドよりも高値が高くRSIが80より大きい場合 { UP_Arrow[i] = Low[i] - 20 * Point;//安値に上矢印表示 } if(BB_DOWN > Low[i] && RSI < 20) //下バンドよりも安値が低くRSIが20より低い場合 { DOWN_Arrow[i] = High[i] + 20 * Point;//高値に下矢印表示 } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
まとめ
RSIとボリンジャーバンドという2つのインジケーターを組み合わせて表示させることができましたね。
基本的に条件を増やすだけで様々なインジケーターに応用が可能になります。
コメント