Почему TimeCurrent() отличается от MarketInfo(Symbol(), MODE_TIME) ?

 

Здравствуйте,


Мне надо в эксперте узнать серверное время, которому соответствуют значения переменных Bid и Ask.

В документаци сказано, что функция TimeCurrent() возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года.


А также можно использовать функцию MarketInfo с параметром MODE_TIME (Время поступления последней котировки).


Проблема в том, что иногда эти две функции дают разный результат. Какой из них верить?


Вот код:


int start()
{
//----
Print(
"TimeCurrent=", TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS),
", TimeLocal=", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),
", MODE_TIME=", TimeToStr(MarketInfo(Symbol(), MODE_TIME), TIME_DATE|TIME_SECONDS),
", Ask=", DoubleToStr(Ask, Digits),
", Bid=", DoubleToStr(Bid, Digits),
", Spread=", MarketInfo(Symbol(), MODE_SPREAD)
);

//----
return(0);
}


Вот пример логов:


01:24:35 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:24:32, TimeLocal=2010.01.23 01:24:41, MODE_TIME=2010.01.22 15:24:32, Ask=1.27111, Bid=1.27051, Spread=60
01:24:41 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:24:37, TimeLocal=2010.01.23 01:24:46, MODE_TIME=2010.01.22 15:24:37, Ask=1.27113, Bid=1.27052, Spread=61
01:24:46 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:24:37, TimeLocal=2010.01.23 01:24:47, MODE_TIME=2010.01.22 15:24:37, Ask=1.27118, Bid=1.27057, Spread=61
01:24:47 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:24:41, TimeLocal=2010.01.23 01:24:50, MODE_TIME=2010.01.22 15:24:41, Ask=1.27126, Bid=1.27065, Spread=61
01:24:50 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:24:43, TimeLocal=2010.01.23 01:24:52, MODE_TIME=2010.01.22 15:24:43, Ask=1.27131, Bid=1.27070, Spread=61
01:24:52 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:24:46, TimeLocal=2010.01.23 01:24:55, MODE_TIME=2010.01.22 15:24:44, Ask=1.27132, Bid=1.27071, Spread=61
01:25:03 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:24:53, TimeLocal=2010.01.23 01:25:03, MODE_TIME=2010.01.22 15:24:53, Ask=1.27130, Bid=1.27069, Spread=61
01:25:03 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:00, TimeLocal=2010.01.23 01:25:09, MODE_TIME=2010.01.22 15:24:58, Ask=1.27131, Bid=1.27070, Spread=61
01:25:09 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:06, TimeLocal=2010.01.23 01:25:15, MODE_TIME=2010.01.22 15:25:06, Ask=1.27134, Bid=1.27073, Spread=61
01:25:15 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:08, TimeLocal=2010.01.23 01:25:17, MODE_TIME=2010.01.22 15:25:08, Ask=1.27138, Bid=1.27077, Spread=61
01:25:17 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:09, TimeLocal=2010.01.23 01:25:18, MODE_TIME=2010.01.22 15:25:09, Ask=1.27145, Bid=1.27084, Spread=61
01:25:18 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:10, TimeLocal=2010.01.23 01:25:19, MODE_TIME=2010.01.22 15:25:10, Ask=1.27142, Bid=1.27081, Spread=61
01:25:19 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:12, TimeLocal=2010.01.23 01:25:21, MODE_TIME=2010.01.22 15:25:12, Ask=1.27140, Bid=1.27079, Spread=61
01:25:21 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:14, TimeLocal=2010.01.23 01:25:23, MODE_TIME=2010.01.22 15:25:14, Ask=1.27138, Bid=1.27077, Spread=61
01:25:23 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:14, TimeLocal=2010.01.23 01:25:24, MODE_TIME=2010.01.22 15:25:14, Ask=1.27140, Bid=1.27079, Spread=61
01:25:24 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:17, TimeLocal=2010.01.23 01:25:26, MODE_TIME=2010.01.22 15:25:17, Ask=1.27141, Bid=1.27080, Spread=61
01:25:26 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:20, TimeLocal=2010.01.23 01:25:29, MODE_TIME=2010.01.22 15:25:20, Ask=1.27139, Bid=1.27078, Spread=61
01:25:26 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:21, TimeLocal=2010.01.23 01:25:29, MODE_TIME=2010.01.22 15:25:20, Ask=1.27140, Bid=1.27079, Spread=61
01:25:29 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:22, TimeLocal=2010.01.23 01:25:30, MODE_TIME=2010.01.22 15:25:22, Ask=1.27139, Bid=1.27078, Spread=61
01:25:30 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:28, TimeLocal=2010.01.23 01:25:37, MODE_TIME=2010.01.22 15:25:28, Ask=1.27136, Bid=1.27075, Spread=61

01:25:37 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:29, TimeLocal=2010.01.23 01:25:38, MODE_TIME=2010.01.22 15:25:29, Ask=1.27137, Bid=1.27076, Spread=61
01:25:38 RangeTrading AUDNZD,M1: TimeCurrent=2010.01.22 15:25:32, TimeLocal=2010.01.23 01:25:41, MODE_TIME=2010.01.22 15:25:32, Ask=1.27143, Bid=1.27082, Spread=61

Видно, что как правило значения совпадают, но иногда и различаются. Как такое может быть?

Я еще могу понять это, если MarketInfo() обращается к серверу за последним значением (и с момента вызова TimeCurrent прошло какое-то время), но оно ведь выдается меньше, чем от TimeCurrent().



Второй вопрос - это почему значение TimeLocal не совпадает с временем в первой колонке, временем записи в лог.

Например, пред-пред-последняя строка - разница 7 секунд. Не может одна команда Print выполняться 7 секунд. Или может?

Скорее всего, судя по пред-последним строкам от 01:25:30 и 01:25:37 между этими тиками прошло 7 секунд, но царит совершенная неразбериха во времени полученном от разных функций.


У меня закрадывается подозрение, что в момент вызова советника данные в TimeCurrent от предыдущего тика (или пред-предыдущего). Это может и не смертельно, но логично предположить, что значения Bid И Ask тоже, а это уже неприятно.


Кто-нибудь разбирался с этим?

 
bvg77 >>:

Здравствуйте,


Мне надо в эксперте узнать серверное время, которому соответствуют значения переменных Bid и Ask.

В документаци сказано, что функция TimeCurrent() возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года.


А также можно использовать функцию MarketInfo с параметром MODE_TIME (Время поступления последней котировки).


Проблема в том, что иногда эти две функции дают разный результат. Какой из них верить?


Видно, что как правило значения совпадают, но иногда и различаются. Как такое может быть?

Я еще могу понять это, если MarketInfo() обращается к серверу за последним значением (и с момента вызова TimeCurrent прошло какое-то время), но оно ведь выдается меньше, чем от TimeCurrent().



Второй вопрос - это почему значение TimeLocal не совпадает с временем в первой колонке, временем записи в лог.

Например, пред-пред-последняя строка - разница 7 секунд. Не может одна команда Print выполняться 7 секунд. Или может?

Скорее всего, судя по пред-последним строкам от 01:25:30 и 01:25:37 между этими тиками прошло 7 секунд, но царит совершенная неразбериха во времени полученном от разных функций.


У меня закрадывается подозрение, что в момент вызова советника данные в TimeCurrent от предыдущего тика (или пред-предыдущего). Это может и не смертельно, но логично предположить, что значения Bid И Ask тоже, а это уже неприятно.


Кто-нибудь разбирался с этим?


разница в том

что TimeCurrent() берет время любого из инструментов который последний тик дал

а MarketInfo(Symbol(), MODE_TIME) - берет время последней котировки именно по конкретному инструменту

а время прихода тика по конкретному инструменту может отличаться от текущего реального времени


исходя из этого логику с разницей - наверно вы сами поймете

 

И это кстати дает способ определить - изминЯлась-ли цена с вашего последнего запроса её.

Конечно при условии что цена не может поменяться за одну секунду несколько раз, но при условии того что она одинакова и время прихода ее с точностью до секунды тоже одинаково, можно предположить что и цена не менялась

 
YuraZ >>:

разница в том

что TimeCurrent() берет время любого из инструментов который последний тик дал

а MarketInfo(Symbol(), MODE_TIME) - берет время последней котировки именно по конкретному инструменту

а время прихода тика по конкретному инструменту может отличаться от текущего реального времени


исходя из этого логику с разницей - наверно вы сами поймете




Спасибо за ответ. Я до такого не додумался. Это где-то в доках написано, или разработчики так сказали?


Надо будет проверить это поподробнее. Пара моментов меня смущает.

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

2а) Разница в 2 секунды - это все-таки много. 2б) Если действительно TimeCurrent брала время тиков EURUSD - они очень частые, а MarketSymbol берет время тиков AUDNZD - они гораздо реже, то в логах должно быть много строк, где время различается. А их не так уж и много.


Я сделаю такой тест. В функции start вызывать TimeCurrent + MarketInfo раз 10 с задержкой в секунду.За это время придут новые тики и по AUDNZD и по остальным парам. Если ваше предположение верно, то TimeCurrent будет меняться (с приходом новых тиков других пар), а MarketInfo нет (будет давать одно и то же время прихода того тика, который инициировал запуск этой функции start().

 
bvg77 писал(а) >>
1) В этом тесте был открыт только один график с одной парой. Так что других тиков по идее и быть не должно. Но строго говоря, терминал был подписан еще на одну пару (EURUSD, ее отключить нельзя), хотя и без графика.

TimeCurrent() берёт время отсюда, а не с графика

 

Спасибо за ответы. Ситуация проясняется. Документация не говорит про эти тонкости.


int start()
{
for (int i=0; i<100; i++)
{
Print(
"TimeCurrent=", TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS),
", TimeLocal=", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),
", MODE_TIME=", TimeToStr(MarketInfo(Symbol(), MODE_TIME), TIME_DATE|TIME_SECONDS),
", MODE_TIME_EURUSD=", TimeToStr(MarketInfo("EURUSD", MODE_TIME), TIME_DATE|TIME_SECONDS),
", Ask=", DoubleToStr(Ask, Digits),
", MODE_ASK=", DoubleToStr(MarketInfo(Symbol(),MODE_ASK), Digits),
", Bid=", DoubleToStr(Bid, Digits),
", MODE_BID=", DoubleToStr(MarketInfo(Symbol(),MODE_BID), Digits),
", Spread=", MarketInfo(Symbol(), MODE_SPREAD)
);
Sleep(1000);
}

//----
return(0);
}


Этот код показывает, что

1) TimeCurrent() действительно меняется с приходом любого тика, не только с текущего графика. (и Symbol(), и "EURUSD")

2) MarketInfo(Symbol(), MODE_TIME) меняется в течении работы функции start(). Это несколько обескураживает. Получается, что нет гарантированного способа получить серверное время, которое соответствует значениям в переменных Bid/Ask. Похоже, при входе в start() надо будет первым делом запомнить результат MarketInfo(Symbol(), MODE_TIME) и использовать его, просто имея в виду, что это значение может быть слегка неверное.


В этом примере переменные Bid/Ask не меняются в течении работы функции start(), а результат функции MarketInfo(Symbol(), MODE_TIME), MarketInfo(Symbol(),MODE_ASK), MarketInfo(Symbol(),MODE_BID) и MarketInfo(Symbol(), MODE_SPREAD) меняется. Похоже, что любые данные, полученные функцией MarketInfo - это данные на момент вызова функции MarketInfo, а не start().

Причина обращения: