Теперь покажу, как это проблема выглянет на практике. Я полностью переделал советника. Сделал возможность как ловить новые тики в OnTimer так и в OnBookEvent.
В обзоре рынка 45 символов. Большинство не ликвидные.
Вот результат с ловлей новых тиков в OnBookEvent:
РЕКОРДная Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 494013 милесекундa.
CR 018:51:47.334 ProverkaAktyalnostiTikov (ALRS,H1) Получен НОВЫЙ тик по символу SNGR-3.19 time_msc= 2019.03.1818:41:47.988
HN 018:51:47.335 ProverkaAktyalnostiTikov (ALRS,H1) ХОТЯ до этого был получeн тик ARMD time_msc 2019.03.1818:50:02.001
Т.е в 18:50 по TimeCurrent был пойман новый тик по символу SNGR-3.19 с временем 18:41.
Дальше идут замеры локального времени компьютера в момент:
1) получения нового тика т.е в момент последнего вызова CopyTick (или SymbolInfo в зависимости от настроек )
2) В момент ПРЕДпоследнего вызова.
18:51:47.335 ProverkaAktyalnostiTikov (ALRS,H1) Локальное время получения нового тика по символу. 2019.03.1818:51:47.33418:51:47.335 ProverkaAktyalnostiTikov (ALRS,H1) Предпоследние Локальное время попытки получить новый тик по символу 2019.03.1818:41:47.204
Т.е в данном случае проблема произошла из-за того, функция получения нового просто не вызывалась 10 минут.... А это произошло из-за того, что событие OnBookEvent для символа SNGR-3.19 не генерировалось 10 минут.
Наверное терминал ставил его в очередь событий, оно каким то образом исчезло из этой очереди. С OnTimer таких косяков нет. Да бывает придет тик с задержкой в секунд в 20.
Для чего Вам нужно сравнивать время тивов с локальным временем?
Хочу знать максимальную задержку между моментом возникновения тика на сервере и временем когда он придет в терминал. И как это время можно минимизировать.
Это знание можно использовать при написании своего тестера. А может даже получиться озадачить разработчиков большими задержками.
TimeCurrent() - Время последнего тика по символу будет меньше времени задержки, поэтому его можно использовать. Использование локального времени в первой версии было не удачной идеей.
Хочу знать максимальную задержку между моментом возникновения тика на сервере и временем когда он придет в терминал. И как это время можно минимизировать.
Это знание можно использовать при написании своего тестера. А может даже получиться озадачить разработчиков большими задержками.
Внимание вопрос: Считаете ли вы нормальным в 18:00:00 по TimeCurrent() не знать о тике со временем 17:59:00 ?
Считаю, что вопрос спорный. Хочется, чтобы тиковая последовательность удовлетворяла как минимум следующим критериям:
1. Была последовательной, т.е. время каждого последующего тика >= времени предыдущего тика;
2. Актуальность. Т.е. время последнего пришедшего тика как можно ближе к текущему моменту;
Похоже, что проблема у Вас именно со вторым пунктом.
Спорность п.2 заключается в следующем: хочется, чтобы время от формирования тика на сервере до получения его мною (лаг) было минимальным, дабы я смог быстрее других его обработать и принять торговое решение. Но! Если лаг одинаков для всех участников торгов - тогда проблем нет (насколько я это понимаю). Т.е. проблема у сервера брокера, но все в равных условиях. Если же кто-то информацию о тике в 17:59:00 получил в 17:59:01, а я не получил даже в 18:00 - вот это уже большая проблема.
И вот тут вопрос. В чем проблема (и есть ли она)? В сервере брокера, который долго не отдает тик (всем), или в МТ5, который долго его не получает.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Есть исходный код с комментариями.
Лень посмотреть? Или что-то не понятно?
Посмотрел. Идею я и без кода понял. Не понятно почему вы мне советуете :
Нужно добавить в Обзор рынка самые ликвидные инструменты.
Затем, добавить стаканы этих инструментов.
И, при срабатывании OnBookEvent(), копировать 1 тик (последний) там будет время и тут же брать локальное время и сравнивать.
Чем ваш метод лучше ?
Посмотрел. Идею я и без кода понял. Не понятно почему вы мне советуете :
Чем ваш метод лучше ?
Потому что он правильный!
Я ошибся, не локальное время, а время сервера.
1. Тики приходят в терминал пакетами.
2. Каждый последующий пакет может содержать тики, которые не были "уложены" в предыдущий пакет, но имеют время совпадающее с предыдущим.
3. OnBookEvent() срабатывает по приходу любого тика (Изменение цены, объёма ) т.е каждого тика. (вы запускаете таймер - уже плохо).
4. Вы используете локальное время компа, что вообще не нужно!
Вот, собственно, все что нужно для торговли (проверка торгового времени сессий)
Добавлено
Если нужна миллисекундная точность, то так
Добавлено
Но все это не даст желаемого результата (границы торгового времени), потому что
тиков может и не быть в торговую сессию, а время не останавливается.
Допустим, кто-то убрал свой отложенный ордер, стакан изменился,
есть сигнал, а там "старая" корировка (время не текущее).
Терминал не транслирует точное время сервера.
Вы меня не понимаете. Давайте с самого начала.
1) В программе вы вызываете функцию TimeCurrent() и получаете время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.
Пусть это будет 18:00:00
2) Следующей командой вы получаете время последнего тика по SBER.
Пусть это будет 17:58:00
3) Проходит немного времени и вы опять запрашиваете время последнего тика по SBER.
Пусть это будут 17:59:00
Внимание вопрос: Считаете ли вы нормальным в 18:00:00 по TimeCurrent() не знать о тике со временем 17:59:00 ?
Вы меня не понимаете. Давайте с самого начала.
1) В программе вы вызываете функцию TimeCurrent() и получаете время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.
Пусть это будет 18:00:00
2) Следующей командой вы получаете время последнего тика по SBER.
Пусть это будет 17:58:00
3) Проходит немного времени и вы опять запрашиваете время последнего тика по SBER.
Пусть это будут 17:59:00
Внимание вопрос: Считаете ли вы нормальным в 18:00:00 по TimeCurrent() не знать о тике со временем 17:59:00 ?
В коде, который я привел можно учитывать все тике (не проблема)
В последнем коде используется не TineCurrent(), а TimeTradeServer() - это мремя нужно лишь для того,
чтобы проверить тик с точностью до ДНЯ и ВСЁ!
Давайте начнем сначала.
Вообще что Вы хотите сделать, узнать?
Для чего Вы стали сравнивать время тика с локальным временем.
Какова изначальная цель?
Теперь покажу, как это проблема выглянет на практике. Я полностью переделал советника. Сделал возможность как ловить новые тики в OnTimer так и в OnBookEvent.
В обзоре рынка 45 символов. Большинство не ликвидные.
Вот результат с ловлей новых тиков в OnBookEvent:
Т.е в 18:50 по TimeCurrent был пойман новый тик по символу SNGR-3.19 с временем 18:41.
Дальше идут замеры локального времени компьютера в момент:
1) получения нового тика т.е в момент последнего вызова CopyTick (или SymbolInfo в зависимости от настроек )
2) В момент ПРЕДпоследнего вызова.
Т.е в данном случае проблема произошла из-за того, функция получения нового просто не вызывалась 10 минут.... А это произошло из-за того, что событие OnBookEvent для символа SNGR-3.19 не генерировалось 10 минут.
Наверное терминал ставил его в очередь событий, оно каким то образом исчезло из этой очереди. С OnTimer таких косяков нет. Да бывает придет тик с задержкой в секунд в 20.
Какова Ваша изначальная цель?
Для чего Вам нужно сравнивать время тивов с локальным временем?
Какова Ваша изначальная цель?
Для чего Вам нужно сравнивать время тивов с локальным временем?
Хочу знать максимальную задержку между моментом возникновения тика на сервере и временем когда он придет в терминал. И как это время можно минимизировать.
Это знание можно использовать при написании своего тестера. А может даже получиться озадачить разработчиков большими задержками.
TimeCurrent() - Время последнего тика по символу будет меньше времени задержки, поэтому его можно использовать. Использование локального времени в первой версии было не удачной идеей.
Хочу знать максимальную задержку между моментом возникновения тика на сервере и временем когда он придет в терминал. И как это время можно минимизировать.
Это знание можно использовать при написании своего тестера. А может даже получиться озадачить разработчиков большими задержками.
Понятно. Продолжайте... Без меня.
А для других участников форума
Внимание вопрос: Считаете ли вы нормальным в 18:00:00 по TimeCurrent() не знать о тике со временем 17:59:00 ?
Считаю, что вопрос спорный. Хочется, чтобы тиковая последовательность удовлетворяла как минимум следующим критериям:
1. Была последовательной, т.е. время каждого последующего тика >= времени предыдущего тика;
2. Актуальность. Т.е. время последнего пришедшего тика как можно ближе к текущему моменту;
Похоже, что проблема у Вас именно со вторым пунктом.
Спорность п.2 заключается в следующем: хочется, чтобы время от формирования тика на сервере до получения его мною (лаг) было минимальным, дабы я смог быстрее других его обработать и принять торговое решение. Но! Если лаг одинаков для всех участников торгов - тогда проблем нет (насколько я это понимаю). Т.е. проблема у сервера брокера, но все в равных условиях. Если же кто-то информацию о тике в 17:59:00 получил в 17:59:01, а я не получил даже в 18:00 - вот это уже большая проблема.
И вот тут вопрос. В чем проблема (и есть ли она)? В сервере брокера, который долго не отдает тик (всем), или в МТ5, который долго его не получает.