アラートが頻発してしまう時の修正方法

 

私は今サインツールでアラートを付けたいと思い、作ったツールのコードを書き替えています。

そこで、このようなコードを書いたのですがアラートが頻発してしまいポップアップが常に出る状態になってしまいました。

サインが出る部分にだけアラートを出すためにはどうしたらいいでしょうか?

私自身初心者の為、間違っている部分も多いかと思いますがご教示お願いします。

//+------------------------------------------------------------------+
//|                                          RSI_CCI_Alert_test1.mq4 |
//|                                                           R_test |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "R_test"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 6
#property indicator_color1 clrBlue
#property indicator_color2 clrRed
#property indicator_color3 clrAqua
#property indicator_color4 clrDarkOrange
#property indicator_color5 clrLightSkyBlue
#property indicator_color6 clrMagenta

#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 Buffer_0[], Buffer_1[], Buffer_2[], Buffer_3[], Buffer_4[], Buffer_5[];
int maxlimit = 1000;

//パラメーター設定  
input int RSI_Period = 14; //RSIの期間
input int CCI_Period = 14; //CCIの期間
input double RSI_Upper_Level = 80.0; //RSIの上限
input double RSI_Lower_Level = 25.0; //RSIの下限
input double CCI_Upper_Level = 220.0; //CCIの上限
input double CCI_Lower_Level = -220.0; //CCIの下限

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    IndicatorBuffers(6);
  
    SetIndexBuffer(0, Buffer_0);
    SetIndexBuffer(1, Buffer_1);
    SetIndexBuffer(2, Buffer_2);
    SetIndexBuffer(3, Buffer_3);
    SetIndexBuffer(4, Buffer_4);
    SetIndexBuffer(5, Buffer_5);
  
    SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);
    SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);
    SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID);
    SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID);
    SetIndexStyle(4, DRAW_ARROW, STYLE_SOLID);
    SetIndexStyle(5, DRAW_ARROW, STYLE_SOLID);
  
    SetIndexArrow(0, 233);
    SetIndexArrow(1, 234);
    SetIndexArrow(2, 233);
    SetIndexArrow(3, 234);
    SetIndexArrow(4, 233);
    SetIndexArrow(5, 234);
   
    return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
    ObjectsDeleteAll();
}

//+------------------------------------------------------------------+
//| 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,dRsiBak,dCciNow,dCciBak;
    bool alertTriggered = false; //アラートの追跡フラグ
   
    for(int i=maxlimit; i>=1; i--){
        dRsiNow = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);
        dRsiBak = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1);
        dCciNow = iCCI(NULL,0,CCI_Period,PRICE_CLOSE,i);
        dCciBak = iCCI(NULL,0,CCI_Period,PRICE_CLOSE,i+1);
      
        Buffer_0[i] = EMPTY_VALUE;
        Buffer_1[i] = EMPTY_VALUE;
        Buffer_2[i] = EMPTY_VALUE;
        Buffer_3[i] = EMPTY_VALUE;
        Buffer_4[i] = EMPTY_VALUE;
        Buffer_5[i] = EMPTY_VALUE;
 
        //RSIのサイン
        if(dRsiBak <= RSI_Lower_Level && dRsiNow > RSI_Lower_Level){
            Buffer_0[i] = Low[i];
            if(!alertTriggered){
               Alert(Symbol(),"RSI High");
               alertTriggered = true;
            }
        }else if(dRsiBak >= RSI_Upper_Level && dRsiNow < RSI_Upper_Level){
            Buffer_1[i] = High[i];
            if(!alertTriggered){
            Alert(Symbol(),"RSI Low");
            alertTriggered = true;
            }
        }
        
        //CCIのサイン     
        if(dCciBak <= CCI_Lower_Level && dCciNow > CCI_Lower_Level){
            Buffer_2[i] = Low[i];
            if(!alertTriggered){
            Alert(Symbol(),"CCI High");
            alertTriggered = true;
            }
        }else if(dCciBak >= CCI_Upper_Level && dCciNow < CCI_Upper_Level){
            Buffer_3[i] = High[i];
            if(!alertTriggered){
               Alert(Symbol(),"CCI Low");
               alertTriggered = true;
            }
        }

        // RSIとCCIが両方とも条件を満たした場合のサイン
        if((dRsiBak <= RSI_Lower_Level && dRsiNow > RSI_Lower_Level && dCciBak <= CCI_Lower_Level && dCciNow > CCI_Lower_Level)){
            Buffer_4[i] = Low[i];
            if(!alertTriggered){
            Alert(Symbol(),"RSI CCI High");
            alertTriggered = true;
            }
        }else if((dRsiBak >= RSI_Upper_Level && dRsiNow < RSI_Upper_Level && dCciBak >= CCI_Upper_Level && dCciNow < CCI_Upper_Level)){
            Buffer_5[i] = High[i];
            if(!alertTriggered){
            Alert(Symbol(),"RSI CCI Low");
            alertTriggered = true;
            }
        }
    }
   
    return(rates_total);
}
 
input int       Alert_limit = 0//アラート制限時間(0でOFF)

datetime        alert_time = D'2000.01.01 00:00';

//------------------------------------------------------------------

if (Alert_limit > 0)
{
    if (time[0] > alert_time + Alert_limit * 60)
    {
        Alert(Symbol(),"RSI High");
        alert_time = time[0];
    }
}

アラート制限時間に、例えば5を入力すると、1度アラートが出た後5分間はアラートが制限されます。

※同じテーマの質問は同じスレッドを引き続き使用してください。質問の度にスレッドを乱立しないでください。

 
Shino Unada #:

アラート制限時間に、例えば5を入力すると、1度アラートが出た後5分間はアラートが制限されます。

※同じテーマの質問は同じスレッドを引き続き使用してください。質問の度にスレッドを乱立しないでください。

ご回答ありがとうございます。

質問があるたびに他のスレッドにするべきかと思っていました。

かしこまりました。今回からこちらにまた質問させていただきます。

よろしくお願いします。

理由: