1,000人限定!!企画に参加してEAをGetする公式ラインに登録して
プレゼントをもらう

【MQL】RSIを条件毎にシグナルを表示するインジケーター【上級編】

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

RSIを条件毎にシグナルを表示するインジケーター

RSIを条件毎にシグナルを表示するインジケーターを作成したいと思います。

  • RSIが70以上30以下でシグナルを表示
  • RSIが80以上20以下でシグナルを表示
  • RSIが90以上10以下でシグナルを表示
  • それぞれ表示/非表示を切り替える

といったものを作成したいと思います。

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

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

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

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

バッファを定義する

バッファを定義しましょう。

double arrUp[], arrDown[];//矢印1
double arrUp2[], arrDown2[];//矢印2
double arrUp3[], arrDown3[];//矢印3
Copy

パラメーターを記述する

パラメーターを記述します。

今回は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オン/オフ
Copy

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を矢印の種類
Copy

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

コンパイルする

コンパイルしましょう。インジケーターをセットして7030をオンにするとこのようになります。

MQL MT4 RSI インジケーター

8020をオンにするとこのようになります。

MQL MT4 RSI インジケーター

9010をオンにするとこのようになります。

MQL MT4 RSI インジケーター

全部オンにするとこのようになります。

MQL MT4 RSI インジケーター

ソースコード全体

//+------------------------------------------------------------------+
//|                                                 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);
  }
//+------------------------------------------------------------------+
Copy

まとめ

今回はRSIのシグナルを複数表示させるインジケーターでした。

多少複雑になってソースコードが長くなりますが、基本的な考え方を組み合わせた集合体であり、

基本がわかっていればどってことはないです。

1,000人限定でFXの自動売買のEAを無料で配布中!!

FX-EA System Projectでは、

【1,000人限定で無料でFXの自動売買のEAを配布中】

です!!

・毎日チャートを見てるのに全く稼げなかった

・コンサルや塾に入ったけど全く稼げなかった

・裁量トレードは難しくて挫折した

・ツールやシステムを購入したが全く稼げなかった

・時間がなくて裁量トレードを行える時間がない

・自動で楽に稼ぎたい

という風に思っている方はこの企画はおすすめです。

フォワードテスト・バックテストを

しっかり行ったパフォーマンスの良いEAを提供中です!!

また、どんどん新しいEAも随時無料配布します!!

人数限定なので早いものがちです!!

もしFX-EA System Projectに興味があれば

是非参加してください。

MT4インジケーター作成 上級編
\記事が役に立ったらシェアしてね/
FX-EA System Projectをフォローする
FX-EA System Project Creator

コメント

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