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

 
Slawa:

Если идёт смена таймфрейма в пределах одного символа, то тут порядок инициализации-деинициализации в принципе предсказуем. Скачайте последний билд 1580 - там мы кое что поправили, теперь удаление индикаторов производится в самую последнюю очередь, поэтому не должно быть преждевременного деинита.

Не понял. Пожалуйста, поясните. Деинит будет гарантированно после инита?
 
Andrey Khatimlianskii:

Индикаторы бывают разные. Тормознутые тоже. И не все — свои и в исходниках.

Про пару секунд улыбнуло. В интерфейсе чувствуются десятки миллисекунд, сразу появляется дискомфорт.


Не перевирайте. Речь не об интерфейсе, а о переходных процессах - переключении ТФ. На пустом графике переключение ТФ занимает бесконечно малое время? Нет. Значит, индикаторы не при чем.



А, главное, нет ответа на мой вопрос:
В каких ситуациях, кроме прямолинейной работы с граф. объектами (без названия ТФ в названии), важна последовательность ДеИнит - Инит?


Практически во всех ситуациях. Если речь идет, конечно, не об игрушках типа МАшек и подобных примитивах:

  1. Запись в файл. Когда при отключении индикатора требуется дописать накопленную инфу в файл. Потому как держать постоянно файл открытым нельзя. Есть риск сбоя и потери всей информации, записанной в файл.
  2. При работе с графическими объектами. Вообще красота получается: один индикатор еще существует и не прибрал за собой, а второй уже поверх этих объектов рисует. Так и будем пользователю объяснять: "при переключении ТФ Вы будете наблюдать кратковременные помехи". )))
  3. Работа с DLL. При Deinit DLL должна выполнять прерывание всех потоков, которые ею были созданы. Следующая копия индикатора после этого заново их создает под себя. Теперь получаем, что новая копия индикатора попробует создать все эти потоки и получит отказ, т. к. они еще работают. Новый индикатор выдаст сообщение об ошибке и работать не будет. Всего лишь из-за переключения ТФ. Да, проблема решаема. 

Согласен. Проблемы, кроме второй, решаемы, если знать о них. То есть всю логику теперь нужно запихнуть в OnCalculate, а Init и DeInit не использовать, написать свои. Только зачем они тогда нужны? 

Во всяком случае речь о кроссплатформенности теперь вовсе не идет. Ведь у МТ4 и МТ5, как оказалось, разные подходы к Init и DeInit.

 
nmaratr:


Если бы это не было связано с финансами, возможно не было бы и таких обсуждений.

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

Как же ему можно доверить финансы?

Возможно наши мнения и расходятся в этом вопросе с разработчиками МТ.

Вариантов решения этой проблемы масса. И почти все они были озвучены в этой теме.

1. Если по индикатору написан советник, то советник должен быть написан так, чтобы на него не влияла смена периода графика. Отсюда и не будет переинициализации индикатора.

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

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

4. Из двух кучек дерьма всегда выбирают ту которая меньше воняет. Соответственно выбирая между быстродействием от которого зависят ВСЕ индикаторы и сложностью сохранения каких-то данных в НЕСКОЛЬКИХ индикаторах я выбираю быстродействие.

 
Stanislav Korotky:
Не понял. Пожалуйста, поясните. Деинит будет гарантированно после инита?

Если переключение таймфреймов идёт вниз, то сначала OnInit на младшем(новом) таймфрейме, а потом OnDeinit на старшем(старом) таймфрейме.

Если переключение идёт вверх, то всё наоборот. Сначала OnDeinit на младшем(старом) таймфрейме, а потом OnInit на старшем(новом) таймфрейме.

Тут нужно иметь в виду, что кеши обрабатываются от младшего таймфрейма к старшему

 
Slawa:

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


:(( Млин, "обрадовали". Теперь возможно придется код переписывать в некоторых программах, потому как было заточено было как раз под "наоборот" - сначала Деюнит, а потом Юнит.
Странная, честно говоря, логика. Т.е. старая и новая копия индикатора однозначно будут жить какое-то время вместе, пока сначала не выполниться Юнит в новой копии индикатора , а вслед за этим Деюнит в старой. При этом нет возможности через Деюнит сообщить новой копии какую-либо информацию. Явно перемудрили. Ведь Юниты как правило гораздо более громоздки чем Деюниты. Зачем такая странная последовательность выполнения! Тогда эта тема будет возрождаться вновь и вновь. Вот если бы все же была возможность у программиста в индикаторе создавать некоторые переменные, которые не переинициализировались при смене ТФ, то и Бог бы с этой последовательностью OnInit и OnDeinit. Я уже пару раз об этом писал (1 и 2). Я согласен с логикой разработчиков, что в целях безопасности непозволительная роскошь для программистов указатели и ссылки, но создайте тогда механизм особого типа общих переменных для всех копий индикатора. Индикатор то один, своиства индикатора же тоже "где-то" храняться.
 
Slawa:

Если переключение таймфреймов идёт вниз, то сначала OnInit на младшем(новом) таймфрейме, а потом OnDeinit на старшем(старом) таймфрейме.

Если переключение идёт вверх, то всё наоборот. Сначала OnDeinit на младшем(старом) таймфрейме, а потом OnInit на старшем(новом) таймфрейме.

Тут нужно иметь в виду, что кеши обрабатываются от младшего к старшему

Ещё больше запутали.

Ведь если индикатором пользуется не сам автор, то переключать может как угодно и не дожидаясь выполнения инита и деинита? И что получится??? А если при одном варианте переключения в деините нужно предпринимать какие-то действия, то никому нет никакой разницы, будет это написано для одного направления переключения или для обоих направлений. Но зато для "тяжёлых" индикаторов добавили тормоза.

 
Alexey Viktorov:

Ещё больше запутали.

Ведь если индикатором пользуется не сам автор, то переключать может как угодно и не дожидаясь выполнения инита и деинита? И что получится??? А если при одном варианте переключения в деините нужно предпринимать какие-то действия, то никому нет никакой разницы, будет это написано для одного направления переключения или для обоих направлений. Но зато для "тяжёлых" индикаторов добавили тормоза.

Где тормоза добавили? По сравнению с чем добавили?

Будьте добры свои утверждения подкреплять кодом, чтобы каждый мог воспроизвести

Ещё раз. Так как при смене символа-периода графика создаётся ещё одна копия индикатора, то порядок выполнения OnInit на новом символе-периоде и OnDeinit на старом символе-периоде неопределён

 
Slawa:

Где тормоза добавили? По сравнению с чем добавили?

Будьте добры свои утверждения подкреплять кодом, чтобы каждый мог воспроизвести

Ещё раз. Так как при смене символа-периода графика создаётся ещё одна копия индикатора, то порядок выполнения OnInit на новом символе-периоде и OnDeinit на старом символе-периоде неопределён

В этом сообщении

Slawa:

Если переключение таймфреймов идёт вниз, то сначала OnInit на младшем(новом) таймфрейме, а потом OnDeinit на старшем(старом) таймфрейме.

Если переключение идёт вверх, то всё наоборот. Сначала OnDeinit на младшем(старом) таймфрейме, а потом OnInit на старшем(новом) таймфрейме.

Тут нужно иметь в виду, что кеши обрабатываются от младшего таймфрейма к старшему

Вы сказали как есть или как сделали  готовя новый билд?

Если как есть, то я не правильно понял и беру свои слова взад.

 
Alexey Viktorov:

В этом сообщении

Вы сказали как есть или как сделали  готовя новый билд?

Если как есть, то я не правильно понял и беру свои слова взад.

Это сделано в билде 1580

До этого деинициализация при смене таймфрейма почти всегда была раньше. Но только если переключение таймфреймов идёт вниз, то деинициализация производилась с кодом 1, а не 3, как должно быть

 
Slawa:

Это сделано в билде 1580

До этого деинициализация при смене таймфрейма почти всегда была раньше. Но только если переключение таймфреймов идёт вниз, то деинициализация производилась с кодом 1, а не 3, как должно быть


Как тогда обрабатывать эти коды деинициализации в Inite индикатора, для чего нужны эти коды? Ведь в индикаторе нет возможности подождать, Sleep не работает.
Причина обращения: