Событие - история в терминале обновлена?

 
Проблема в корректном обновлении автономного графика,подвешенного как индикатор.
Вот по шагам ,как я это понимаю:
1. После запуска терминала загружается история из файла .hst
2. После коннекта происходит обновление нулевого бара и как следствие- первого
3. Вся остальная история остается КАКОЕ-ТО ВРЕМЯ БЕЗ ИЗМЕНЕНИЙ ,а тики тем временем
начинают поступать и соответственно начинает выполняться функция Старт...
4. Обновление автономного графика после простоя должно выполниться только после
полного обновления истории...Как правильно поймать это событие?

Хорошо было бы,если бы ф-ция Init() срабатывала после обновления истории,или была бы
специальная ф-ция для отслеживания этого события, а то приходится изгаляться типа проверки
на изменение второго бара,что не всегда работает корректно...
Подскажите изящное решение,если такое существует...
 
 
BMG, сформулируйте задачу.
Из поста я не совсем понял, как вы организовали работу с автономным файлом.
- кто его пишет?
- кто его обновляет?
- по какому событию (тик, или в цикле каждые n мс)?

Проблемы возникают при запуске МТ?
- некорректно записывается история?
- некорректно записывается 0-й бар?
 
BMG, сформулируйте задачу.
Из поста я не совсем понял, как вы организовали работу с автономным файлом.
- кто его пишет?
- кто его обновляет?
- по какому событию (тик, или в цикле каждые n мс)?

Проблемы возникают при запуске МТ?
- некорректно записывается история?
- некорректно записывается 0-й бар?


Запись и обновление автономного файла осуществляется индикатором.

После запуска МТ автономно открытый график выглядит так,как он выглядел перед
закрытием МТ (или при отключении связи).
После обновления истории автономный файл должен быть полностью перезаписан и далее
начинает работать алгоритм индикатора по событию - приход тика.
Проблема в том,что я не могу корректо (однозначно) отловить событие - завершение обновления
исторических данных в терминале,т.е. не могу поймать момент,когда надо запустить перезапись
автономного файла.
 
Можно попробовать использовать ArrayCopySeries - если данные не обновлены GetLastError вернет ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления).

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

А ещё такая ситуация может возникать при сбое связи. Недавно в теме "Что возвращают функции Lowest и Highest" я приводил результат принта:
if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift]=",High[shift],", Low[shift]=",Low[shift]);


Терминал был закрыт и снова запущен через несколько минут. Фрагмент лога:

2006.10.31 23:58:26	CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26	CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26	CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26	CZZ2 EURUSD,M1: shift=1, Bars=38233, Time[shift]=2006.10.31 22:50, High[shift]=1.2763, Low[shift]=1.2762
2006.10.31 23:58:26	CZZ2 EURUSD,M1: shift=2, Bars=38233, Time[shift]=2006.10.31 22:49, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26	CZZ2 EURUSD,M1: shift=3, Bars=38233, Time[shift]=2006.10.31 22:47, High[shift]=1.2763, Low[shift]=1.2762
2006.10.31 23:58:26	CZZ2 EURUSD,M1: shift=4, Bars=38233, Time[shift]=2006.10.31 22:45, High[shift]=1.2763, Low[shift]=1.2762
2006.10.31 23:58:25	CZZ2 EURUSD,M1: shift=0, Bars=38230, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:25	CZZ2 EURUSD,M1: shift=1, Bars=38230, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762
2006.10.31 23:58:23	CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762
2006.10.31 23:58:22	CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762


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

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


думаю есть такой выход для индикатора:
пришел новый тик (0 бар), перед тем как определять интервал на котором должен рассчитаться индикатор, проверка на "дырку", если она есть - выдаем код ошибки расчета индикатора , соответсвенно эксперт не торгует, ждем подкачку и по новой...

2solandr 10.11.06 19:45

komposter - большой специалист по автономным графикам:

кажись "по автономным графикам:" здесь излишне :)
 
думаю есть такой выход для индикатора:
пришел новый тик (0 бар), перед тем как определять интервал на котором должен рассчитаться индикатор, проверка на "дырку", если она есть - выдаем код ошибки расчета индикатора , соответсвенно эксперт не торгует, ждем подкачку и по новой...

Боюсь ситуация сложнее. Если связь прервалась внутри, скажем, часового бара и восстановилась внутри же следующего, то простая проверка на дырку ничего не даст - бары будут все, но High, Low, Close предпоследнего и Open, High, Low последнего могут быть неверными. Как вариант, можно вешать специальный индикатор на минутки и вести глобальную переменную "глубина хорошей истории". Но поскольку дыры в МТ - штатная ситуация, это приведёт к браковке значительного числа баров. Другими словами, решение можно будет принимать только с той или иной степенью вероятности, скажем в зависимости от времени суток. Другой возможный вероятностный подход - проверять интервал между тиками. Опять же, решение о качестве бара принимать в зависимости от времени суток и дня недели. То есть как бы небольшой искусственный интеллект нужен :). Подчеркну: имеется в виду именно автоматическая торговля. Вручную ситуация фильтруется без особых проблем :).
 
ну тогда как вариант, интервал времени между временем последнего полученного тиком и предпоследним, если очень "большой", то сначала RefreshRates( ) , а затем уже расчет индикатора, время задаешь сам, можно даже несколько вариантов сделать, как ты говоришь "в зависимости от времени суток и дня недели".
 
Или короткая скользящая средняя по нескольким последним интервалам. Может в норме она не будет меняться слишком резко? Хотя кто знает. Надо изучать вопрос.
Причина обращения: