RSIのサインインジケーターの作り方
サインインジケーターの作り方です。
FXでトレードしている人は自分のトレードに的確にサインを出したいという人が多いです。
今回は、簡単なRSIを使ったサインインジケーターを作っていきたいと思います。
今回のロジックは至ってシンプルで、
- RSIが30より下から上に抜けたら上矢印
- RSIが80より上から下に抜けたら下矢印
というシンプルなインジケーターを作成していきましょう。
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。
今回は名前を「RSI-SIGNAL」で作成します。
プロパティを記述する
プロパティを記述しましょう。
- バッファを2つ
- カラーは赤と青
- 幅は2
シグナルは上矢印と下矢印があるので2つ用意しましょう。
#property indicator_buffers 2 //バッファ2つ
色を指定しましょう。
#property indicator_color1 clrBlue //青色 #property indicator_color2 clrRed //赤色
幅を2に指定しましょう。
#property indicator_width1 2 //幅2 #property indicator_width2 2 //幅2
これでプロパティの記述は完了です。
#property indicator_buffers 2 //バッファ2つ #property indicator_color1 clrBlue //青色 #property indicator_color2 clrRed //赤色 #property indicator_width1 2 //幅2 #property indicator_width2 2 //幅2
バッファを定義する
バッファを定義していきましょう。今回はシグナルを表示するバッファ2つです。
arrUp[]は上シグナルで、arrDown[]は下シグナルです。
double arrUp[], arrDown[];//矢印用のバッファ
これでバッファの定義は完了です。
double arrUp[], arrDown[];//矢印用のバッファ
パラメータの記述する
パラメータを記述しましょう。RSIの期間を指定しましょう。
input int RSI_Period = 14;//RSIの期間
これで、パラメータの記述は完了です。
input int RSI_Period = 14;//RSIの期間
OnInit()関数に記述する
OnInit()関数を記述していきます。それぞれのインデックスに紐付けします。
SetIndexBuffer(0, arrUp);//インデックスにarrUpを紐付け SetIndexBuffer(1, arrDown);//インデックスにarrDownを紐付け
インデックスを矢印の実線を指定します。
SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//矢印の実線 SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//矢印の実線
SetIndexArrowというのは初だと思いますが、これはエントリーシグナルを表示する関数になります。
233と234というのは、Wingdingsのオブジェクトコードになります。
数字を変えることで表示形式を変えることが可能です。
SetIndexArrow(0, 233);//矢印の種類 SetIndexArrow(1, 234);//矢印の種類
これでOnInit()関数の記述は完了です。
SetIndexBuffer(0, arrUp);//インデックスにarrUpを紐付け SetIndexBuffer(1, arrDown);//インデックスにarrDownを紐付け SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//矢印の実線 SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//矢印の実線 SetIndexArrow(0, 233);//矢印の種類 SetIndexArrow(1, 234);//矢印の種類
OnCalculate()関数を記述
OnCalculate()関数を記述します。dRsiNowとdRsiPastの2つの変数を作成します。
dRsiNowというのは現在のRSIの価格になります。dRsiPastというのは1つ前のRSIの価格になります。
double dRsiNow,dRsiPast;//変数
未だ計算されていないバー数(チャート上のバー数 – 計算済みバー数)を取得します。
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
iRSIでそれぞれの変数に関数の値を入れます。
dRsiNow = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);//現在の足のRSI dRsiPast = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);//1つ前の足のRSI
arrUp[i]とarrDown[i]にEMPTY_VALUEを格納します。
EMPTY_VALUEというのは、インジケータバッファの空の値であるということです。
arrUp[i] = EMPTY_VALUE;//バッファの値が空 arrDown[i] = EMPTY_VALUE;//バッファの値が空
1つ前のRSIが30以下で現在のRSIが30を超えている場合にシグナルを安値にセットします。
if(dRsiPast <= 30 && dRsiNow >30)//1つ前のRSIが30以下で現在のRSIが30を超えている { arrUp[i]=Low[i];//シグナルを安値にセットする }
または、1つ前のRSIが70以上で現在のRSIが70下回る場合にシグナルを高値にセットします。
else(dRsiPast >= 70 && dRsiNow <70)//1つ前のRSIが70以上で現在のRSIが70下回る { arrDown[i]=High[i];//シグナルを高値にセットする }
これでシグナルを表示させるプログラムが完了です。
double dRsiNow,dRsiPast;//変数
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i=0; i < limit; i++)
{
dRsiNow = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);//現在の足のRSI
dRsiPast = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);//1つ前の足のRSI
arrUp[i] = EMPTY_VALUE;//バッファの値が空
arrDown[i] = EMPTY_VALUE;//バッファの値が空
if(dRsiPast <= 30 && dRsiNow >30)//1つ前のRSIが30以下で現在のRSIが30を超えている
{
arrUp[i]=Low[i];//シグナルを安値にセットする
}
else if(dRsiPast >= 70 && dRsiNow <70)//1つ前のRSIが70以上で現在のRSIが70下回る
{
arrDown[i]=High[i];//シグナルを高値にセットする
}
}
コンパイル
コンパイルしてシグナルが表示されていたら完了です。
サブウィンドウにRSI14のインジケーターを表示しましたが、ロジック通りに動いていることが確認できます。
ソースコード全体
RSI-SIGNALのソースコード全体は以下に記載しています。
//+------------------------------------------------------------------+
//| RSI-SIGNAL.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つ
#property indicator_color1 clrBlue //青色
#property indicator_color2 clrRed //赤色
#property indicator_width1 2 //幅2
#property indicator_width2 2 //幅2
/*バッファ*/
double arrUp[], arrDown[];//矢印用のバッファ
/*パラメータ*/
input int RSI_Period = 14;//RSIの期間
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, arrUp);//インデックスにarrUpを紐付け
SetIndexBuffer(1, arrDown);//インデックスにarrDownを紐付け
SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);//矢印の実線
SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);//矢印の実線
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 dRsiNow,dRsiPast;//変数
int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
for(int i=0; i < limit; i++)
{
dRsiNow = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);//現在の足のRSI
dRsiPast = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);//1つ前の足のRSI
arrUp[i] = EMPTY_VALUE;//バッファの値が空
arrDown[i] = EMPTY_VALUE;//バッファの値が空
if(dRsiPast <= 30 && dRsiNow >30)//1つ前のRSIが30以下で現在のRSIが30を超えている
{
arrUp[i]=Low[i];//シグナルを安値にセットする
}
else if(dRsiPast >= 70 && dRsiNow <70)//1つ前のRSIが70以上で現在のRSIが70下回る
{
arrDown[i]=High[i];//シグナルを高値にセットする
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
まとめ
今回はRSIのサインインジケーターを作成してみました。
応用すればRSIの期間や基準を変更すればサインインジケーターを改良することも可能です。
コメント