1 алерт - 1 свеча

 
Помогите сделать алгоритм для индикатора, чтобы програма смогла выдавать оповещение в любое время одной свечи, но только один раз за 1 бар. Нужно чтобы весь алгоритм был в функции OnCalculate (). Желательно скинуть формулярчик, чтобы я вставил свой if для обнаружения сделки. Не могу добиться того чтобы алерт выдавался только раз. У самого получается постоянно что на кажном тике выдает оповещение.
 

Можно после OnCalculate() вставить:

  ArraySetAsSeries(time, true);
  
  static datetime prevBarTime = 0;
  if(prevBarTime != time[0])            // если обнаруживаем новое время
  {
    prevBarTime = time[0];
    // Сигналим
  }
Или prevBarTime объявить на глобальном уровне без static.
 
Vasiliy Pushkaryov:

Можно после OnCalculate() вставить:

Или prevBarTime объявить на глобальном уровне без static.
Да, но дело в том что так индикатор будет сигналить только в начале бара, в тот момент когда те два значения не равны. А мне нужно  чтобы индикатор мог сигналить в любой момент, хоть на начале, хоть в середине или в конце. 
Нужно по идее ещё один флажок что то типа  message _was_send

 
ddras2:
Да, но дело в том что так индикатор будет сигналить только в начале бара, в тот момент когда те два значения не равны. А мне нужно  чтобы индикатор мог сигналить в любой момент, хоть на начале, хоть в середине или в конце. 
Нужно по идее ещё один флажок что то типа  message _was_send


условие времени что выше, после условия сигнала
 
ddras2:
Да, но дело в том что так индикатор будет сигналить только в начале бара, в тот момент когда те два значения не равны. А мне нужно  чтобы индикатор мог сигналить в любой момент, хоть на начале, хоть в середине или в конце. 
Нужно по идее ещё один флажок что то типа  message _was_send


ArraySetAsSeries(time, true);
  
  static datetime prevBarTime = 0;
  static datetime MySignalThisBar = 0;  // если обнаружен сигнал на этом баре
  if(prevBarTime != time[0])            // если обнаруживаем новое время
  {
    prevBarTime = time[0];
  }
  if   (MySignalThisBar != prevBarTime ) // на этом баре  сигнала не было
  {
        if (  ВАШАСДЕЛКАОБНАРУЖЕНА() )  
        {
             // ДА  сделка обнаружена сигналим на этом баре
             MySignalThisBar   = prevBarTime ; // отлично СИГНАЛИМ       

        }
  else
  {
    // сигнал на этом баре был 
  }
  
bool ВАШАСДЕЛКАОБНАРУЖЕНА(void)
{
...
    return ( false ); // сделки нет
...
    return ( true ); // сделка есть
}
 
Yuriy Zaytsev:

А что там вместо "..." в конце, и куда пихать свое условие, обясните пожалуйста.

 

достаточно одной проверки

if (TimeCurrent()-prevTime>=PeriodSeconds())
   {
   prevTime=TimeCurrent();

   //сигнал

   }
 


Спасибо всем, кто отозвался, очень помогли, заработало! Спасибки)
 
ddras2:

А что там вместо "..." в конце, и куда пихать свое условие, обясните пожалуйста.


Желательно скинуть формулярчик, чтобы я вставил свой if для обнаружения сделки.

 
bool ВАШАСДЕЛКАОБНАРУЖЕНА(void)
{

...   Желательно скинуть формулярчик, чтобы я вставил свой if для обнаружения сделки.
   {
    return ( true ); // сделка есть
   }
   else
   {
        return ( false ); // сделки нет
   }
}

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