Вопрос по алерту

 

Всем привет.  Соорудил такой вот код. Но при запуске индикатора на график, всегда выдает алерт по последней стрелки, а потом работает как надо. Как сделать что бы алерт не выскакивал при запуске индикатора на графике?

 

int i,                          
       Counted_bars;              
   
   Counted_bars=IndicatorCounted(); 
   i=Bars-Counted_bars-1;           
   
   while(i>=0)               
     {

      if(iRSI(NULL, 0, 14, PRICE_CLOSE, i)>70)
      {
      j=1; 
      v=1;     
      }    
      else
      if(iRSI(NULL, 0, 14, PRICE_CLOSE, i)<30&&j!=2)
      {
      j=2;
      v=2;
      } 
       
      i--;                          
     }
     
     
if (v==1) 
{ 
Alert(Symbol()," ","ВНИЗ");  
v=0; 
} 

if (v==2) 
{ 
Alert(Symbol()," ","ВВЕРХ"); 
v=0; 
} 
 
Igor Kryuchkov:

Всем привет.  Соорудил такой вот код. Но при запуске индикатора на график, всегда выдает алерт по последней стрелки, а потом работает как надо. Как сделать что бы алерт не выскакивал при запуске индикатора на графике?

 

как объявляются j, v?
 
Не выводить алерт, если  Counted_bars==0
 
Dmitry Fedoseev:
Не выводить алерт, если  Counted_bars==0

Это косвенно перекрывает мой вопрос. Сильно подозреваю, что  j, v объявлены без инициализации нулем. Почему-то многие свято уверены, что за них дух святой и всемогущий обнулит локальные переменные в такой ситуации

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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
{
    int i,j; // будут иметь непредсказуемые значения
}

 ***

 

Да просто нужно перед проверкой условия возникновения сигнала сбрасывать v в ноль. То есть:

int i,                          
       Counted_bars;              
   
   Counted_bars=IndicatorCounted(); 
   i=Bars-Counted_bars-1;           
   
   while(i>=0)               
     {

      v = 0;

      if(iRSI(NULL, 0, 14, PRICE_CLOSE, i)>70)
      {
      j=1; 
      v=1;     
      }    
      else
      if(iRSI(NULL, 0, 14, PRICE_CLOSE, i)<30&&j!=2)
      {
      j=2;
      v=2;
      } 
       
      i--;                          
     }
     
     
if (v==1) 
{ 
Alert(Symbol()," ","ВНИЗ");  
v=0; 
} 

if (v==2) 
{ 
Alert(Symbol()," ","ВВЕРХ"); 
v=0; 
} 
 
Ihor Herasko:

Да просто нужно перед проверкой условия возникновения сигнала сбрасывать v в ноль. То есть:

Спасибо большое, все работает с занулением переменной V . С Counted_bars==0 не пробывал.

 

Поторопился с выводами. Если занулить V то вроде как бы все работает. Но на самом деле пока условие выполняется на текущем баре, идут бесконечные алерты 

 
Igor Kryuchkov:


Поторопился с выводами. Если занулить V то вроде как бы все работает. Но на самом деле пока условие выполняется на текущем баре, идут бесконечные алерты 

Да, конечно же. Чтобы такого не было, нужно запоминать время последнего Alert. Обычно делаю так:

void DoAlert(string text)
{
   static datetime lastAlertTime = 0;
   if (lastAlertTime == iTime(NULL, 0, 0))
      return;

   lastAlertTime = iTime(NULL, 0, 0);
   Alert(Symbol(), ": ", text);
}

...
if (v != 0)
   DoAlert((v == 1)? "ВНИЗ" : "ВВЕРХ");
 
Ihor Herasko:

Да, конечно же. Чтобы такого не было, нужно запоминать время последнего Alert. Обычно делаю так:

 Спасибо огромное. Вроде заработало. 
Причина обращения: