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

Vladislav Boyko #:
Докажите примером, пожалуйста
Я с 2022 не писал под мкл, возможно, разработчики за это время "улучшили" компиллятор. Вообще, виртуальность метода определяет, как будет вызываться метод через указатель/ссылку на объект.

PS.
В прикреплённом файле кусок код, который компилироваться без ошибок. Там и виртуальные методы и не виртуальный.

PPS.
Смотрю, не виртуальный метод, действительно, не оверрайден.
Файлы:
fxsaber # :

override позволяет понять, что это виртуальный метод. Но два нюанса.

  1. Читаю слева-направо. Если входных много и они располагаются на нескольких строках, то override могу не увидеть.
  2. Когда создаю новый виртуальный метод не в базовом классе, то хочется видеть одинаковость синтаксиса и с переопределенными виртуальными методами.

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

Тема C++ для справки .

Should I use virtual, override, or both keywords?
Should I use virtual, override, or both keywords?
  • 2016.10.08
  • Daniel Daniel 2,463 2 2 gold badges 11 11 silver badges 6 6 bronze badges
  • stackoverflow.com
In the last weeks something is bugging my brain about and . I've learned that when you do inheritance with virtual function you have to add to let the compiler know to search for the right function. Afterwards I learned also that in c++ 11 there is a...

Всех приветствую. Такая проблема. 

Есть индикатор, который в функции int OnInit() запрашивает число баров по текущему символу: 

SeriesInfoInteger(strSymbolName,etTimeframe,SERIES_BARS_COUNT,lResult)

Потом запрашиваются бары, и по ним строится индикатор. 

Проблема:

При запуске индикатора - всё проходит нормально. Однако, если закрыть терминал, и перезапустить его (индикатор остался на графике), то функция запроса баров SeriesInfoInteger() в функции OnInit() возвращает false, а запрос GetLastError() возвращает код 4401 (ERR_HISTORY_NOT_FOUND). 

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

Кто-нибудь с таким сталкивался? Что я делаю не так? Вроде раньше у меня подобного никогда не было... 

Интересно, что в МТ4 тот же код работает нормально, и при перезапуске терминала - функция возвращает верный ответ, и дальше индикатор работает корректно. Как в МТ5 убедиться внутри функции OnInit, что бары таймсерии есть, и узнать, сколько их? (Так, чтобы при перезапуске терминала - всё возвращалось правильно)

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 - в этом случае и символ синхронизирован, и количество баров выдаётся верно.