Кто так оформляет OnInit и OnDeinit в советниках?

 
  • 18% (11)
  • 45% (27)
  • 37% (22)
Всего проголосовало: 60
 
int OnInit()
{
    int reason =  UninitializeReason();
    if(reason == REASON_CHARTCHANGE || reason == REASON_TEMPLATE)
        return(INIT_SUCCEEDED);
    if(reason == REASON_PARAMETERS)
    {
        InitParams();
        return(INIT_SUCCEEDED);                              
    }

void OnDeinit(const int reason)
{
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS)
        return;
 
Сейчас пишу советник, вставил этот стандартный код, а вот в кодобазе почему-то такое не встречал. А ведь какой смысл все переинициализировать при смене, например, таймфрейма? У меня только фильтры около минуты приходят в рабочее состояние после запуска.
 

Перестал пользоваться этими функциями.

Для фриланса и Маркета, наверное, без них не обойтись.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.11.30 09:48

Памятка

Действие/тип программыСмена ТФ или символаСмена счета
ИндикаторЗапуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).Ничего не происходит, кроме обнуления prev_calculated.
СоветникЗапуск OnDeinit и OnInit, объект глобального класса не меняется.Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).
 
fxsaber:

Перестал пользоваться этими функциями.

Для фриланса и Маркета, наверное, без них не обойтись.

Смену входных параметров надо как-то отслеживать? 

 
Alexey Volchanskiy:

Смену входных параметров надо как-то отслеживать? 

Для себя - нет.

 
fxsaber:

Для себя - нет.

Кстати, я так до конца и не понимаю смысла сбрасывать глобальные переменные индикатора при смене ТФ. Кто чего умного скажет?

 
Все зависит от поставленной задачи. Иногда при смене ТФ в OnInit() и в OnDeinit() нужно что-то делать, а иногда - нет. Поэтому тут не может быть универсального подхода.
 
Alexey Volchanskiy:

Кстати, я так до конца и не понимаю смысла сбрасывать глобальные переменные индикатора при смене ТФ. Кто чего умного скажет?

Смысл там архитектурный: при смене ТФ индикатор полностью выгружается и загружается его копия. Где-то давно была тема о том, что порядок выгрузки и загрузки индикаторов не гарантирован. То есть при смене ТФ вполне может быть раньше выполнен OnInit() копии индикатора, чем OnDeinit() текущего индикатора. В итоге две копии индикатора будут какое-то время существовать параллельно.

Для экспертов выгрузка не требуется. Почему так не сделано для индикаторов, трудно сказать. Видимо, есть на то какие-то объективные сложности в реализации.

 
Ihor Herasko:

Смысл там архитектурный: при смене ТФ индикатор полностью выгружается и загружается его копия. Где-то давно была тема о том, что порядок выгрузки и загрузки индикаторов не гарантирован. То есть при смене ТФ вполне может быть раньше выполнен OnInit() копии индикатора, чем OnDeinit() текущего индикатора. В итоге две копии индикатора будут какое-то время существовать параллельно.

https://www.mql5.com/ru/code/18138

Init_Sync
Init_Sync
  • голосов: 26
  • 2017.04.17
  • fxsaber
  • www.mql5.com
Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры. Данное обстоятельство иногда вызывает не сразу очевидные проблемы, связанные с тем, что...
 

Век живи, век учись. Я так не делал, но, считаю, что очень даже полезно.

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

В принципе, код совершенно верный, стоящий для применения.

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