Последовательность выполнение Init() и DeInit() - страница 2

 
Alexey Viktorov:

Этот вопрос решается как 2 пальца... сами знаете что...

В OnDeinit надо перед удалением объекта ставить условие причины деинициализации... Если НЕ смена периода, то объект удалить. И ВСЁ...


Да, я могу не удалять какой то объект или ресурс при смене ТФ, могу сохранить даже некоторые небольшие массивы через объект-ресурс, и записать в ресурс информацию о том, что произошла смена ТФ, но в том -то и дело, что  Деюнит может начать выполняться после того , как выполнился Юнит в новом таймфрейме, как я по вашему должет сообщить юниту что была смена ТФ и надо считать старые данные, вот и  приходится с бубнами создавать функции слежения и ждать уже не в Юнит , а в OnTimer. Это что, не криво что-ли?
 
Slawa:

Какую логику портит?

При смене таймфрейма создаётся новая копия индикатора, которая ничего не знает о предыдущей копии. Какое-то время (очень короткое) обе копии индикатора существуют параллельно. Потом предыдущая копия выгружается.

Читайте документацию https://www.mql5.com/ru/docs/runtime/running


Прочитал описание по указанной ссылке, но такой информации, как Вы дали, не нашел. И, если это действительно так, то это огромная проблема для разработчиков индикаторов. Очень странно и очень плохо, что принята такая логика перезагрузки индикаторов при смене таймфрейма. К чему существование двух копий одного и того же индикатора в памяти? Кому это удобно? Что это даёт? Ведь логичнее было бы сначала завершить выполнение одной копии индикатора, выгрузить ее и только потом загрузить следующую копию.
 
Nikolai Semko:
И что ВСЁ!?
Я экспериментировал и использую этот код причины(REASON_CHARTCHANGE)  во всю. А что толку если все переменные снова устаналиваются в первоначальное состояние, а OnDeinit может выполниться после OnInit нового ТФ
Я прочёл только об удалении объекта при деинициализации и отвечал только на эту проблему. С сохранением прошлых вычислений сложней. И видимо эта проблема никогда не будет решена. Slava отвечал на этот вопрос, новый индикатор, новые вычисления. И это справедливо.
 
Alexey Viktorov:
 Slava отвечал на этот вопрос, новый индикатор, новые вычисления. И это справедливо.
В том то и дело, что индикатор статый, только таймфрейм новый. И ворос темы - это разсинхронизация юнит и деюнит, т.е. происходит обратная (нелогичная) последовательность выполнения, причем иногда, а иногда логичная. Для программиста нет ничего хуже плавающей ошибки и логики. 
 
Alexey Viktorov:
 И видимо эта проблема никогда не будет решена. 

А я верю в команду разработчиков, они классные ребята и сделали невероятно много и сделают еще больше. Просто руки еще не дошли. Правда добиваться от них обратной связи тоже всегда с бубнами приходиться. :))
Своей задачей считаю убедить их в том, что это надо сделать. Хотя не исключаю, что они меня убедят, что этого лучше не делать, может я что-то не догоняю.
 
Nikolai Semko:

А я верю в команду разработчиков, они классные ребята и сделали невероятно много и сделают еще больше. Просто руки еще не дошли. Правда добиваться от них обратной связи тоже всегда с бубнами приходиться. :))
Своей задачей считаю убедить их в том, что это надо сделать. Хотя не исключаю, что они меня убедят, что этого лучше не делать, может я что-то не догоняю.


Slawa, а что значит фраза в документации "Библиотеки не обрабатывают никаких событий"?

Очень туманно
 

 
nmaratr:

- При Ините устанавливаю цвет основного графика прозрачным.

    Черчу свой график (по своим параметрам) 


Так как хочу чтобы после снятия моего индикатора восстанавливал цвет основного графика

- В ДеИните восстанавливаю цвет основного графика 


При смене ТФ подразумеваю вначале ДеИнит (восстановление цвета), а потом Инит (Опять прозрачным)


Так выполнение команд идет не последовательно, периодически при смене ТФ

накладываются основной график (восстановленным цветом) на мой индикатор.

Вот к примеру одна "порча логики".


Может быть попробовать графическим объектам присваивать в качестве составляющей префикса их имени период ТФ,

а потом что-то вроде такого применить:

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit()
{
  currentTF = (ENUM_TIMEFRAMES)Period();
}

//+---------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
  if(currentTF != Period()) 
  {
    // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
    return;
  }

  // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
  // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr:

- При Ините устанавливаю цвет основного графика прозрачным.

    Черчу свой график (по своим параметрам) 


Так как хочу чтобы после снятия моего индикатора восстанавливал цвет основного графика

- В ДеИните восстанавливаю цвет основного графика 


При смене ТФ подразумеваю вначале ДеИнит (восстановление цвета), а потом Инит (Опять прозрачным)


Так выполнение команд идет не последовательно, периодически при смене ТФ

накладываются основной график (восстановленным цветом) на мой индикатор.

Вот к примеру одна "порча логики".

Конечно приятней когда всё происходит в логической последовательности, но раз-уж приходится работать с тем что имеем, можно установку цвета основного графика перенести в OnCalculate с проверкой текущего значения.
 
Nikolai Semko:
И что ВСЁ!?
Я экспериментировал и использую этот код причины(REASON_CHARTCHANGE)  во всю. А что толку если все переменные снова устаналиваются в первоначальное состояние, а OnDeinit может выполниться после OnInit нового ТФ


Попробуйте обновить терминал до версии 1065. В предыдущих версиях была ошибка переинициализации как раз при смене таймфрема. Может поможет :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko:


Попробуйте обновить терминал до версии 1065. В предыдущих версиях была ошибка переинициализации как раз при смене таймфрема. Может поможет :)

https://www.mql5.com/ru/forum/187690

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