"MQL4: Графики без "дыр""
"MQL4: Всем, кто хотел видеть графики без пропущенных баров - сюда =)"
Из поста я не совсем понял, как вы организовали работу с автономным файлом.
- кто его пишет?
- кто его обновляет?
- по какому событию (тик, или в цикле каждые n мс)?
Проблемы возникают при запуске МТ?
- некорректно записывается история?
- некорректно записывается 0-й бар?
Из поста я не совсем понял, как вы организовали работу с автономным файлом.
- кто его пишет?
- кто его обновляет?
- по какому событию (тик, или в цикле каждые n мс)?
Проблемы возникают при запуске МТ?
- некорректно записывается история?
- некорректно записывается 0-й бар?
Запись и обновление автономного файла осуществляется индикатором.
После запуска МТ автономно открытый график выглядит так,как он выглядел перед
закрытием МТ (или при отключении связи).
После обновления истории автономный файл должен быть полностью перезаписан и далее
начинает работать алгоритм индикатора по событию - приход тика.
Проблема в том,что я не могу корректо (однозначно) отловить событие - завершение обновления
исторических данных в терминале,т.е. не могу поймать момент,когда надо запустить перезапись
автономного файла.
Ну или просто при загрузке делать паузу (что, конечно, хуже)...
А ещё такая ситуация может возникать при сбое связи. Недавно в теме "Что возвращают функции 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
кажись "по автономным графикам:" здесь излишне :)
пришел новый тик (0 бар), перед тем как определять интервал на котором должен рассчитаться индикатор, проверка на "дырку", если она есть - выдаем код ошибки расчета индикатора , соответсвенно эксперт не торгует, ждем подкачку и по новой...
Боюсь ситуация сложнее. Если связь прервалась внутри, скажем, часового бара и восстановилась внутри же следующего, то простая проверка на дырку ничего не даст - бары будут все, но High, Low, Close предпоследнего и Open, High, Low последнего могут быть неверными. Как вариант, можно вешать специальный индикатор на минутки и вести глобальную переменную "глубина хорошей истории". Но поскольку дыры в МТ - штатная ситуация, это приведёт к браковке значительного числа баров. Другими словами, решение можно будет принимать только с той или иной степенью вероятности, скажем в зависимости от времени суток. Другой возможный вероятностный подход - проверять интервал между тиками. Опять же, решение о качестве бара принимать в зависимости от времени суток и дня недели. То есть как бы небольшой искусственный интеллект нужен :). Подчеркну: имеется в виду именно автоматическая торговля. Вручную ситуация фильтруется без особых проблем :).
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот по шагам ,как я это понимаю:
1. После запуска терминала загружается история из файла .hst
2. После коннекта происходит обновление нулевого бара и как следствие- первого
3. Вся остальная история остается КАКОЕ-ТО ВРЕМЯ БЕЗ ИЗМЕНЕНИЙ ,а тики тем временем
начинают поступать и соответственно начинает выполняться функция Старт...
4. Обновление автономного графика после простоя должно выполниться только после
полного обновления истории...Как правильно поймать это событие?
Хорошо было бы,если бы ф-ция Init() срабатывала после обновления истории,или была бы
специальная ф-ция для отслеживания этого события, а то приходится изгаляться типа проверки
на изменение второго бара,что не всегда работает корректно...
Подскажите изящное решение,если такое существует...