[СЕРВИСДЕСК] Ошибка получения времени старшего ТФ в таймере! - страница 4

 
Vitaly Gorbunov:
Ну я бы не сказал что это костыль. Я ожидаю потока котировок от сервера иначе история не будет обновлена. Другой вариант это брать локальное время компьютера вводить поправку на тайм зону, которую можно высчитывать автоматически и в конце концов всё равно ждать обновления котировок. Да немного кривовато но не думаю что Метаквотовцы будут что то менять в МТ4. В конце концов эта проблема коннекта к серверу которую надо обрабатывать так или иначе.  

Вот. И Вы поняли, что это проблема! Но, я считаю, что ее нужно исправить и/или справку дополнить алгоритмом на все случаи жизни.

Функция получения данных не должна выдавать левые данные без ошибок и предупреждений!

Это уже не первая моя тема (предыдущая была про МТ5, вразумительных ответов по ней я до сих пор не получил) про синхронизацию и последующие зависания/ошибки. 

 
Alexey Kozitsyn:

Да, похоже такой прием работает. Как вариант использовать можно. Спасибо! Но, все таки хотелось бы нормальной работы функций.

Он сработает только в только случае, если нет пропусков баров - а такой гарантии быть не может.  Допустим за текущий час ещё не было новых котировок на сервере (а быть может и за предыдущий тоже).  Соответственно последним баром является какой-то прошлый бар.

 
Ihor Herasko:

В Вашем подходе к проверке имеется две существенные ошибки:

  1. В OnInit() индикатора невозможно получить корректные данные какого-либо ТФ, даже текущего. OnInit() индикатора при старте терминала выполняется практически в пустом окне (там может не быть даже тех данных, которые были на момент выключения терминала). Даже рыночное окружение зачастую еще недоступно. В справке достаточно много предупреждений насчет того, чего не стоит делать в OnInit(). Поэтому в ее код мало, что можно включать. Обычно это проверка значений настроечных параметров, связывание буферов индикатора с массивами и создание классов, если таковые используются. Все остальное приходится делать в OnCalculate().
  2. Все подобные проверки можно делать только после того, как хотя бы один раз произошел вызов OnCalculate.

1. Игорь, Вы код смотрели? Где я что-то получаю в OnInit()?

2. Какие проверки? Где написано, что индикатор обязательно должен хотя бы один раз использовать OnCalculate() для корректной работы? 

 
Alexey Navoykov:

Он сработает только в только случае, если нет пропусков баров - а такой гарантии быть не может.  Допустим за текущий час ещё не было новых котировок на сервере (а быть может и за предыдущий тоже).  Соответственно последним баром является какой-то прошлый бар.

Это (как я уже сказал, костыль) решение пока что лучше, чем ничего. Как я уже сказал (и доказал), есть ошибка. Чем быстрее разработчики ее исправят - тем лучше.

 
Так она не выдает левые данные, она выдает последние полученные данные и ошибка не возникнет до тех пор пока терминал не начнет получать поток котировок. В вашем случае вы пытаетесь получить данные раньше чем пошли котировки такие исключительные ситуации программист обязан обрабатывать самостоятельно. Так же как и любые обрывы связи. А что там за проблема с МТ5 очень интересно почитать?
 
Alexey Navoykov:

Он сработает только в только случае, если нет пропусков баров - а такой гарантии быть не может.  Допустим за текущий час ещё не было новых котировок на сервере (а быть может и за предыдущий тоже).  Соответственно последним баром является какой-то прошлый бар.

Приём с iBarShift позволяет выявить дыры в истории, но для этого необходимо шерстить её с каким то интервалом. Я написал для себя процедуру которая этим занимается, после этого я забыл про пропуски в МТФ программах.
 
Vitaly Gorbunov:
Так она не выдает левые данные, она выдает последние полученные данные и ошибка не возникнет до тех пор пока терминал не начнет получать поток котировок. В вашем случае вы пытаетесь получить данные раньше чем пошли котировки такие исключительные ситуации программист обязан обрабатывать самостоятельно. Так же как и любые обрывы связи. А что там за проблема с МТ5 очень интересно почитать?

Ну е-мае... Мы же уже прошли этот этап разбора. Смотрите ваш же лог:

2018.09.21 15:02:42.910 Custom indicator test XAUUSD,H1: removed
2018.09.21 15:15:27.985 test XAUUSD,H1: initialized
2018.09.21 15:15:29.520 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.552 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.589 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.605 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.636 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.667 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.705 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.736 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.768 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.805 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.837 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.868 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.906 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.937 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.969 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.006 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.038 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.069 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.106 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.138 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.169 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:31.880 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #4066
2018.09.21 15:15:31.900 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:31.940 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:31.990 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.010 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.074 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.100 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.120 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.174 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0

Последовательность. Сначала проверяем связь. Как только связь установлена, получаем время. Объясните мне, пожалуйста, какого лешего сначала возвращается ошибка 4066, а потом она не возвращается!? Что изменилось за 20 мс с последнего вызова?

 
Vitaly Gorbunov:
А что там за проблема с МТ5 очень интересно почитать?

https://www.mql5.com/ru/forum/219829

Клинч в индикаторах mql5.
Клинч в индикаторах mql5.
  • 2017.11.15
  • www.mql5.com
Недавно столкнулся с одной крайне неприятной проблемой...
 
Alexey Kozitsyn:

Это (как я уже сказал, костыль) решение пока что лучше, чем ничего. Как я уже сказал (и доказал), есть ошибка. Чем быстрее разработчики ее исправят - тем лучше.

Ну если уж говорить о лучшем костыле, то надо проверять не только текущий час, но и все предыдущие часы, прошедшие с последнего известного бара.  В противном случае вы так и застрянете на этой проверке, если котировок за текущий час не придёт.
 
Alexey Kozitsyn:

Ну е-мае... Мы же уже прошли этот этап разбора. Смотрите ваш же лог:

Последовательность. Сначала проверяем связь. Как только связь установлена, получаем время. Объясните мне, пожалуйста, какого лешего сначала возвращается ошибка 4066, а потом она не возвращается!? Что изменилось за 20 мс с последнего вызова?

Данные грузятся ошибка 4066 потом уже косяк метаквотовцев скорее всего полученные данные обрабатываются для этой ситуации ошибку не придумали. А до этого момента всё логично.