Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
С чего это?
Просто не надо вызывать EventKillTimer вместе с ExpertRemove и не будет никакого бага. Документацию надо читать. Внимательно.
Природу этого "не бага" опишите, пожалуйста. По какой причине EventKillTimer где-то не должен вызываться?
Обычно эта функция должна вызываться из функции OnDeinit() в том случае, если в функции OnInit() была вызвана функция EventSetTimer(). Либо должна вызываться из деструктора класса, если в конструкторе этого класса вызывается функция EventSetTimer().
Каждый эксперт и каждый индикатор работает со своим таймером, и получает события только от него. При завершении работы mql5-программы таймер уничтожается принудительно, если он был создан, но не был отключен функцией EventKillTimer().
Можно же в той же OnChartEvent включать и выключать таймер, когда вздумается.
OnTick() запустите хоть раз. ExpertRemove() не удаляет советник, а взводит флаг необходимости удаления на следующем тике.
Я не помню где и кто из разработчиков пояснял, но было сказано что эксперт выгружается при первом return (явном или неявном) после взвода флага удаления эксперта.
fxsaber:
А поменять местами удаление эксперта и удаление таймера не пробовали?
А поменять местами удаление эксперта и удаление таймера не пробовали?
Не влияет на результат.
Я не помню где и кто из разработчиков пояснял, но было сказано что эксперт выгружается при первом return (явном или неявном) после взвода флага удаления эксперта.
ОК, я ошибся в одном (писал ответ по памяти) - эксперт выгружается при наступлении следующего события (что тут означает "событие" - точно не ясно, но предполагаю - следующая строка кода за командой ExpertRemove())
Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.
Но чтобы оно наступило (событие это), эксперт-то должен быть запущен хотя бы раз.
Природу этого "не бага" опишите, пожалуйста. По какой причине EventKillTimer где-то не должен вызываться?
Можно же в той же OnChartEvent включать и выключать таймер, когда вздумается.
Из документации
Примечание
Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.
В вышеуказанном примере удаляется таймер. Нет обработчика OnTick. Нет обработчика OnChartEvent. Вообще нет других обработчиков. Это значит, что данный эксперт после удаления таймера больше не получит событий.
Во-вторых, какой смысл удалять таймер тут же, если был вызов ExpertRemove?
В-третьих, в документации явно даны рекомендации по удалению таймера. Если таймер запущен в OnInit, то лучше его удалять в OnDeinit.
ОК, я ошибся в одном (писал ответ по памяти) - эксперт выгружается при наступлении следующего события (что тут означает "событие" - точно не ясно, но предполагаю - следующая строка кода за командой ExpertRemove())
Но чтобы оно наступило (событие это), эксперт-то должен быть запущен хотя бы раз.
Выделенное я понимаю так, что следующее событие и не может быть обработано, поскольку эксперт будет уже выгружен. А начало выгрузки происходит по завершению обработки события из которого была вызвана выгрузка советника.
Из документации
В вышеуказанном примере удаляется таймер. Нет обработчика OnTick. Нет обработчика OnChartEvent. Вообще нет других обработчиков. Это значит, что данный эксперт после удаления таймера больше не получит событий.
Если добавить обработчики, ничего не изменится. Даже OnDeinit не сработает.
Во-вторых, какой смысл удалять таймер тут же, если был вызов ExpertRemove?
Если наступило событие A - отключить таймер. Если наступило B - выгрузить эксперт. Логично, что A и B иногда могу выполняться одновременно.
В-третьих, в документации явно даны рекомендации по удалению таймера. Если таймер запущен в OnInit, то лучше его удалять в OnDeinit.
Так это только рекомендация.
Сейчас получается так, что в какой нибудь f1 произошло выключение таймера. В какой-нибудь f2 - выгрузка советника. И если f1 и f2 вызвались в результате каких-то условий в OnTimer, то советник останется висеть, при этом не будет реагировать на какие-либо события. Ручное снятие запустит OnDeinit и глобальный деструктор.
2280 немецкий:
Разрешение меню ошибки перевода
Поправили. Спасибо!
Билд 2280 ФОРТС
Ошибка установки отложенного ордера Buy по нижнему пределу цены
До билда 2280 все нормально работало