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

 
mql5:
Ещё раз попробую объяснить(на пальцах):
  1. Запустился терминал спустя X времени после последнего запуска
  2. Инициировалась закачка истории, которая отсутствует( терминал не работал X минут)
  3. Вызывается OnCalculate индикатора на имеющуюся историю prevtime= последнее известное время истории, размер индикаторного буфера N баров
  4. Пока подкачивается история с сервера приходит тик
  5. Вызывается OnCalculate индикатора, где Time[0] время тика, индикатор его запоминает как prevtime, размер индикаторного буфера N+1 баров (между барами N и N+1 имеется дыра в истории)
  6. После докачки истории опять вызывается OnCalculate индикатора, но в этот раз, дыры в истории нет, но вот prevtime имеет туже дату, что и Time[0] - нового бара нет (соответственно нет зануления буферов в индикаторе), при этом размер буфера индикатора N+X/Timeframe баров и IndBuffer[0] вовсе не тот, который был в п.5



При чём тут prevtime?

Я спрашиваю почему это не работает.

/////////////////////////////////////
void OnDeinit(const int reason)
{
 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);


}
 
eevviill:

При чём тут prevtime?

Я спрашиваю почему это не работает.

 

А как Вы узнаёте, что не работает? Как проверяете? 

И для чего перед выгрузкой индикатора инициализировать буфера индикатора? Он ведь уже выгружается.

Инициализацию индикаторных буферов нужно проводить, когда производится полный пересчет всех значений индикатора:

int OnCalculate(..)
{
   ...
   if (<необходимо пересчитать все значения индикатора, например, если limit == Bars - 1>)
   {
      ArrayInitialize(...);
   }
   ...
}
 
eevviill:

Вот. Для этого я делаю обнуление буферов. В ините уже сказали что нельзя этого делать. 

Я хочу в деинит. Но там тоже не работает. Почему? 

А при чем тут init(), deinit(). Операция нужна совсем в другом месте. Я повторюсь. После расчета произошла загрузка истории.

Сделал рабочий вариант. 

Файлы:
 
Scriptong:

А как Вы узнаёте, что не работает? Как проверяете? 


 

https://forum.mql4.com/ru/65066/page2#1015138
 
Vinin:

А при чем тут init(), deinit(). Операция нужна совсем в другом месте. Я повторюсь. После расчета произошла загрузка истории.

Сделал рабочий вариант. 

Я ещё с первого раза по вашей рекомендации правильно сделал.

Меня интересует почему в деините не работает обнуление масивов? 

 
eevviill:
https://forum.mql4.com/ru/65066/page2#1015138

Вы дали ссылку на код, который работает в OnCalculate. Я же спросил о том, как вы узнаёте, что не работает инициализация в DeInit. Уточню, на всякий случай, что после OnDeinit() уже ничего из кода индикатора не работает (ни OnInit(), ни OnCalculate()). Таким образом, проверить факт обнуления массивов можно только в самом OnDeinit().

 
Scriptong:

Вы дали ссылку на код, который работает в OnCalculate. Я же спросил о том, как вы узнаёте, что не работает инициализация в DeInit. Уточню, на всякий случай, что после OnDeinit() уже ничего из кода индикатора не работает (ни OnInit(), ни OnCalculate()). Таким образом, проверить факт обнуления массивов можно только в самом OnDeinit().

Я дал ссылку на 

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

Вот так и проверяю. 

 
eevviill:

Я ещё с первого раза по вашей рекомендации правильно сделал.

Меня интересует почему в деините не работает обнуление масивов? 

Или деинит не срабатывает при закрытии терминала?
 
eevviill:
Или деинит не срабатывает при закрытии терминала?
Срабатывает, но нет смысла очищать индикаторные буфера - они не сохраняются.
 
mql5:
Срабатывает, но нет смысла очищать индикаторные буфера - они не сохраняются.

Почему?

Почему значение заполненого 0 буфера сохраняется, а обнуление нет? 

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