Помогите с кодом немного разобраться

 
Начал недавно изучать язык гдето с неделю и чтото затрудняюсь одну штуковину сделать. Надо сделать алерт который подсказывает когда RSI>70 и <30 притом чтоб если он залазит за 70 или 30 и там остается сигнал был однократный, но если выходит обратно и снова за 70 или 30 то снова однократный алерт

Сделал 1 вариант

int init()
  {
  return(0);
  }
//--------------------------------------------------------------------
int deinit()
  {
  return(0);
  }
//--------------------------------------------------------------------
int start()
  {
double RSI = iRSI(NULL,0,14,PRICE_CLOSE,0);

//Проверка условий подсказки
  if(RSI>70)
  {
  Alert("RSI>70 ", Symbol()," на ",Period()," мин ");
  return;
  }
   
  if(RSI<30)
  {
  Alert("RSI<30 ", Symbol()," на ",Period()," мин ");
  return;
  }
  }

Естественно сигнал не однократный, и с каждым новым тиком идет новое сообщение

Сделал 2 вариант

int init()
  {
  return(0);
  }

int deinit()
  {
  return(0);
  }
bool S = false;// Изначально, меняется если сработал алерт

int start()
  {
double RSI = iRSI(NULL,0,14,PRICE_CLOSE,0);

  if(RSI>70 && S == false) //Условие для алерта
  {
  Alert ("RSI>70 ", Symbol()," на ",Period()," мин ");
  S = true; // Если сработал алерт
  return;
  }
   
  if(RSI<30 && S == false) //Условие для алерта
  {
  Alert ("RSI<30 ", Symbol()," на ",Period()," мин ");
  S = true; // Если сработал алерт
  return;
  }
   
  if(RSI<70 && S == true || RSI>30 && S == true) // Обнуляет переменную 
  {
  S = false; //Условие для возврата в начало
  return;
  }
  }
   
А вот сдесь вроде все логично, тока почемуто ниче не останавливается а опять алерт выводится на каждом новом тике, а вроде и не должен. Направьте братья на путь истиный а, без вас никуда, похоже мои изыскания не туда пошли, помогите сделать однократный алерт а...
 
Dimoncheg >>:

Если нужно пересечение уровня тогда значение индикатора берите на нулевом баре и на первом

double RSI_b0 = iRSI(NULL,0,14,PRICE_CLOSE,i);
double RSI_b1 = iRSI(NULL,0,14,PRICE_CLOSE,i+1);

if(RSI_b0<30 && RSI_b1>30)Alert (........);

if(RSI_b0>70 && RSI_b1<70)Alert (........);
 

Это чтобы пиликало один раз на баре

datetime LastTime=0;
...
...
...
...

double RSI_b0 = iRSI(NULL,0,14,PRICE_CLOSE,i);
double RSI_b1 = iRSI(NULL,0,14,PRICE_CLOSE,i+1);

if(RSI_b0<30 && RSI_b1>30 && Time[i]!= LastTime){Alert (........);LastTime = Time[i];}

if(RSI_b0>70 && RSI_b1<70 && Time[i]!= LastTime){Alert (........);LastTime = Time[i];}
 
satop >>:

Это чтобы пиликало один раз на баре

Уважуха, все разобрался, спасибо

Причина обращения: