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

 
fxsaber:

В Deinit прописать запись всех данных в глобалки. При этом выставить одну глобалку, как семафор - через GlobalVariableSetOnCondition.

В Init прописать, что если семафор в состоянии "данные сброшены" - считываем и работаем, поставив семафор в состояние "все прочли".

Если же семафор в состоянии "нихрена не понятно", то просто ожидаем семафора (либо через зацикленный Sleep, либо через OnTimer).


Ну и, конечно, если семафор отсутствует напрочь, то это значит, что мы первый раз запустились и все считаем, попутно создав семафор не будущие смены ТФ.


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


Если бы в индикаторах работал Sleep было бы проще. Sleep в индикаторах не работает.
 
Stanislav Korotky:
Если умножить количество мелких людишек, которые - каждый сам по себе, снова и снова - будут решать общую проблему, то потраченные человеко-часы во много раз (в пределе в бесконечное число раз ;-)) превысят время, которое нужно для любого варианта правки в самом терминале. Даже наличие гипотетической библиотеки не гарантирует, что все будут в курсе о её наличии и необходимости использовать. Вообще не понятно, зачем делать и оставлять такие "грабли"?

Так это же не грабли, а логичное поведение, когда новая копия индикатора знать не знает про старую. Это логично!

Но ЕДИНИЦЫ людей хотят доп. функционал, чтобы копия все же знала! Ну так что мешает этим единицам написать решение один раз и использовать?

Зачем делать вид заботы об окружающих. Кому это, действительно, надо, сначала поищет решения. А если нет - попробует написать. Централизованная кодобаза именно для этих целей же служит.

 
Sergey Chalyshev:

Если бы в индикаторах работал Sleep было бы проще. Sleep в индикаторах не работает.
Ну OnTimer же предложил. Проблема пустяковая.
 
fxsaber:

Так это же не грабли, а логичное поведение, когда новая копия индикатора знать не знает про старую. Это логично!

Но ЕДИНИЦЫ людей хотят доп. функционал, чтобы копия все же знала! Ну так что мешает этим единицам написать решение один раз и использовать?

Зачем делать вид заботы об окружающих. Кому это, действительно, надо, сначала поищет решения. А если нет - попробует написать. Централизованная кодобаза именно для этих целей же служит.

Э, нет, тут не все так просто. Индикаторы сидят внутри другой сущности - график/чарт, и подчинены ей (я в курсе про их сложные отношения один ко многим, но сути это не меняет). У графика есть свой цикл жизни, включающий некие внутренние события инит и деинит, которые являются границами для цикла жизни индикаторов. Иными словами, индикатор не может пережить свой график. Деинит графика должен дождаться деинита или таймаута деинита всех индикаторов. Только затем может запускаться инит графика для нового таймфрейма, и из него - вызов инитов вложенных индикаторов.

Грабли - это, по определению, нечто, на что можно наступить. Уже наступили. Хороший софт не допускает граблей в принципе.

 
fxsaber:

Так это же не грабли, а логичное поведение, когда новая копия индикатора знать не знает про старую. Это логично!

Но ЕДИНИЦЫ людей хотят доп. функционал, чтобы копия все же знала! Ну так что мешает этим единицам написать решение один раз и использовать?

Зачем делать вид заботы об окружающих. Кому это, действительно, надо, сначала поищет решения. А если нет - попробует написать. Централизованная кодобаза именно для этих целей же служит.


Как это не знает, когда переключаете таймфрейм входные параметры по новой вводите?
 
Sergey Chalyshev:


А потом завершит свою работу Deinit и всё испортит. Пропадает смысл в штатных Init и Deinit ели делать свои кастомные иниты и деиниты. 

Тоже сталкивался с этой проблемой. (

fxsaber уже расписал всё, но добавлю ещё от себя.

Особенность всех программ для МТ - это работа основанная на событиях. Здесь OnInit и OnDeinit отрабатывают вполне логично и уместно согласно событийной модели.

Но есть один непонятный нюанс поведения input-переменных: все штатные индикаторы, включая внутренние терминальные и те, которые идут в штатной поставке - каждый раз запускаются с теми же input-параметрами, с которыми были выгружены после прошлого запуска. Это очень удобно. Но этого нет для пользовательских индикаторов и всех советников и скриптов включая штатные, в этом некоторое неудобство (пожелание к MQ: добавить такое же поведение input-переменных как и для штатных индикаторов).-Это что касается полной выгрузке и новому запуску программ при накидывании их на чарт.

А вот что качается работы инита и деинита, то я лично никогда не закладываюсь на причины деинициализации программ при работе с глобальными переменными программы, строю всегда логику согласно конкретной идеи программы. К примеру очень часто бывает нужно сохранять глобальные переменные программы после деинициализации советника (причины могут быть разными, тот же дисконект к примеру вызывает OnDeinit и последующий OnInit), так зачем при этом всё заново пересчитывать и создавать по новый хендлы индикаторов и т.д.?

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

В MQL не всё гладко, к сожалению, но работа OnInit и Ondeinit логична и понятна, поэтому зря тут навели тень на плетень.)

 
Sergey Chalyshev:

Как это не знает, когда переключаете таймфрейм входные параметры по новой вводите?
Проверил только что - нет, не надо вводить заново input-переменные при переключении ТФ.
 
Andrey Dik:

 но работа OnInit и Ondeinit логична и понятна, поэтому зря тут навели тень на плетень.)


Объясните, пожалуйста, логику последовательности выполнения OnInit и OnDeinit в индикаторе при переключении таймфрейма. Буду очень признателен. И думаю, не только я.
 
Nikolai Semko:

Объясните, пожалуйста, логику последовательности выполнения OnInit и OnDeinit в индикаторе при переключении таймфрейма. Буду очень признателен. И думаю, не только я.

Ув. Слава четко всё сказал.

Создается копия индикатора, а старая выгружается через некоторое время.

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

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

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

Нет никаких проблем.

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

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

Slawa, 2017.04.07 15:31

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

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

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

 
Andrey Dik:

Ув. Слава четко всё сказал.

Создается копия индикатора, а старая выгружается через некоторое время.

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

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

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

Нет никаких проблем.


Да эт все понятно. Я про логику последовательности выполнения спрашивал. В том то и дело что ее нет. Иногда выполняется первым OnDeinit (как и положено согласно логике обывателя), а иногда первым OnInit.

Я понимаю, что ответ кроется в реплике "Какое-то время (очень короткое) обе копии индикатора существуют параллельно." Но от осознания этого вопрос этот не проясняется.

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