Ну так ошибка 4066 типичная проблема для МТФ индюков, терминал не подкачал данные других ТФ необходима проверка на целостность данных других ТФ.
Посмотрите внимательнее на код и на то, что я написал прежде, чем давать советы.
В коде есть проверка на наличие ошибок и есть проверка на пустые данные. А когда функция возвращает некорректные данные без ошибки - это ошибка!
Посмотрите внимательнее на код и на то, что я написал прежде, чем давать советы.
В коде есть проверка на наличие ошибок и есть проверка на пустые данные. А когда функция возвращает некорректные данные без ошибки - это ошибка!
Возможно я что то упустил покажите где вы проверяете целостность истории например в процедуре CheckCurrentHourOpenTime()
Что Вы понимаете под целостностью истории?
Я говорю о том, что есть проверка на наличие ошибок при получении значений истории. Проверка есть в каждой функции. Вот она:
//--- Проверяем, получено ли время открытия часового бара if(tempHourOpenTime==0 || err!=0) // Если время бара не получено return(false); // Возвращаем ложь
Т.е. если получено нулевое значение или ошибка - время не записывается в глобальную переменную. Вы считаете, этого не достаточно?
Суть в том, что функция SeriesInfoInteger() сначала возвращает ошибку, а на следующем запуске - НЕТ! Причем корректное значение она также не возвращает!SeriesInfoInteger() возвращает только информацию по определённому запросу, в данном случае мы просим вернуть время открытия последнего известнорго бара в истории по символу и периоду. Тут ошибки нет, что было крайним на данный момент то он и вернул. Сейчас доберусь до большого компа покажу как можно проверить целостность истории.
SeriesInfoInteger() возвращает только информацию по определённому запросу, в данном случае мы просим вернуть время открытия последнего известнорго бара в истории по символу и периоду. Тут ошибки нет, что было крайним на данный момент то он и вернул. Сейчас доберусь до большого компа покажу как можно проверить целостность истории.
В смысле тут нет ошибки!? А зачем она тогда коды ошибок "левые" выдает. Говорит, что история в порядке там, где она не в порядке...
В смысле тут нет ошибки!? А зачем она тогда коды ошибок "левые" выдает. Говорит, что история в порядке там, где она не в порядке...
Ещё раз эта функция не проверяет целостность истории! Она возвращает информацию которую смогла в ней найти. В конкретном случае она нашла часовой бар который был запрошен в момент выключения терминала. Остальная история ещё не подгрузилась.
Для проверки факта полной подкачки истории заданного ТФ достаточно использовать функцию:
bool IsTFDataReady(ENUM_TIMEFRAMES eTF) { ResetLastError(); iTime(NULL, eTF, 1); return GetLastError() == ERR_NO_ERROR; }
Если функция возвращает false, то данные по запрошенному ТФ неполные. Иначе - полные.
Ещё раз эта функция не проверяет целостность истории! Она возвращает информацию которую смогла в ней найти. В конкретном случае она нашла часовой бар который был запрошен в момент выключения терминала. Остальная история ещё не подгрузилась.
Еще раз. Об этом нигде не сказано. Это во-первых. Во-вторых, зачем она вводит тогда в заблуждение сначала показывая код ошибки 4066, а потом - нет?
Для проверки факта полной подкачки истории заданного ТФ достаточно использовать функцию:
Если функция возвращает false, то данные по запрошенному ТФ неполные. Иначе - полные.
В таймере проверяли? Видите у меня закомментированные строки? Я проверил эту функцию, она вообще никаких ошибок не показывала, причем также показывала некорректные данные. Проверю еще раз.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Задача: при запуске индикатора получить в таймере актуальные данные: время открытия недельного, дневного и часового бара. Затем записать их в глобальные переменные для дальнейшего использования. Текущий ТФ - М1.
Реализация: Время баров получаем с помощью функции SeriesInfoInteger().
Результат: В результате, если терминал НЕ БЫЛ запущен несколько часов, например, был выключен на ночь, получаем вот такой вот результат при его первом (за день) запуске:
Как видно, время получения данных 2018.09.21 11:11, и для этого времени мы получаем время открытия дня = 2018.09.20 (хотя должно быть 2018.09.21) и время открытия часа = 2018.09.20 16:00 (хотя должно быть 2018.09.21 11:00). Причем время, возвращенное терминалом, это не что иное как данные, на момент его закрытия в последний раз. Т.е. данные кешируются и возвращаются вне зависимости от того, что терминал был выключен. Причем я понимаю, если бы каждый раз возвращалась ошибка #4066 (запрошенные исторические данные в состоянии обновления) пока данные не будут обновлены, но нет, возвращаются именно ОШИБОЧНЫЕ данные! Эта ошибка возвращается только один раз, а далее - живите как хотите. На лицо явная ошибка кеширования. Прошу разработчиков (@Slava) обратить на нее внимание!
Повторюсь. Ошибочные данные появляются если запрашивать их в таймере!
Версия терминала: x64, 1090.