Проверил:
int OnInit() { while (!IsStopped()) Sleep(10); Print("Stop!"); return INIT_SUCCEEDED; } void OnDeinit(const int reason) { Print("reason = ", reason); }
Переключаю период графика, в журнале следующее:
21:24:02 Expert Blank USDCHF,M5: loaded successfully 21:24:05 Blank USDCHF,M5: Stop! 21:24:05 Blank USDCHF,M5: initialized 21:24:05 Blank USDCHF,M5: uninit reason 3 21:24:05 Blank USDCHF,M5: reason = 3
Все нормально, IsStopped отрабатывает, причина деинициализации правильная. Возможно, что-то не так в Вашем коде. Как проверяли?
P. S. Указывая на ошибку, было бы неплохо указать способ ее воспроизведения.
Проверил:
Переключаю период графика, в журнале следующее:
Все нормально, IsStopped отрабатывает, причина деинициализации правильная. Возможно, что-то не так в Вашем коде. Как проверяли?
P. S. Указывая на ошибку, было бы неплохо указать способ ее воспроизведения.
На проверку и анализ уйдет некоторое время. О результатах обязательно напишу. Спасибо.
Проверил:
Переключаю период графика, в журнале следующее:
Все нормально, IsStopped отрабатывает, причина деинициализации правильная. Возможно, что-то не так в Вашем коде. Как проверяли?
P. S. Указывая на ошибку, было бы неплохо указать способ ее воспроизведения.
С функцией IsStopped() не все так просто, как может показаться на первый взгляд.
Спасибо за Ваш пример кода. Сейчас мне уже нет смысла его повторять, поскольку схематично у меня то же самое. Но есть одно толстое обстоятельство, которое я обнаружил, благодаря Вашему посту с положительным тестированием.
У меня до функции IsStopped() стоит обращение к функции dll, которое генерирует судя по всему что-то сходное с оператором return. Это видно по журналу, в котором фиксируется повторная инициализация этой функцией запуска советника. При этом reason = 5. Это для меня не плохо, однако, новость. Я нигде не читал о такой реакции МТ4 на запуск внешней функции. Я ставил функцию IsStopped() также до моей dll-ешной функции, и тогда она срабатывала правильно, как у Вас, давая reason = 3.
Что это за явление?
С функцией IsStopped() не все так просто, как может показаться на первый взгляд.
Спасибо за Ваш пример кода. Сейчас мне уже нет смысла его повторять, поскольку схематично у меня то же самое. Но есть одно толстое обстоятельство, которое я обнаружил, благодаря Вашему посту с положительным тестированием.
У меня до функции IsStopped() стоит обращение к функции dll, которое генерирует судя по всему что-то сходное с оператором return. Это видно по журналу, в котором фиксируется повторная инициализация этой функцией запуска советника. При этом reason = 5. Это для меня не плохо, однако, новость. Я нигде не читал о такой реакции МТ4 на запуск внешней функции. Я ставил функцию IsStopped() также до моей dll-ешной функции, и тогда она срабатывала правильно, как у Вас, давая reason = 3.
Что это за явление?
Хотя бы намекните название вызываемой функции, а лучше, покажите ее код.
Хотя бы намекните название вызываемой функции, а лучше, покажите ее код.
Scriptong, спасибо за участие. Тему снимаю, поскольку нашел ошибку в своем коде. IsStopped() работает без ошибок.
Сожалею о том, что ошибся в выводе относительно работоспособности этой функции.
Между тем, Ваш небольшой правильно работающий скрипт стал ключевым в нахождении мной собственной ошибки, поскольку позволил усомниться в правильности сделанного мной скороспелого вывода. Спасибо.
Хотя бы намекните название вызываемой функции, а лучше, покажите ее код.
И все-таки ошибка, похоже, есть. Я теперь так, осторожно выскажусь. Только ошибка не там, где я изначально предполагал, то есть в функции IsStopped(). В другом месте. Для обнаружения ошибки проделаем следующее:
1. Запускаем Ваш советник Blank:
int OnInit() { while (!IsStopped()) Sleep(10); Print("Stop!"); return INIT_SUCCEEDED; } void OnDeinit(const int reason) { Print("reason = ", reason); }
2. Жмем кнопку F7 -> появляется окно со свойствами советника Blank
3. Жмем на ОК -> закрывается окно со свойствами советника Blank
Это была подготовка.
4. Переключаем период с М5 на М30 -> обе клавиши запали и терминал виснет секунд на 7
После этого читаем в журнале:
2014.09.01 20:13:38.490 Blank USDCHF,M5: reason = 5 2014.09.01 20:13:38.490 Blank USDCHF,M5: uninit reason 5 2014.09.01 20:13:38.490 Blank USDCHF,M5: initialized 2014.09.01 20:13:38.490 Blank USDCHF,M5: Stop! 2014.09.01 20:13:29.238 Expert Blank USDCHF,M5: loaded successfully
После этого опять переключение периодов работает нормально.
Та же история с переключением символов.
По-моему, это все-таки bug.
Вот это уже другое дело.
Только вот с выводами Вы поторопились. Баг в том, что после нажатия ОК не происходит деинициализация советника. В журнале нет об этом записи. И только потом, когда произошло переключение таймфреймов, терминал вспоминает о том, что нужно было провести деинициализацию в прошлый раз. И именно о ней он потом пишет.
P. S. Интересно, что если два раза подряд вызвать свойства эксперта, то баг при переключении тоже повторяется два раза.
Только вот с выводами Вы поторопились. Баг в том, ...
В моем последнем посте, из Вашего ответа на который я взял цитату, делается единственный вывод: "По-моему, это все-таки bug", то есть предполагается только наличие бага, а не его свойство.
А Вы, как мне показалось, подтверждаете, что баг есть, и наши выводы непротиворечивы. Или я что-то неправильно понял?
Это, разумеется, несущественная риторика. Важно другое. Важно обратить внимание разработчиков на этот баг, тем самым содействуя улучшению платформы всем нам во благо.
И все-таки ошибка, похоже, есть. Я теперь так, осторожно выскажусь. Только ошибка не там, где я изначально предполагал, то есть в функции IsStopped(). В другом месте. Для обнаружения ошибки проделаем следующее:
1. Запускаем Ваш советник Blank:
2. Жмем кнопку F7 -> появляется окно со свойствами советника Blank
3. Жмем на ОК -> закрывается окно со свойствами советника Blank
Это была подготовка.
4. Переключаем период с М5 на М30 -> обе клавиши запали и терминал виснет секунд на 7
После этого читаем в журнале:
После этого опять переключение периодов работает нормально.
Та же история с переключением символов.
По-моему, это все-таки bug.
Спасибо за сообщение.
Мы исправили выставление стоп-флага после нажатия OK в свойствах эксперта
Спасибо за сообщение.
Мы исправили выставление стоп-флага после нажатия OK в свойствах эксперта
Вашим ответом тема закрывается. Спасибо и успехов всему Team разработчиков.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подчеркиваю, при первом после запуска советника переключении мышью периода графика (например, с М5 на М15) не происходит изменение значения функции IsStopped() с false на true.
Значение переменной reason в функции OnDeinit(const int reason) при этом равно 5 вместо правильного значения 3.
Как быть? Можно ли чем-то заменить функцию IsStopped() для установления наступления событий смены символа и периода графика?
Благодарю за поддержку.
MT4, build 670, 32bit; Windows 8.1, 64bit