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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
nmaratr
117
nmaratr  

Всем привет !

Столкнулся с такой проблемой

Написан индикатор или советник.

В нем есть пару функций  Init() и DeInit() 

Какова последовательность выполнения этих функций при смене ТФ (таймфрейма) ???

Я понимаю так, что при запуске или присоединении индикатора должен сработать Init()

При его удалении из графика должен сработать  DeInit() 

При смене ТФ вначале сработает DeInit() от текущего ТФ а потом должен сработать Init() нового ТФ

Однако он выполняет не всегда в этой последовательности, что очень портит логику написания программы.

Пример индикатора и логов прикрепил.

Подскажите кто нибудь решил эту проблему или просто забили на нее!!!

Файлы:
ERROR.mq5 2 kb
Log.txt 1 kb
Slava
Модератор
13448
Slava  

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

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

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

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Petros Shatakhtsyan
14394
Petros Shatakhtsyan  
При смене таймфрейма, всякий раз вызывается OnInit и создает некоторое неудобство.
nmaratr
117
nmaratr  
Slawa:

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

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

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


Спасибо за ответ

Про "логику портит"

Написал индикатор заменяющий основной график (свечи) на свой тип отрисовки DRAW_CANDLES

Смысл убрать основной график цен и отображать только мой.

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

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


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

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


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


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

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

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


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

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


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
nmaratr
117
nmaratr  
nmaratr:


По поводу

"создаётся новая копия индикатора, которая ничего не знает о предыдущей копии"

Почему тогда в ДеИните удаляются объекты, которые были созданы в копии нового Инита. Если это всего лишь копия.



nmaratr
117
nmaratr  
Petros Shatakhtsyan:
При смене таймфрейма, всякий раз вызывается OnInit и создает некоторое неудобство.


Что значит всякий раз вызывается OnInit

Для чего нужен OnInit - для того, чтобы один раз инициализировать все переменные и параметры

Например

Я хочу написать индикатор, который бы создавал текстовую метку на графике в которой писал какой сейчас ТФ.

При удалении индикатора удалял эту текстовую метку с графика.

А при смене ТФ обновлял ее содержимое на новое (путем удаления старой и создание новой)

Что же получится

Пару раз сменили ТФ и пропала текстовая метка. (Так как вначале сработал OnInit а потом уже DeInit - который и удалил эту метку )

Потом еще несколько раз сменили ТФ и появилась.

Это же неправильно.

Alexander Bereznyak
31184
Alexander Bereznyak  
nmaratr:

если это графические объекты, то они пренадлежат чату и доступны любой программе работающей на этом чате
nmaratr
117
nmaratr  
Alexander Bereznyak:

если это графические объекты, то они пренадлежат чату и доступны любой программе работающей на этом чате


Так как, решить можно эту проблему ???  (У кого нибудь это получилось ???)

Или принять как есть. Что в целях ускорения вычислений возможно выполнение команд не последовательно.

Что противоречит документации


При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом 

последовательно

 вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть)

Nikolai Semko
6536
Nikolai Semko  
nmaratr:


Так как, решить можно эту проблему ???  (У кого нибудь это получилось ???)



Присоединяюсь к автору данной темы. Вопрос на самом деле не праздный. И весьма конкретный.
Я эту фичу уже давно обнаружил. Обращался в сервисдеск еще в июне 2016 с примером абсолютно аналогичным как у автора данной темы. Проигнорили - до сих пор висит открытая тема:

Заявка в сервисдеск

Я конечно с бубнами сделал передачу параметров в индикаторе при смене ТФ, потратив кучу времени на это .  Но ведь не хочется делать простую задачу с бубнами.
Я конечно понимаю, что многопоточность вещь очень нужная и очень сложная и с синхронизацией все не так просто.Но, разработчики, реализуйте, пожалуйста, возможность создавать в индикаторах особого вида глобальные переменные, которые не переинициализируются при смене таймфрейма. В советниках не происходит переинициализация при смене ТФ, а в индикаторе присходит. Если бы существовала возможность возможность не переинициализировать некоторые переменные и массивы в индикаторах, но и тема с синхронизацией OnInit и OnDeinit не возникла бы и открылись бы новые интересные возможности для программистов. Я не думаю , что наличие данной возможности непереинициализации переменных как-то повлияетс на безопасность программ.

Для чего это нужно ?
Да масса ситуаций.

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

Alexey Viktorov
25787
Alexey Viktorov  

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

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

Nikolai Semko
6536
Nikolai Semko  
Alexey Viktorov:

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

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

И что ВСЁ!?
Я экспериментировал и использую этот код причины(REASON_CHARTCHANGE)  во всю. А что толку если все переменные снова устаналиваются в первоначальное состояние, а OnDeinit может выполниться после OnInit нового ТФ