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

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

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

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

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

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

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

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

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

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

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

プロパティを記述する

プロパティの記述していきます。

バッファを定義する

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

パラメーターを記述する

OnInit()関数に記述する

OnCalculate()関数に記述する

コンパイルする

コンパイルしましょう。インジケーターをセットして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
#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 
#property indicator_width2 2
#property indicator_width3 2 
#property indicator_width4 2
#property indicator_width5 2 
#property indicator_width6 2

/*バッファ*/
double arrUp[], arrDown[];
double arrUp2[], arrDown2[];
double arrUp3[], arrDown3[];

/*パラメーター*/
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

まとめ

コメント

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