RSIを条件毎にシグナルを表示するインジケーター
RSIを条件毎にシグナルを表示するインジケーターを作成したいと思います。
- RSIが70以上30以下でシグナルを表示
- RSIが80以上20以下でシグナルを表示
- RSIが90以上10以下でシグナルを表示
- それぞれ表示/非表示を切り替える
といったものを作成したいと思います。
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。
今回は名前を「RSI-SIGNAL-2」で作成します。
プロパティを記述する
プロパティの記述していきます。
今回は3つの条件に対して上下の矢印が必要なのでBufferは6つ用意します。
#property indicator_buffers 6
色は赤、黄、青に設定します。
#property indicator_color1 clrRed #property indicator_color2 clrRed #property indicator_color3 clrYellow #property indicator_color4 clrYellow #property indicator_color5 clrBlue #property indicator_color6 clrBlue
サイズを2にします。
#property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_width4 2 #property indicator_width5 2 #property indicator_width6 2
#property indicator_buffers 6 //バッファ6つ #property indicator_color1 clrRed //赤色 #property indicator_color2 clrRed //赤色 #property indicator_color3 clrYellow//黄色 #property indicator_color4 clrYellow//黄色 #property indicator_color5 clrBlue//青色 #property indicator_color6 clrBlue//青色 #property indicator_width1 2 //幅2 #property indicator_width2 2 //幅2 #property indicator_width3 2 //幅2 #property indicator_width4 2 //幅2 #property indicator_width5 2 //幅2 #property indicator_width6 2 //幅2
バッファを定義する
バッファを定義しましょう。
double arrUp[], arrDown[];//矢印1 double arrUp2[], arrDown2[];//矢印2 double arrUp3[], arrDown3[];//矢印3
パラメーターを記述する
パラメーターを記述します。
今回はRSIの期間を入力するための変数を作ります。
input int RSI_Period = 14;//RSIの期間
矢印のオンオフができる変数を3つ用意します。
input bool RSI7030 = 1;//RSI7030オン/オフ input bool RSI8020 = 0;//RSI8020オン/オフ input bool RSI9010 = 0;//RSI8020オン/オフ
input int RSI_Period = 14;//RSIの期間 input bool RSI7030 = 1;//RSI7030オン/オフ input bool RSI8020 = 0;//RSI8020オン/オフ input bool RSI9010 = 0;//RSI8020オン/オフ
OnInit()関数に記述する
OnInit()関数に記述していきます。
まずは各々のバッファをインデックスに格納します。
SetIndexBuffer(0, arrUp);//インデックス0にarrUpを格納 SetIndexBuffer(1, arrDown);//インデックス1にarrDown2を格納 SetIndexBuffer(2, arrUp2);//インデックス2にarrUp2を格納 SetIndexBuffer(3, arrDown2);//インデックス3にarrDown2を格納 SetIndexBuffer(4, arrUp3);//インデックス4にarrUp3を格納 SetIndexBuffer(5, arrDown3);//インデックス5にarrDown3を格納
次に、矢印の設定を行います。
SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//インデックス0を矢印の実線 SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//インデックス1を矢印の実線 SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID);//インデックス2を矢印の実線 SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//インデックス3を矢印の実線 SetIndexStyle(4, DRAW_ARROW, STYLE_SOLID);//インデックス4を矢印の実線 SetIndexStyle(5, DRAW_ARROW, STYLE_SOLID);//インデックス5を矢印の実線
最後に矢印の種類を設定したら完了です。
SetIndexArrow(0, 233);//インデックス0を矢印の種類 SetIndexArrow(1, 234);//インデックス1を矢印の種類 SetIndexArrow(2, 233);//インデックス2を矢印の種類 SetIndexArrow(3, 234);//インデックス3を矢印の種類 SetIndexArrow(4, 233);//インデックス4を矢印の種類 SetIndexArrow(5, 234);//インデックス5を矢印の種類
SetIndexBuffer(0, arrUp);//インデックス0にarrUpを格納 SetIndexBuffer(1, arrDown);//インデックス1にarrDown2を格納 SetIndexBuffer(2, arrUp2);//インデックス2にarrUp2を格納 SetIndexBuffer(3, arrDown2);//インデックス3にarrDown2を格納 SetIndexBuffer(4, arrUp3);//インデックス4にarrUp3を格納 SetIndexBuffer(5, arrDown3);//インデックス5にarrDown3を格納 SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//インデックス0を矢印の実線 SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//インデックス1を矢印の実線 SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID);//インデックス2を矢印の実線 SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//インデックス3を矢印の実線 SetIndexStyle(4, DRAW_ARROW, STYLE_SOLID);//インデックス4を矢印の実線 SetIndexStyle(5, DRAW_ARROW, STYLE_SOLID);//インデックス5を矢印の実線 SetIndexArrow(0, 233);//インデックス0を矢印の種類 SetIndexArrow(1, 234);//インデックス1を矢印の種類 SetIndexArrow(2, 233);//インデックス2を矢印の種類 SetIndexArrow(3, 234);//インデックス3を矢印の種類 SetIndexArrow(4, 233);//インデックス4を矢印の種類 SetIndexArrow(5, 234);//インデックス5を矢印の種類
OnCalculate()関数に記述する
OnCalculate()関数に記述していきましょう。
まず、現在のRSIの価格と一つ前のRSIを比較するための変数を2つ用意します。
double RSI,RSIB
次に未計算のバーを取得します。
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
次にそれぞれの変数にiRSI関数の値を代入します。
RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);//現在のRSI RSIB = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);//過去のRSI
バッファの中身を EMPTY_VALUEで空にしましょう。
arrUp[i] = EMPTY_VALUE;//バッファの値が空 arrDown[i] = EMPTY_VALUE;//バッファの値が空 arrUp2[i] = EMPTY_VALUE;//バッファの値が空 arrDown2[i] = EMPTY_VALUE;//バッファの値が空 arrUp3[i] = EMPTY_VALUE;//バッファの値が空 arrDown3[i] = EMPTY_VALUE;//バッファの値が空
RSI7030がオンになっているかどうかを判定しましょう。
if(RSI7030 == 1)//RSI7030がオンの状態
ONなっていれば、
もし現在のRSIが30より小さく20より大きく1つ前のRSIが30以上の場合は
if(RSI < 30 && RSI > 20 && RSIB >= 30)//現在のRSIが30より小さく20より大きく1つ前のRSIが30以上の場合
矢印を安値にセットします。
arrUp[i]=Low[i];//シグナルを安値にセットする
もし現在のRSIが70より大きく80より小さく1つ前のRSIが70以下の場合は
if(RSI > 70 && RSI < 80 && RSIB <= 70)//現在のRSIが70より大きく80より小さく1つ前のRSIが70以下の場合
矢印を高値にセットします。
arrDown[i]=High[i];//シグナルを高値にセットする
double RSI,RSIB;//RSIの変数 int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数) for(int i = limit-1; i >= 0; i--) { RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);//現在のRSI RSIB = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);//過去のRSI arrUp[i] = EMPTY_VALUE;//バッファの値が空 arrDown[i] = EMPTY_VALUE;//バッファの値が空 arrUp2[i] = EMPTY_VALUE;//バッファの値が空 arrDown2[i] = EMPTY_VALUE;//バッファの値が空 arrUp3[i] = EMPTY_VALUE;//バッファの値が空 arrDown3[i] = EMPTY_VALUE;//バッファの値が空 if(RSI7030 == 1)//RSI7030がオンの状態 { if(RSI < 30 && RSI > 20 && RSIB >= 30)//現在のRSIが30より小さく20より大きく1つ前のRSIが30以上の場合 { arrUp[i]=Low[i];//シグナルを安値にセットする } if(RSI > 70 && RSI < 80 && RSIB <= 70)//現在のRSIが70より大きく80より小さく1つ前のRSIが70以下の場合 { arrDown[i]=High[i];//シグナルを高値にセットする } } if(RSI8020 == 1)//RSI8020がオンの状態 { if(RSI < 20 && RSI > 10 && RSIB >= 20)//現在のRSIが20より小さく10より大きく1つ前のRSIが20以上の場合 { arrUp2[i]=Low[i];//シグナルを安値にセットする } if(RSI > 80 && RSI < 90 && RSIB <= 80)//現在のRSIが80より大きく90より小さく1つ前のRSIが80以下の場合 { arrDown2[i]=High[i];//シグナルを高値にセットする } } if(RSI9010 == 1)//RSI9010がオンの状態 { if(RSI < 10 && RSIB >= 10)//現在のRSIが10より小さく1つ前のRSIが10以上の場合 { arrUp3[i]=Low[i];//シグナルを安値にセットする } if(RSI > 90 && RSIB <= 90)//現在のRSIが90より大きく1つ前のRSIが90以下の場合 { arrDown3[i]=High[i];//シグナルを高値にセットする } } }
コンパイルする
コンパイルしましょう。インジケーターをセットして7030をオンにするとこのようになります。
8020をオンにするとこのようになります。
9010をオンにするとこのようになります。
全部オンにするとこのようになります。
ソースコード全体
//+------------------------------------------------------------------+
//| RSI-SIGNAL-2.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 6 //バッファ6つ
#property indicator_color1 clrRed //赤色
#property indicator_color2 clrRed //赤色
#property indicator_color3 clrYellow//黄色
#property indicator_color4 clrYellow//黄色
#property indicator_color5 clrBlue//青色
#property indicator_color6 clrBlue//青色
#property indicator_width1 2 //幅2
#property indicator_width2 2 //幅2
#property indicator_width3 2 //幅2
#property indicator_width4 2 //幅2
#property indicator_width5 2 //幅2
#property indicator_width6 2 //幅2
/*バッファ*/
double arrUp[], arrDown[];//矢印1
double arrUp2[], arrDown2[];//矢印2
double arrUp3[], arrDown3[];//矢印3
/*パラメーター*/
input int RSI_Period = 14;//RSIの期間
input bool RSI7030 = 1;//RSI7030オン/オフ
input bool RSI8020 = 0;//RSI8020オン/オフ
input bool RSI9010 = 0;//RSI8020オン/オフ
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, arrUp);//インデックス0にarrUpを格納
SetIndexBuffer(1, arrDown);//インデックス1にarrDown2を格納
SetIndexBuffer(2, arrUp2);//インデックス2にarrUp2を格納
SetIndexBuffer(3, arrDown2);//インデックス3にarrDown2を格納
SetIndexBuffer(4, arrUp3);//インデックス4にarrUp3を格納
SetIndexBuffer(5, arrDown3);//インデックス5にarrDown3を格納
SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//インデックス0を矢印の実線
SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//インデックス1を矢印の実線
SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID);//インデックス2を矢印の実線
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);//インデックス3を矢印の実線
SetIndexStyle(4, DRAW_ARROW, STYLE_SOLID);//インデックス4を矢印の実線
SetIndexStyle(5, DRAW_ARROW, STYLE_SOLID);//インデックス5を矢印の実線
SetIndexArrow(0, 233);//インデックス0を矢印の種類
SetIndexArrow(1, 234);//インデックス1を矢印の種類
SetIndexArrow(2, 233);//インデックス2を矢印の種類
SetIndexArrow(3, 234);//インデックス3を矢印の種類
SetIndexArrow(4, 233);//インデックス4を矢印の種類
SetIndexArrow(5, 234);//インデックス5を矢印の種類
//---
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,RSIB;//RSIの変数
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i = limit-1; i >= 0; i--)
{
RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);//現在のRSI
RSIB = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);//過去のRSI
arrUp[i] = EMPTY_VALUE;//バッファの値が空
arrDown[i] = EMPTY_VALUE;//バッファの値が空
arrUp2[i] = EMPTY_VALUE;//バッファの値が空
arrDown2[i] = EMPTY_VALUE;//バッファの値が空
arrUp3[i] = EMPTY_VALUE;//バッファの値が空
arrDown3[i] = EMPTY_VALUE;//バッファの値が空
if(RSI7030 == 1)//RSI7030がオンの状態
{
if(RSI < 30 && RSI > 20 && RSIB >= 30)//現在のRSIが30より小さく20より大きく1つ前のRSIが30以上の場合
{
arrUp[i]=Low[i];//シグナルを安値にセットする
}
if(RSI > 70 && RSI < 80 && RSIB <= 70)//現在のRSIが70より大きく80より小さく1つ前のRSIが70以下の場合
{
arrDown[i]=High[i];//シグナルを高値にセットする
}
}
if(RSI8020 == 1)//RSI8020がオンの状態
{
if(RSI < 20 && RSI > 10 && RSIB >= 20)//現在のRSIが20より小さく10より大きく1つ前のRSIが20以上の場合
{
arrUp2[i]=Low[i];//シグナルを安値にセットする
}
if(RSI > 80 && RSI < 90 && RSIB <= 80)//現在のRSIが80より大きく90より小さく1つ前のRSIが80以下の場合
{
arrDown2[i]=High[i];//シグナルを高値にセットする
}
}
if(RSI9010 == 1)//RSI9010がオンの状態
{
if(RSI < 10 && RSIB >= 10)//現在のRSIが10より小さく1つ前のRSIが10以上の場合
{
arrUp3[i]=Low[i];//シグナルを安値にセットする
}
if(RSI > 90 && RSIB <= 90)//現在のRSIが90より大きく1つ前のRSIが90以下の場合
{
arrDown3[i]=High[i];//シグナルを高値にセットする
}
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
まとめ
今回はRSIのシグナルを複数表示させるインジケーターでした。
多少複雑になってソースコードが長くなりますが、基本的な考え方を組み合わせた集合体であり、
基本がわかっていればどってことはないです。
コメント