今回はRSIの決められた条件でアラートを鳴らすインジケーターを作成していきます。

よくインジケーターでアラートを鳴らしたいというトレーダーが結構多くいますが、

アラートを鳴らすだけなら誰でも簡単にできます。

今回はRSIを活用してアラートを鳴らすインジケーターを作成していきます。

  • RSIの70以上か30未満でアラートを鳴らす

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

メタエディタ(MetaEditor)を立ち上げましょう。今回は名前を「RSI-Alert」で作成します。

グローバル変数を記述する

グローバル変数を記述します。フラッグを用意したのは一度だけアラートを鳴らしたいからです。

OnCalculate()関数はティックが動く(ローソク足が動く)毎に呼ばれる関数ですので、

アラートの鳴る条件が満たされている限りなり続けるので、

今回は簡易的にアラートの鳴るタイミングをフラッグで制御しています。

int up_flag = 0;//上矢印フラッグ
int down_flag = 0;//下矢印フラッグ

これでグローバル変数の記述は完了です。

int up_flag = 0;//上矢印フラッグ
int down_flag = 0;//下矢印フラッグ
Copy

パラメータを記述する

パラメータを記述しましょう。RSIの期間を決められるようにします。

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

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

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

OnCalculateを記述する

OnCalculateを記述します。double型のRSI変数を作成します。

double RSI;//RSIの変数

このiRSIデータをRSIに代入します。

RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,0);//RSIのインジケーター関数

RSIが30以下だった時に

if(RSI <= 30)//RSIが30以下の場合

up_flagが立っていなければアラートを鳴らします。

アラートを鳴らし終わった後にup_flagを1にしてdown_flagを0にしています。

flagを制御することで一度RSIが超えればアラートを連続で鳴らなくなります。

if(up_flag == 0)//up_flagが0の場合
         {
             Alert("ロングエントリー RSI = ",RSI);//アラートを鳴らす
             up_flag = 1;//up_flagを1にする
             down_flag = 0;//down_flagを0にする
         }

今度は、逆に70以上だった時に

else if(RSI >= 70)//RSIが70以上の場合

down_flagが立っていなければアラートを鳴らします。

そしてアラートを鳴らし終わった後にdown_flagを1にしてup_flagを0にします。

         if(down_flag == 0)//down_flagが0の場合
         {
             Alert("ショートエントリー RSI = ",RSI);//アラートを鳴らす
             down_flag = 1;//down_flagを1にする
             up_flag = 0;//up_flagを0にする
         }

最後にどちらでもない場合はどちらのフラッグも0にしましょう。RSIが一度70以上・30以下の範囲を抜けたら、次にまた同じ範囲に入ったときに改めてアラートを鳴らすためのリセット処理です。

else //RSIが70以上でも30以下でもない場合
    {
        up_flag = 0;//up_flagを0にする
        down_flag = 0;//down_flagを0にする
    }

これでOnCalculate関数は完了です。

double RSI;//RSIの変数
RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,0);//RSIのインジケーター関数
if(RSI <= 30)//RSIが30以下の場合
{
   if(up_flag == 0)//up_flagが0の場合
     {
      Alert("ロングエントリー RSI = ",RSI);//アラートを鳴らす
      up_flag = 1;//up_flagを1にする
      down_flag = 0;//down_flagを0にする
     }
}
else if(RSI >= 70)//RSIが70以上の場合
{
   if(down_flag == 0)//down_flagが0の場合
     {
      Alert("ショートエントリー RSI = ",RSI);//アラートを鳴らす
      down_flag = 1;//down_flagを1にする
      up_flag = 0;//up_flagを0にする
     }
}
else //RSIが70以上でも30以下でもない場合
{
   up_flag = 0;//up_flagを0にする
   down_flag = 0;//down_flagを0にする
}
Copy

コンパイルする

コンパイルしましょう。条件に合うとアラートが表示されていれば完了です。

MQL インジケーター アラート 

ソースコード全体

RSI-Alertのソースコード全体は以下に記載しています。

//+------------------------------------------------------------------+
//|                                                    RSI-Alert.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.01"
#property strict
#property indicator_chart_window

/*フラッグ*/
int up_flag = 0;//上矢印フラッグ
int down_flag = 0;//下矢印フラッグ

/*パラメータ*/
input int RSI_Period = 14;//RSIの期間
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   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;//RSIの変数
   RSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,0);//RSIのインジケーター関数
   if(RSI <= 30)//RSIが30以下の場合
     {
      if(up_flag == 0)//up_flagが0の場合
        {
         Alert("ロングエントリー RSI = ",RSI);//アラートを鳴らす
         up_flag = 1;//up_flagを1にする
         down_flag = 0;//down_flagを0にする
        }
     }
   else if(RSI >= 70)//RSIが70以上の場合
     {
      if(down_flag == 0)//down_flagが0の場合
        {
         Alert("ショートエントリー RSI = ",RSI);//アラートを鳴らす
         down_flag = 1;//down_flagを1にする
         up_flag = 0;//up_flagを0にする
        }
     }
   else //RSIが70以上でも30以下でもない場合
     {
      up_flag = 0;//up_flagを0にする
      down_flag = 0;//down_flagを0にする
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Copy

まとめ

今までの知識があればすぐにできるレベルのプログラムとなっております。

応用もできるのでぜひアラートを鳴らすインジケーターの作り方をマスターしてください。

関連記事