Написал небольшой советник, который показывает максимальную разницу между локальным временем компьютера и временем нового тика time_msc (только что полученного).
Т.е грубо говоря стал измерять TimeLocal() только в миллисекундах минyc время последнего тика Tick.teme_msc . Тик получен с помощью SymbolInfoTick.
Особо издеваться не стал. 24 символа в обзоре рынка. Через OnTimer() с периодом вызова 1 миллисекунда. Опрашиваю все символы с помощью SymbolInfoTick. Если тик новый делаю замеры.
Советник запустил на вечерке. Вот такие результаты:
Поймано новых тиков 46800
Минимальное время между локальным временем компьютера и временем тика -7048 миллисекунд ( с минусом )
Среднее время между локальным временем компьютера и временем тика -6819 миллисекунд ( с минусом )
Максимальное время между локальным временем компьютера и временем тика 97082 миллисекунд ( с плюсом )
Как с этим бороться ?
Посмотрел Ваш код...
Вы вообще все не правильно делаете.
Нужно добавить в Обзор рынка самые ликвидные инструменты.
Затем, добавить стаканы этих инструментов.
И, при срабатывании OnBookEvent(), копировать 1 тик (последний) там будет время и тут же брать локальное время и сравнивать.
А вообще зачем Вам нужно сравнивать локальное время со временем тиков?
Если Вам нужно знать можно ли торговать, то вот Вам функция
//+------------------------------------------------------------------+ //| Expert Check Market Time function | //+------------------------------------------------------------------+ bool CheckMarketTime() { MqlDateTime cur_time, sv_time; cur_time.year = 0; TimeTradeServer(cur_time); //Возвращает расчетное текущее время торгового сервера. if(cur_time.year > 0) { sv_time.year = 0; TimeCurrent(sv_time); //Возвращает последнее известное время сервера if(sv_time.year > 0) { // if((cur_time.day_of_week == int(FirstDay)) || // (cur_time.day_of_week == int(SecondDay))) return(false); //Проверка на выходные if(cur_time.day_of_week == sv_time.day_of_week) { ulong tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec; if(((tr_time >= time_st_mon) && (tr_time < 50370)) || //10:00:01 - 13:59:30 ((tr_time >= time_st_day) && (tr_time < 67470)) || //14:05:01 - 19:44:30 ((tr_time >= time_st_evn) && (tr_time < 85770))) //19:05:01 - 23:49:30 { return(true); } } } } return(false); }
На тему актуальности тиков посмотрите этот индикатор с комментариями.
![Ping Ping](https://c.mql5.com/36/24/ping.jpg)
- www.mql5.com
Посмотрел Ваш код...
Вы вообще все не правильно делаете.
Нужно добавить в Обзор рынка самые ликвидные инструменты.
Затем, добавить стаканы этих инструментов.
И, при срабатывании OnBookEvent(), копировать 1 тик (последний) там будет время и тут же брать локальное время и сравнивать.
А вообще зачем Вам нужно сравнивать локальное время со временем тиков?
Зачем все делать, через стакан ? Просто для того, чтобы код лучше выглядел ? Если у меня символ в обзоре рынка разве, это не означает, что идет постоянная синхронизация и мне доступны последние 4096 тиков по символу прямо из кеша ( т.е мгновенно ) ? В любом случае ваша идею нужно опробовать. Единственное я не понял, что значит "копировать 1 тик (последний)" по изменению стакана вычислять тик ?
А вообще зачем Вам нужно сравнивать локальное время со временем тиков?
Принимать торговые решения по вчерашним ценам не очень хорошая идея. Вчера SBER по 100 купить с точки зрения алгоритма может быть хорошей идей, а сегодня его уже по 80 надо продавать.
Зачем все делать, через стакан ? Просто для того, чтобы код лучше выглядел ? Если у меня символ в обзоре рынка разве, это не означает, что идет постоянная синхронизация и мне доступны последние 4096 тиков по символу прямо из кеша ( т.е мгновенно ) ? В любом случае ваша идею нужно опробовать. Единственное я не понял, что значит "копировать 1 тик (последний)" по изменению стакана вычислять тик ?
А вообще зачем Вам нужно сравнивать локальное время со временем тиков?
Принимать торговые решения по вчерашним ценам не очень хорошая идея. Вчера SBER по 100 купить с точки зрения алгоритма может быть хорошей идей, а сегодня его уже по 80 надо продавать.
Зачем Вы задаете вопрос, если сами всё знаете.
Делайте, как считаете нужным.
Зачем Вы задаете вопрос, если сами всё знаете.
Делайте, как считаете нужным.
Я спрашиваю совершенно серьёзно. Программируя на MQL я понял, что верить нельзя не справке, не информации которую отдает терминал. Все это не более чем информация к размышлению. Вполне возможно, что стакан отдает информацию раньше(стабильнее), чем SymbolInfoTick.
Вот кстати тот тик, который пришел с задержкой полторы минуты:
Новая МАКсимальная разница 97082 SBPR-3.19 Локальное время 2019.03.15 21:05:31.842 Время тика 2019.03.15 21:03:54.760
В истории тиков ничего криминального в эту минуту не было. Два тика за минуту.
Я спрашиваю совершенно серьёзно. Программируя на MQL я понял, что верить нельзя не справке, не информации которую отдает терминал. Все это не более чем информация к размышлению. Вполне возможно, что стакан отдает информацию раньше(стабильнее), чем SymbolInfoTick.
Вот кстати тот тик, который пришел с задержкой полторы минуты:
Новая МАКсимальная разница 97082 SBPR-3.19 Локальное время 2019.03.15 21:05:31.842 Время тика 2019.03.15 21:03:54.760
В истории тиков ничего криминального в эту минуту не было. Два тика за минуту.
Вы, совершенно не понимаете суть вопроса!
Совсем наплевать на Ваше локальное время.
Вожно толко время ТОРГОВОГО сервера!
Есть торговые сессии, в течении этого времени можно торговать.
Торговое время определяется на Вашим локальным временем,
а временем торгового сервера.
Вы, совершенно не понимаете суть вопроса!
Совсем наплевать на Ваше локальное время.
Вожно толко время ТОРГОВОГО сервера!
Есть торговые сессии, в течении этого времени можно торговать.
Торговое время определяется на Вашим локальным временем,
а временем торгового сервера.
Я наверное плохо объяснил суть вопроса. fxsaber, меня понял т.к сам понимает важность в получении новых тиков без задержек и дал ссылку на свой индикатор, который делает, что -то подобное, что и мой код но в графическом виде. К времени работы биржи тема отношения не имеет.
Попытаюсь объяснить на пальцах.
В 16:39.59.999 по локальному времени советник в первый раз получает последний тик, по каждому символу из обзора рынка и запоминает его.
В 16:40.00.000 опять идет опрос последнего тика по каждому символу. По некоторым мы получаем новые тики.
Большинство новых тиков со временем ( time_msc ) примерно равным 16:39.59.000. А вот один пришёл со временем 16:38.30.335.
Т.е получается, что В 16:39.59.999( по локальному) это тика не было, а спустя миллисекунду он вдруг появился да ещё и современен 16:38:30 хотя обычно тики приходят со временем отличающимся лишь на секунду.
После таких тиков возникают не хорошие мысли. Допустим мы запрашиваем последний тик с малоликвидного символа в реальной торговле. Получаем время тика (time_msc)
отличающееся на две минуты от локального. Сразу возникают предположения, о том, что кто-то уже знает о тике который произошел 90, 60, или 30 секунд назад, а наш советник об этом не знает и его за этого могут наказать ударом в лимитный ордер допустим.
С этой проблемой нужно бороться.
Я наверное плохо объяснил суть вопроса. fxsaber, меня понял т.к сам понимает важность в получении новых тиков без задержек и дал ссылку на свой индикатор, который делает, что -то подобное, что и мой код но в графическом виде. К времени работы биржи тема отношения не имеет.
Попытаюсь объяснить на пальцах.
В 16:39.59.999 по локальному времени советник в первый раз получает последний тик, по каждому символу из обзора рынка и запоминает его.
В 16:40.00.000 опять идет опрос последнего тика по каждому символу. По некоторым мы получаем новые тики.
Большинство новых тиков со временем ( time_msc ) примерно равным 16:39.59.000. А вот один пришёл со временем 16:38.30.335.
Т.е получается, что В 16:39.59.999( по локальному) это тика не было, а спустя миллисекунду он вдруг появился да ещё и современен 16:38:30 хотя обычно тики приходят со временем отличающимся лишь на секунду.
После таких тиков возникают не хорошие мысли. Допустим мы запрашиваем последний тик с малоликвидного символа в реальной торговле. Получаем время тика (time_msc)
отличающееся на две минуты от локального. Сразу возникают предположения, о том, что кто-то уже знает о тике который произошел 90, 60, или 30 секунд назад, а наш советник об этом не знает и его за этого могут наказать ударом в лимитный ордер допустим.
С этой проблемой нужно бороться.
"Бороться" ни с чем не нужно, а нужно понимать как приходят тики в терминал и правильно
их обрабатывать!
![Лента всех сделок Лента всех сделок](https://c.mql5.com/36/24/lenta-vseh-sdelok.jpg)
- www.mql5.com
"Бороться" ни с чем не нужно, а нужно понимать как приходят тики в терминал и правильно
их обрабатывать!
Может вы наконец поделитесь этим знанием ? Даже если через ваш метод, можно получить событие новый тик раньше, получается что вы даете мне рыбу, а не удочку т.е не объясняете почему так происходит.
Откуда у вас взялась уверенность, что ваш метод быстрее моего ? Я что то пропустил в документации ? Может быть экспериментальным путем вы установили, что подписавшись на стакан новые тики терминал отдает более охотно ?
Реализую переключатель в этом советнике с моего способа отлова новых, на ваш.
Может вы наконец поделитесь этим знанием ? Даже если через ваш метод, можно получить событие новый тик раньше, получается что вы даете мне рыбу, а не удочку т.е не объясняете почему так происходит.
Откуда у вас взялась уверенность, что ваш метод быстрее моего ? Я что то пропустил в документации ? Может быть экспериментальным путем вы установили, что подписавшись на стакан новые тики терминал отдает более охотно ?
Реализую переключатель в этом советнике с моего способа отлова новых, на ваш.
Есть исходный код с комментариями.
Лень посмотреть? Или что-то не понятно?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Написал небольшой советник, который показывает максимальную разницу между локальным временем компьютера и временем нового тика time_msc (только что полученного).
Т.е грубо говоря стал измерять TimeLocal() только в миллисекундах минyc время последнего тика Tick.teme_msc . Тик получен с помощью SymbolInfoTick.
Особо издеваться не стал. 24 символа в обзоре рынка. Через OnTimer() с периодом вызова 1 миллисекунда. Опрашиваю все символы с помощью SymbolInfoTick. Если тик новый делаю замеры.
Советник запустил на вечерке. Вот такие результаты:
Поймано новых тиков 46800
Минимальное время между локальным временем компьютера и временем тика -7048 миллисекунд ( с минусом )
Среднее время между локальным временем компьютера и временем тика -6819 миллисекунд ( с минусом )
Максимальное время между локальным временем компьютера и временем тика 97082 миллисекунд ( с плюсом )
Как с этим бороться ?