Ошибки, баги, вопросы - страница 3662

 
Georgiy Merts #:

То есть, получается, что при перезапуске терминала - история баров в момент инициализации индикатора ещё не готова? 

Проверить через Sleep гипотезу пробовали?

Вполне вероятно, что так и есть, и это, конечно, плохо.

 
Aleksey Vyazmikin #:
Sleep
Sleep в индикаторах не работает.
 
Aleksandr Slavskii #:
Sleep в индикаторах не работает.

Вот же диво, а я и не знал, редко ими занимаюсь. Спасибо.

 
Aleksey Vyazmikin #:

Проверить через Sleep гипотезу пробовали?

Вполне вероятно, что так и есть, и это, конечно, плохо.

У меня подобная проблема была в советнике и Sleep() не помогала. 
 
Aleksey Nikolayev #:
У меня подобная проблема была в советнике и Sleep() не помогала. 

Значит, остаётся надеется, что на проблему обратят внимание разработчики.

 
Aleksey Vyazmikin #:

Значит, остаётся надеется, что на проблему обратят внимание разработчики.

Да. Будем надеяться. 

Раз в МТ4 абсолютно тот же код нормально работает - следовательно, это системная проблема. 

Пока что попытаюсь вынести инициализацию индикатора - в отдельную процедуру, и потом запускать её на первом пришедшем тике. Если получится - отпишусь. 

 

Да, всё верно.

Обращаю внимание разработчиков, ошибка.

При запуске индикатора при работающем MT5 - все проходит штатно, и без ошибок.

Если оставить индикатор на графике, и перезапустить МТ5, то в момент вызова функции Init() индикатора - таймсерии ещё не готовы:

  • Запрос функции SymbolIsSynchronized() выдаёт false. 
  • Запрос функции SeriesInfoInteger(strSymbolFullName,etTimeframe,SERIES_BARS_COUNT,lResult) выдаёт false, при этом GetLastError() возвращает 4401 (ERR_HISTORY_NOT_FOUND). 

Лично я пока обошёл проблему повторной инициализацией при первом вызове OnCalculate(). Если во время OnInit() не получилось инициализироваться, то я ещё раз проделываю все нужные действия в первом вызове OnCalculate - в этом случае и символ синхронизирован, и количество баров выдаётся верно.

 
Georgiy Merts #:

Да, всё верно.

Обращаю внимание разработчиков, ошибка.

При запуске индикатора при работающем MT5 - все проходит штатно, и без ошибок.

Если оставить индикатор на графике, и перезапустить МТ5, то в момент вызова функции Init() индикатора - таймсерии ещё не готовы:

  • Запрос функции SymbolIsSynchronized() выдаёт false. 
  • Запрос функции SeriesInfoInteger(strSymbolFullName,etTimeframe,SERIES_BARS_COUNT,lResult) выдаёт false, при этом GetLastError() возвращает 4401 (ERR_HISTORY_NOT_FOUND). 

Лично я пока обошёл проблему повторной инициализацией при первом вызове OnCalculate(). Если во время OnInit() не получилось инициализироваться, то я ещё раз проделываю все нужные действия в первом вызове OnCalculate - в этом случае и символ синхронизирован, и количество баров выдаётся верно.

проверка баров всегда и была в OnCalculate

на достаточность для расчета и т.д.

 
lynxntech #:

проверка баров всегда и была в OnCalculate

на достаточность для расчета и т.д.

Хм... А если их количество уже нужно в OnInit() ?

Необходимо выполнить инициализационные действия, в зависимости от того, достаточно ли имеется баров. Более того, некоторые подготовительные действия могут потребоваться со значениями цен баров. А у нас, выходит, баров-то ещё и нет... 

Если запускать индикатор на работающем МТ5 - всё проходит нормально. Проблемы возникают только если терминал перезапускается. Если при OnInit() символ может быть ещё не синхронизирован, и бары могут быть ещё недоступны - какой смысл в инициализации вобще? 

 
Georgiy Merts #:

Хм... А если их количество уже нужно в OnInit() ?

Необходимо выполнить инициализационные действия, в зависимости от того, достаточно ли имеется баров. Более того, некоторые подготовительные действия могут потребоваться со значениями цен баров. А у нас, выходит, баров-то ещё и нет... 

Если запускать индикатор на работающем МТ5 - всё проходит нормально. Проблемы возникают только если терминал перезапускается. Если при OnInit() символ может быть ещё не синхронизирован, и бары могут быть ещё недоступны - какой смысл в инициализации вобще? 

В mt5, если мне не изменяет память, так было всегда.
А смысл инициализации - подготовить буферы и, возможно, значения каких-либо переменных.