Какую логику портит?
При смене таймфрейма создаётся новая копия индикатора, которая ничего не знает о предыдущей копии. Какое-то время (очень короткое) обе копии индикатора существуют параллельно. Потом предыдущая копия выгружается.
Читайте документацию https://www.mql5.com/ru/docs/runtime/running
- www.mql5.com
Какую логику портит?
При смене таймфрейма создаётся новая копия индикатора, которая ничего не знает о предыдущей копии. Какое-то время (очень короткое) обе копии индикатора существуют параллельно. Потом предыдущая копия выгружается.
Читайте документацию https://www.mql5.com/ru/docs/runtime/running
Спасибо за ответ
Про "логику портит"
Написал индикатор заменяющий основной график (свечи) на свой тип отрисовки DRAW_CANDLES
Смысл убрать основной график цен и отображать только мой.
- При Ините устанавливаю цвет основного графика прозрачным.
Черчу свой график (по своим параметрам)
Так как хочу чтобы после снятия моего индикатора восстанавливал цвет основного графика
- В ДеИните восстанавливаю цвет основного графика
При смене ТФ подразумеваю вначале ДеИнит (восстановление цвета), а потом Инит (Опять прозрачным)
Так выполнение команд идет не последовательно, периодически при смене ТФ
накладываются основной график (восстановленным цветом) на мой индикатор.
Вот к примеру одна "порча логики".
PS: (((Читайте документацию https://www.mql5.com/ru/docs/runtime/running )))
При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются.
- www.mql5.com
По поводу
"создаётся новая копия индикатора, которая ничего не знает о предыдущей копии"
Почему тогда в ДеИните удаляются объекты, которые были созданы в копии нового Инита. Если это всего лишь копия.
При смене таймфрейма, всякий раз вызывается OnInit и создает некоторое неудобство.
Что значит всякий раз вызывается OnInit
Для чего нужен OnInit - для того, чтобы один раз инициализировать все переменные и параметры
Например
Я хочу написать индикатор, который бы создавал текстовую метку на графике в которой писал какой сейчас ТФ.
При удалении индикатора удалял эту текстовую метку с графика.
А при смене ТФ обновлял ее содержимое на новое (путем удаления старой и создание новой)
Что же получится
Пару раз сменили ТФ и пропала текстовая метка. (Так как вначале сработал OnInit а потом уже DeInit - который и удалил эту метку )
Потом еще несколько раз сменили ТФ и появилась.
Это же неправильно.
если это графические объекты, то они пренадлежат чату и доступны любой программе работающей на этом чате
если это графические объекты, то они пренадлежат чату и доступны любой программе работающей на этом чате
Так как, решить можно эту проблему ??? (У кого нибудь это получилось ???)
Или принять как есть. Что в целях ускорения вычислений возможно выполнение команд не последовательно.
Что противоречит документации
При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом
последовательно
вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть)
Так как, решить можно эту проблему ??? (У кого нибудь это получилось ???)
Присоединяюсь к автору данной темы. Вопрос на самом деле не праздный. И весьма конкретный.
Я эту фичу уже давно обнаружил. Обращался в сервисдеск еще в июне 2016 с примером абсолютно аналогичным как у автора данной темы. Проигнорили - до сих пор висит открытая тема:
Я конечно с бубнами сделал передачу параметров в индикаторе при смене ТФ, потратив кучу времени на это . Но ведь не хочется делать простую задачу с бубнами.
Я конечно понимаю, что многопоточность вещь очень нужная и очень сложная и с синхронизацией все не так просто.Но, разработчики, реализуйте, пожалуйста, возможность создавать в индикаторах особого вида глобальные переменные, которые не переинициализируются при смене таймфрейма. В советниках не происходит переинициализация при смене ТФ, а в индикаторе присходит. Если бы существовала возможность возможность не переинициализировать некоторые переменные и массивы в индикаторах, но и тема с синхронизацией OnInit и OnDeinit не возникла бы и открылись бы новые интересные возможности для программистов. Я не думаю , что наличие данной возможности непереинициализации переменных как-то повлияетс на безопасность программ.
Для чего это нужно ?
Да масса ситуаций.
Например:
-При запуске индикатора у меня происходят вычисления переменных, индексных массивов, массивов данных, независящих от ТФ, и они могут быть достаточно объемными и длительными. Спрашивается зачем мне каждый раз это делать при смене ТФ.
- или я меняю параметры индикатора не через окно параметров, а для удобства и наглядности прям из графика с помощью мыши (можно посмотреть и поюзать для примера этот индикатор, в котором это реализовано с бубнами). И чтобы настроики не сбивались каждый раз при смене ТФ.
Этот вопрос решается как 2 пальца... сами знаете что...
В OnDeinit надо перед удалением объекта ставить условие причины деинициализации... Если НЕ смена периода, то объект удалить. И ВСЁ...
Этот вопрос решается как 2 пальца... сами знаете что...
В OnDeinit надо перед удалением объекта ставить условие причины деинициализации... Если НЕ смена периода, то объект удалить. И ВСЁ...
Я экспериментировал и использую этот код причины(REASON_CHARTCHANGE) во всю. А что толку если все переменные снова устаналиваются в первоначальное состояние, а OnDeinit может выполниться после OnInit нового ТФ
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет !
Столкнулся с такой проблемой
Написан индикатор или советник.
В нем есть пару функций Init() и DeInit()
Какова последовательность выполнения этих функций при смене ТФ (таймфрейма) ???
Я понимаю так, что при запуске или присоединении индикатора должен сработать Init()
При его удалении из графика должен сработать DeInit()
При смене ТФ вначале сработает DeInit() от текущего ТФ а потом должен сработать Init() нового ТФ
Однако он выполняет не всегда в этой последовательности, что очень портит логику написания программы.
Пример индикатора и логов прикрепил.
Подскажите кто нибудь решил эту проблему или просто забили на нее!!!