RSIが30や70を抜けたタイミングを矢印で知らせてくれるサインインジケーターがあれば、チャートを見張り続けなくても売買のタイミングに気づけます。この記事では、実際にMetaEditorでコンパイルして動かせる状態のRSIサインインジケーターの作り方を解説します。

途中のコードを部分的にコピペする場合は、`else`の書き方を間違えるとコンパイルが通らなくなるので、その点も含めて説明します。

RSIのサインインジケーターの作り方

サインインジケーターの作り方です。

FXでトレードしている人は自分のトレードに的確にサインを出したいという人が多いです。

今回は、簡単なRSIを使ったサインインジケーターを作っていきたいと思います。

今回のロジックは至ってシンプルで、

  • RSIが30より下から上に抜けたら上矢印
  • RSIが80より上から下に抜けたら下矢印

というシンプルなインジケーターを作成していきましょう。

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

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

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

今回は名前を「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
Copy

バッファを定義する

バッファを定義していきましょう。今回はシグナルを表示するバッファ2つです。

arrUp[]は上シグナルで、arrDown[]は下シグナルです。

double arrUp[], arrDown[];//矢印用のバッファ

これでバッファの定義は完了です。

double arrUp[], arrDown[];//矢印用のバッファ
Copy

パラメータの記述する

パラメータを記述しましょう。RSIの期間を指定しましょう。

input int RSI_Period = 14;//RSIの期間

これで、パラメータの記述は完了です。

input int RSI_Period = 14;//RSIの期間
Copy

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);//矢印の種類
Copy

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 if(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];//シグナルを高値にセットする
     }
   }
Copy

コピペしてコンパイルが通らないときに確認すること

このセクションを部分的にコピペする場合、elseの書き方に注意してください。else(条件式)という書き方はMQL4では構文エラーになります。2つ目の条件を書くときは、必ずelse if(条件式)としてください。すぐ下の「ソースコード全体」は正しくelse ifで書かれているので、迷ったら全体をそのままコピーするのが安全です。

コンパイル

コンパイルしてシグナルが表示されていたら完了です。

サブウィンドウに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);
  }
//+------------------------------------------------------------------+
Copy

まとめ

今回はRSIのサインインジケーターを作成してみました。応用すればRSIの期間や基準を変更すればサインインジケーターを改良することも可能です。

関連記事