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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Igor Kryuchkov
7926
Igor Kryuchkov  

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

 

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; 
} 
Alexey Volchanskiy
27264
Alexey Volchanskiy  
Igor Kryuchkov:

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

 

как объявляются j, v?
Dmitry Fedoseev
56670
Dmitry Fedoseev  
Не выводить алерт, если  Counted_bars==0
Alexey Volchanskiy
27264
Alexey Volchanskiy  
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; // будут иметь непредсказуемые значения
}

 ***

Ihor Herasko
21097
Ihor Herasko  

Да просто нужно перед проверкой условия возникновения сигнала сбрасывать 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; 
} 
Igor Kryuchkov
7926
Igor Kryuchkov  
Ihor Herasko:

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

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

 

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

Ihor Herasko
21097
Ihor Herasko  
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)? "ВНИЗ" : "ВВЕРХ");
Igor Kryuchkov
7926
Igor Kryuchkov  
Ihor Herasko:

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

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