OnDeinit в индикаторах - страница 2

 
eevviill:

Не, не удаляет. Терминал нормально выключаю.

Если Деинит в Инит засунуть, то тоже не работает.

Помогло только пользовательская функция удаления объектов. 

 

ну, если не удаляет, то кто знает чего ты там наколдовал :) 

 
keekkenen:

 

ну, если не удаляет, то кто знает чего ты там наколдовал :) 

Логично. Но если просто удаляю с графика индикатор, то зоны удаляются. При выключении терминала нет. Только если в инит функцию свою запихнуть по удалению зон(в деинит та же функция). 

Тоесть у всех я так понял деинит работает. А когда он должен срабатывать при закрытии или открытии терминала?

 
int deinit()
  {

deinit2();

return(0);
}

//////////////////////

void deinit2()

{

  for(int i=ObjectsTotal()-1;i>=0;i--)

  {

  if(StringFind(ObjectName(i),Highest_vol_zones_name)!=-1)

  ObjectDelete(ObjectName(i));

  }

 

}
 
eevviill:

Логично. Но если просто удаляю с графика индикатор, то зоны удаляются. При выключении терминала нет. Только если в инит функцию свою запихнуть по удалению зон(в деинит та же функция). 

Тоесть у всех я так понял деинит работает. А когда он должен срабатывать при закрытии или открытии терминала?

да, при закрытии терминала работает.. 

может у тебя какая-то логика долго играющая ?

в том смысле, что в момент выключения индикатор что-то жутко обсчитывает и терминал как-то криво все это дело ожидает/или прерывает, что OnDeinit не срабатывает ?

видимо в хелпдеск дорога.. 

 
keekkenen:

да, при закрытии терминала работает.. 

может у тебя какая-то логика долго играющая ?

в том смысле, что в момент выключения индикатор что-то жутко обсчитывает и терминал как-то криво все это дело ожидает/или прерывает, что OnDeinit не срабатывает ?

видимо в хелпдеск дорога.. 

Ну если у тебя работает, значит вообщем всё ок. Буду у себя глядеть.
 

Ничего так и не поменялось а ещё и добавилось.

 

Буферный индикатор. Операция  Открыл график-прикрепил индикатор М1- закрыл терминал-открыл через пару минут. Результат на скринах.

И это при том что в коде ещё и прописал

//////////////////////////////////////////////////////////////////
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[])
  {
    //new bar
if (Time[0] != prevtime) 
{
 ArrayInitialize(body_up,EMPTY_VALUE);
ArrayInitialize(body_down,EMPTY_VALUE);
ArrayInitialize(shadow_up,EMPTY_VALUE);
ArrayInitialize(shadow_down,EMPTY_VALUE);
  ArrayInitialize(yell_body_up,EMPTY_VALUE);
ArrayInitialize(yell_body_down,EMPTY_VALUE);
ArrayInitialize(yell_shadow_up,EMPTY_VALUE);
ArrayInitialize(yell_shadow_down,EMPTY_VALUE);


prevtime = Time[0];
}

 

 

 

Разработчики, вы будете проблему разбирать?

Вот вам индикатор. Попробуйте то что я делал постом выше. 

 Открыл график-прикрепил индикатор М1- закрыл терминал-открыл через пару минут. 

Файлы:
 
eevviill:

Разработчики, вы будете проблему разбирать?

Вот вам индикатор. Попробуйте то что я делал постом выше. 

 Открыл график-прикрепил индикатор М1- закрыл терминал-открыл через пару минут. 

Ситуацию с Вашим индикатором разобрали.

Дело вот в чём - индикатор рассчитывается не только на приходе тиков, но и на первой отрисовке и на приходе недостающей истории.

1. Пришёл свежий тик - индикатор рассчитался

2. Пришла недостающая история, которая заткнула дыру между последними данными с прошлого запуска терминала и последним тиком. Индикатор рассчитался. Но при этом состояния нового бара нет!

Чтобы решить эту проблему Вам необходимо проверять количество баров. Примерно так

   if(Time[0]!=prevtime || Bars!=prevbars)
     {
      ArrayInitialize(body_up,EMPTY_VALUE);
      ArrayInitialize(body_down,EMPTY_VALUE);
      ArrayInitialize(shadow_up,EMPTY_VALUE);
      ArrayInitialize(shadow_down,EMPTY_VALUE);
      ArrayInitialize(yell_body_up,EMPTY_VALUE);
      ArrayInitialize(yell_body_down,EMPTY_VALUE);
      ArrayInitialize(yell_shadow_up,EMPTY_VALUE);
      ArrayInitialize(yell_shadow_down,EMPTY_VALUE);

      prevtime=Time[0];
      prevbars=Bars;
     }
 
stringo:

Ситуацию с Вашим индикатором разобрали.

Дело вот в чём - индикатор рассчитывается не только на приходе тиков, но и на первой отрисовке и на приходе недостающей истории.

1. Пришёл свежий тик - индикатор рассчитался

2. Пришла недостающая история, которая заткнула дыру между последними данными с прошлого запуска терминала и последним тиком. Индикатор рассчитался. Но при этом состояния нового бара нет!

Чтобы решить эту проблему Вам необходимо проверять количество баров. Примерно так

Спасибо.

Но это не только в моём индикаторе. Я думал вы со своей стороны будете решать эту проблему. 

Например при закрытии терминала Деинит во всех программах прогонять. 

 
eevviill:

Спасибо.

Но это не только в моём индикаторе. Я думал вы со своей стороны будете решать эту проблему. 

Например при закрытии терминала Деинит во всех программах прогонять. 

Вообще-то деинит во всех программах вызывается при закрытии терминала.

Есть даже специальный код причины деинициализации. REASON_CLOSE

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