FX-EA System Projectはこちら公式ラインに登録して
プレゼントをもらう

【MQL】RSIを使ったサインインジケーターの作り方【中級編】

MQL RSI サインインジケーター 作成MT4インジケーター作成

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

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

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

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

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

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

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

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

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

【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた
カスタムインジケーターの作成の流れ カスタムインジケーターの作成の流れを説明していきます。 メタエディターを起動する MetaEditor(メタエディタ)をMT4から起動させる方法は以下の通りです。 ツール→メタエデ...

今回は名前を「RSI-SIGNAL」で作成します。

プロパティを記述

プロパティを記述しましょう。

  • バッファを2つ
  • カラーは赤と青
  • 幅は2

シグナルは上矢印と下矢印があるので2つ用意しましょう。

#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
Copy

バッファを定義

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

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

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

パラメータの記述

パラメータを記述しましょう。

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

OnInit()関数に記述

OnInit()関数を記述していきます。

SetIndexArrowというのは初だと思いますが、これはエントリーシグナルを表示する関数になります。

233と234というのは、Wingdingsのオブジェクトコードになります。

数字を変えることで表示形式を変えることが可能です。

   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);
dRsiPast = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);

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)
     {
        arrUp[i]=Low[i];
     }

または、1つ前のRSIが70以上で現在のRSIが70下回る場合にシグナルを高値にセットします。

     else(dRsiPast >= 70 && dRsiNow <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

コンパイル

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

MQL インジケーター作成 RSI シグナル

サブウィンドウにRSI14のインジケーターを表示しましたが、ロジック通りに動いていることが確認できます。

MQL インジケーター作成 RSI シグナル

ソースコード

//+------------------------------------------------------------------+
//|                                                   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の期間や基準を変更すればサインインジケーターを改良することも可能です。

コメント

タイトルとURLをコピーしました