_UninitReason и UninitializeReason() в индикаторах. - страница 3

 
Stanislav Korotky #:
для всех глобальных переменных

Вы путаете глобальные и предопределенные переменные.

 
Ivan Titov #:

Вы путаете глобальные и предопределенные переменные.

Они тоже глобальные, хоть и предопределенные.

 
Stanislav Korotky #:

Они тоже глобальные, хоть и предопределенные.

Не тоже, что следует из названия: они ОПРЕДЕЛЯЮТСЯ средой ПЕРЕД исполнением кода, а не объявляются и не изменяются в коде, как глобальные. Отсюда и вопрос: почему _UninitReason в индикаторах не предопределяется? И сколько раз выполнен код OnInit() до этого тут ни при чем.

 
Ivan Titov #:

Не тоже, что следует из названия: они ОПРЕДЕЛЯЮТСЯ средой ПЕРЕД исполнением кода, а не объявляются и не изменяются в коде, как глобальные. Отсюда и вопрос: почему _UninitReason в индикаторах не предопределяется? И сколько раз выполнен код OnInit() до этого тут ни при чем.

Потому, что OnInit() всегда выполняется уже в другом индикаторе (экземпляре программы) и про прошлый индикатор, в котором был OnDeinit(), ничего не знает.

Для эксперта OnInit() в некоторых случаях может выполняться в том же экземпляре, где был и OnDeinit(), поэтому информация сохраняется.

Т.е., для экспертов OnInit()/OnDeinit() могут вызываться и без выгрузки/загрузки программы, в отличие от индикаторов.


При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются.

https://www.mql5.com/ru/docs/runtime/running
 

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

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

fxsaber, 2017.11.30 09:48

Памятка

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

Как это ничего? Параметры, настройки и окно прошлого индикатора же знает. Почему бы не знать еще и причину деинициализации?

fxsaber #:
объект глобального класса

Какое отношение этот объект имеет к предопределенным переменным?

 
Ivan Titov #:

Какое отношение этот объект имеет к предопределенным переменным?

Не имеет значения, как они называются. Это просто переменные, значения некоторых из них даже можно менять пользователю.

Так вот эти переменные определяются и инициализируются, как обычные, на глобальном уровне запущенной копии EX5-программы. У каждого EX5 это свои внутренние переменные, как любые другие, заданные пользователем.

 
Ivan Titov #:

Не тоже, что следует из названия: они ОПРЕДЕЛЯЮТСЯ средой ПЕРЕД исполнением кода, а не объявляются и не изменяются в коде, как глобальные. Отсюда и вопрос: почему _UninitReason в индикаторах не предопределяется? И сколько раз выполнен код OnInit() до этого тут ни при чем.

Побольше КАПСЫ - поменьше здравого смысла? То что выделено красным - вообще не понятно, кому адресовано. Я про количество вызовов OnInit ничего не писал, но на всякий случай уточним, что OnInit всегда вызывается ядром 1 раз.

Вы задали довольно странный вопрос, потому что проверять причину деинициализации программы в обработчике её запуска - как минимум странно. Значение _UninitReason проставляется после того, как взведен флаг _IsStopped. До этого момента нет еще никакой деинициализации.

Можете продолжать упорствовать, но глобальные переменные от этого не перестанут быть глобальными, и не важно - описал ли их программист в MQL5 или сгенерировал компилятор.

 
fxsaber #:
Так вот эти переменные определяются и инициализируются, как обычные, на глобальном уровне запущенной копии EX5-программы

Откуда Вы знаете. В документации где-то написано?

Stanislav Korotky #:
OnInit всегда вызывается ядром 1 раз.

Как объясните тогда, что в OnInit() советника значение переменной _UninitReason - не 0 при перезапуске?

 
Ivan Titov #:

Откуда Вы знаете. В документации где-то написано?

Как объясните тогда, что в OnInit() советника значение переменной _UninitReason - не 0 при перезапуске?

Это тот же советник, что и был до его перезапуска. 
А индикатор запускается новый. Я об этом в самом начале сказал. Вы предпочли не прислушаться. Теперь Вам об этом только ленивый не сказал.