nikolz написал: [QUOTE]nikolz написал: У меня данные с сервера приходят с задержкой 0.03 сек - это задержка канала связи (смотрим в информационном окне терминала QUIK в расширенном режиме) .
Учитывать надо общую задержку с момента отправки данных с биржи до момента получения их клиентом. И тут могут быть секунды и десятки секунд. Это как радоваться, что почтальон вам доставил посылку из регионального отделения почты за один день, в то время как в самом отделении до этого её месяц не могли найти ))
nikolz написал: Это означает, что данные мы получаем не чаще чем один раз в 0.7 секунды в виде пакета, Потом этот пакет пересылается нам в колбеки. В итоге вам кажется, что вы получаете данные в реальном времени, а в действительности с задержкой на 0.7 секунды. В реальных торгах задержка возможно и меньше, но передачу пакетом никто не отменял.
По моему опыту мне кажется, что данные я получаю чаще, чем один раз в 0.7 секунды. Но, как говорится, частота получения данных и задержка - это две большие разницы. В реальных торгах задержка может достигать нескольких секунд или более. Хоть получать вы можете данные с высокой частотой, но это будут "старые" данные с большой задержкой.
nikolz написал: Обратите внимание на то, что далее время сервера не изменяется еще 9 значений. При этом время вызова колбека составляет не более 100 мкс, т е 0.0001 сек ---------------------------- что же это означает. Это означает, что данные мы получаем не чаще чем один раз в 0.7 секунды в виде пакета
Это означает, что время сервера меняется с дискретностью 1 секунда. Т.о., с какой бы частотой мы не получили пакеты в течение 1 секунды, для них всех время сервера будет одинаковым. Делать какие-либо измерения в микросекундах на основе величины, шаг цены которой 1 секунда, - величайшая глупость.
Nikolay написал: время сделки просто транслирует биржа, но серверная часть должна же не просто транслировать, но и как-то контролировать, что она транслирует.
Что и как вы предлагаете контролировать? Время сервера никак не связано с биржевым от слова совсем.
Цитата
Anton Belonogov написал: нужно обратиться с этим вопросом к Вашему обслуживающему брокеру
Да-да, закидывать брокера письмами "эй, чувак, синхронизируй время". Бред, конечно. Использовать время сервера - так себе идея. Надёжнее использовать локальное время, так вы хотя бы можете контролировать его синхронизацию.
Daniil Pozdnyakov написал: Данная ветка форума для ознакомления была предоставлена для ответа на Ваш вопрос, почему SERVERTIME продолжает обновляться после выдергивания сетевого кабеля.
У меня такого вопроса и не возникало, я изначально знал, что SERVERTIME - это фикция. Просто показал вам и другим пользователям, что SERVERTIME не подходит для решения обозначенной задачи, от слова совсем.
Цитата
Daniil Pozdnyakov написал: В качестве альтернативного решения получения временной метки сделок предлагаем анализировать таблицу обезличенных сделок при помощи Lua.
Надеюсь, не стоит объяснять, что Level II, ТТТ и обезличенные сделки - это совершенно разные потоки, которые не синхронизированы между собой? К тому же, изменение котировок совсем не обязательно сопровождается новой сделкой (привет неликвид).
Поэтому давайте всё же остановимся на добавлении в соответствующие потоки параметров moment, moment_ns, mod_time, mod_time_ns и им аналогичных для других рынков. Странно, что это не было сделано изначально.
Игорь написал: При физическом разрыве соединения время сервера будет продолжать отсчет. По факту это будет уже не время сервера, а время локального таймера.
В любом случае, использовать время сервера для целей, обозначенных в текущей теме, нельзя, и рекомендация "использовать функцию getInfoParam("SERVERTIME ")" некорректна.
Daniil Pozdnyakov написал: Касательно связи между Level 2, TTT и временем сервера. Время, которое Вы получаете, - это время изменения какого-либо параметра любого пакета данных, переданного сервером.
Такое чувство, что меня пытаются обмануть. Запускаю скрипт, который транслирует время сервера в окно сообщений:
Код
local run = true
function OnStop(flag)
run = false
end
function main()
local st
while run do
local t = getInfoParam("SERVERTIME")
if t ~= st then
st = t
message(st)
end
sleep(1000)
end
end
И в какой-то момент выдергиваю сетевой кабель из компа. И, о чудо! Компьютер продолжает "получать пакеты данных с сервера". И только спустя 23 сек понимает, что данных получать вроде как не должен.
Daniil Pozdnyakov написал: Касательно времени в потоке Level 2. Параметр времени не транслируется, однако можно использовать функцию getInfoParam("SERVERTIME ") для получения времени сервера. Подробно об этом написано в документе QLUA.chm в разделе "Сервисные функции" в соответствующем пункте "getInfoParam".
Получая данный параметр, Вы можете сравнивать его с текущим временем на локальной машине. Таким образом, Вы сможете проверить, насколько актуальную информацию Вам прислал сервер.
Daniil Pozdnyakov, поясните, какая связь между Level 2, ТТТ и временем сервера. Заодно и nikolz почитает для общего развития.
Также поясните, чьё время указано в свечах по параметрам из ТТТ, кто и в какой момент проставляет это время?
Открыл я значит, тиковый график по LAST для SiH2, заказал пропущенные данные, чтобы понимать сколько за день накопится. Занимаемая квиком память выросла на 361 Мб. Открыл тики по BID - прибавилось ещё 33 Мб. А когда несколько инструментов, сколько там параметров в гигабайт влезет?
У вас значения ms и mcs для параметров бывают отличны от нуля? Но вопрос в том, чье время там проставлено (явно не биржевое) и насколько ему можно доверять? Не может ли случиться так, что сервер пришлет старые данные, а время проставит текущее?
Daniil Pozdnyakov, Поскольку значения из ТТТ могут быть получены в разное время, то временная метка должна быть проставлена для каждого параметра, например дополнительным полем в таблице, возвращаемой getParamEx.
Обратите внимание на поля moment и moment_ns потока таблицы orders_aggr:
Код
Поле Тип Описание
moment t Время последнего обновления записи
moment_ns u8 Время последнего обновления записи (UNIX-время в наносекундах по стандарту UTC)
Цитата
Daniil Pozdnyakov написал: ТТТ формируется не из одного потока, а из нескольких. В основном это FORTS_FUTINFO_REPL, FORTS_FUTCOMMON_REPL (для опционов соответственно FORTS_OPTINFO_REPL, FORTS_OPTCOMMON_REPL)
Начиная с версии 6.5 потоки FORTS_FUTCOMMON_REPL и FORTS_OPTCOMMON_REPL объявляются устаревшими, вместо них следует использовать FORTS_COMMON_REPL.
Обратите внимание на поля mod_time и mod_time_ns таблицы common:
Код
Поле Тип Описание
mod_time t Дата и время изменения записи
mod_time_ns u8 Дата и время изменения записи (UNIX-время в наносекундах по стандарту UTC)
Daniil Pozdnyakov, раз разницы нет, тогда регистрируйте. Можно сделать, чтобы функция переключения на другой сервер работала только при установленной галке "Восстанавливать связь автоматически". Если галка не установлена, то функция выдаст ошибку. По моему скромному мнению такой функционал не понизит уровень безопасности в сравнении с автоподключением.
Daniil Pozdnyakov написал: небезопасности предлагаемого Вами решения
Daniil Pozdnyakov, Поясните, в чём вы видите "небезопасность"? В чем по-вашему отличие в плане безопасности от автоматического восстановления связи с сервером с установленной галкой "Восстанавливать связь автоматически" и снятой галкой "При восстановлении использовать только параметры последнего соединения"?
Ах, да. Это относится к случаю, когда сервер онлайн, но не получает или не транслирует данные, и брокер может сделать рассылку. Если сервер отключился то тут нужен текст сообщения причины отключения в колбеке OnDisconnected.
Добавьте колбек OnMessage, вызываемый при получении сообщений от брокера из QMonitor через "Send a message to user" и "Send a message to all users".
К примеру, брокер на м шлет сообщение следующего содержания:
Цитата
Наші друзі. Наш сервер лежить, і щоб не похерити нажите непосильною працею, перейдіть на резервний сервер. Удачі, бро!
Скрипт получает это сообщение в OnMessage и либо анализирует его по ключевым словам и переключается на резервный сервер сервер сам. Либо пересылает нам в sms, телегу или че там у кого настроено. А мы удаленно даем команду скрипту переключиться на другой сервер.
В Lua добавить API-функцию переключения на другой сервер с использованием идентификационных данных последней сессии. Т.е., в функцию передаются только параметры сервера, на который надо переключиться.
Транслирует ли биржа время в потоке Level 2 и потоке параметров в шлюзы? Я почему спрашиваю. Иногда Часто сервер QUIK брокера тупит: по нескольку минут не транслирует маркет-дата. Когда (и если) он вдруг оживает, нужно понимание, насколько актуальные данные он только что прислал в OnQuote и OnParam, можно ли им доверять или это данные 10-минутной давности, и они нафиг не нужны.
Было бы неплохо в потоке маркет-даты иметь их временную метку.