Ошибка функции IsStopped() при первом переключении периода или смены символа

 

Подчеркиваю, при первом после запуска советника переключении мышью периода графика (например, с М5 на М15) не происходит изменение значения функции IsStopped() с false на true.

Значение переменной reason в функции OnDeinit(const int reason) при этом равно 5 вместо правильного значения 3.

Как быть? Можно ли чем-то заменить функцию IsStopped() для установления наступления событий смены символа и периода графика?

Благодарю за поддержку. 

 

MT4, build 670, 32bit; Windows 8.1, 64bit 

 

Проверил:

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. Указывая на ошибку, было бы неплохо указать способ ее воспроизведения.

 
Scriptong:

Проверил:

 Переключаю период графика, в журнале следующее:

 Все нормально, IsStopped отрабатывает, причина деинициализации правильная. Возможно, что-то не так в Вашем коде. Как проверяли?

 

P. S. Указывая на ошибку, было бы неплохо указать способ ее воспроизведения.


На проверку и анализ уйдет некоторое время. О результатах обязательно напишу. Спасибо.
 
Scriptong:

Проверил:

 Переключаю период графика, в журнале следующее:

 Все нормально, IsStopped отрабатывает, причина деинициализации правильная. Возможно, что-то не так в Вашем коде. Как проверяли?

 

P. S. Указывая на ошибку, было бы неплохо указать способ ее воспроизведения.


С функцией IsStopped() не все так просто, как может показаться на первый взгляд.

Спасибо за Ваш пример кода. Сейчас мне уже нет смысла его повторять, поскольку схематично у меня то же самое. Но есть одно толстое обстоятельство, которое я обнаружил, благодаря Вашему посту с положительным тестированием.

У меня до функции IsStopped() стоит обращение к функции dll, которое генерирует судя по всему что-то сходное с оператором return. Это видно по журналу, в котором фиксируется повторная инициализация этой функцией запуска советника. При этом reason = 5. Это для меня не плохо, однако, новость. Я нигде не читал о такой реакции МТ4 на запуск внешней функции. Я ставил функцию IsStopped() также до моей dll-ешной функции, и тогда она срабатывала правильно, как у Вас, давая reason = 3.

Что это за явление? 

 
dokpiknik:


С функцией IsStopped() не все так просто, как может показаться на первый взгляд.

Спасибо за Ваш пример кода. Сейчас мне уже нет смысла его повторять, поскольку схематично у меня то же самое. Но есть одно толстое обстоятельство, которое я обнаружил, благодаря Вашему посту с положительным тестированием.

У меня до функции IsStopped() стоит обращение к функции dll, которое генерирует судя по всему что-то сходное с оператором return. Это видно по журналу, в котором фиксируется повторная инициализация этой функцией запуска советника. При этом reason = 5. Это для меня не плохо, однако, новость. Я нигде не читал о такой реакции МТ4 на запуск внешней функции. Я ставил функцию IsStopped() также до моей dll-ешной функции, и тогда она срабатывала правильно, как у Вас, давая reason = 3.

Что это за явление? 


Хотя бы намекните название вызываемой функции, а лучше, покажите ее код.
 
Scriptong:

Хотя бы намекните название вызываемой функции, а лучше, покажите ее код.


Scriptong, спасибо за участие. Тему снимаю, поскольку нашел ошибку в своем коде. IsStopped() работает без ошибок.

Сожалею о том, что ошибся в выводе относительно работоспособности этой функции.

Между тем, Ваш небольшой правильно работающий скрипт стал ключевым в нахождении мной собственной ошибки, поскольку позволил усомниться в правильности сделанного мной скороспелого вывода. Спасибо.

 
Scriptong:

Хотя бы намекните название вызываемой функции, а лучше, покажите ее код.


И все-таки ошибка, похоже, есть. Я теперь так, осторожно выскажусь. Только ошибка не там, где я изначально предполагал, то есть в функции 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. Интересно, что если два раза подряд вызвать свойства эксперта, то баг при переключении тоже повторяется два раза. 

 
Scriptong:

 

Только вот с выводами Вы поторопились. Баг в том, ...


В моем последнем посте, из Вашего ответа на который я взял цитату, делается единственный вывод: "По-моему, это все-таки bug", то есть предполагается только наличие бага, а не его свойство.

А Вы, как мне показалось, подтверждаете, что баг есть, и наши выводы непротиворечивы. Или я что-то неправильно понял?

Это, разумеется, несущественная риторика. Важно другое. Важно обратить внимание разработчиков на этот баг, тем самым содействуя улучшению платформы всем нам во благо. 

 
dokpiknik:


И все-таки ошибка, похоже, есть. Я теперь так, осторожно выскажусь. Только ошибка не там, где я изначально предполагал, то есть в функции IsStopped(). В другом месте. Для обнаружения ошибки проделаем следующее:

1. Запускаем Ваш советник Blank:

 

2. Жмем кнопку F7 ->  появляется окно со свойствами советника Blank

3. Жмем на ОК -> закрывается  окно со свойствами советника Blank

Это была подготовка. 

4.  Переключаем период с М5 на М30 -> обе клавиши запали и терминал виснет секунд на 7

  

После этого читаем в журнале:

 После этого опять переключение периодов работает нормально.

Та же история с переключением символов.

По-моему, это все-таки bug. 

Спасибо за сообщение.

Мы исправили выставление стоп-флага после нажатия OK в свойствах эксперта

 
stringo:

Спасибо за сообщение.

Мы исправили выставление стоп-флага после нажатия OK в свойствах эксперта



Вашим ответом тема закрывается. Спасибо и успехов всему Team разработчиков.
Причина обращения: