Ув, разработчики Просьба объяснить следующий феномен работы системы QUIK ----------------------- На реальном рынке вычисляю функцию распределения запаздывания времени прихода обезличенных сделок в терминал QUIK на моем компе с сервера брокера сбербанк. ---------------------- Алгоритм расчета следующий Вычисляем разницу текущего времени компа и времени обезличенной сделки и в добавляем 1 в ячейку массива с индексом равным разности. В результата по 24 000 обезличенных сделок получаем следующий график распределения запаздывания
Что получилось: 80% пришло с задержкой не более 1 секунды это при пинге до сервера 0.03 сек. 12% с задержкой от 1 до 2 секунд 8% с задержкой более 2 секунд 1% с задержкой 17 секунд 0.5% с задержкой 30 секунд --------------------- Что не так c сервером QUIK у брокера Сбербанк.
Пользователь
Сообщений: Регистрация: 30.01.2015
20.04.2023 08:38:07
Ау, разработчики! Можете объяснить?
Пользователь
Сообщений: Регистрация: 02.07.2015
20.04.2023 09:44:00
Вы делаете дичь. В потоке обезличенных сделок есть время сделок. Но никто не обещает синхронности доставки данных. Ты бы ещё пожаловался что свечки на графике отстают.
Назвать конкретную причину такого распределения в Вашей выборке без конкретных примеров и участия брокера не удастся. В данной ситуации замешано большое количество неопределённостей: эпизодические сетевые задержки, ситуативные задержки на сервере в расчете и обработке сделок, возможные задержки в обработке поступающей информации на Вашем ПК, задержки в трансляции данных из ТС на сервер QUIK и из сервера на терминал и т.д.
Для того, чтобы можно было анализировать большие задержки поступления обезличенных сделок необходимы конкретные примеры. Например зафиксировать конкретные номера сделок с временем их исполнения и временем получения их терминалом, далее приложить эти данные и архив терминала сделанный в момент проявления задержек к Вашему обращению в техническую поддержку Вашего брокера, в котором попросить помочь в выяснении причин таких задержек и в случае, если брокер не сможет помочь по данному вопросу, то инициировать его обращение к нам для совместного анализа данной ситуации.
Назвать конкретную причину такого распределения в Вашей выборке без конкретных примеров и участия брокера не удастся. В данной ситуации замешано большое количество неопределённостей: эпизодические сетевые задержки, ситуативные задержки на сервере в расчете и обработке сделок, возможные задержки в обработке поступающей информации на Вашем ПК, задержки в трансляции данных из ТС на сервер QUIK и из сервера на терминал и т.д.
Для того, чтобы можно было анализировать большие задержки поступления обезличенных сделок необходимы конкретные примеры. Например зафиксировать конкретные номера сделок с временем их исполнения и временем получения их терминалом, далее приложить эти данные и архив терминала сделанный в момент проявления задержек к Вашему обращению в техническую поддержку Вашего брокера, в котором попросить помочь в выяснении причин таких задержек и в случае, если брокер не сможет помочь по данному вопросу, то инициировать его обращение к нам для совместного анализа данной ситуации.
примерно такое же можно наблюдать и на вашем демо сервере. относительно задержек в сети и на компьютере не логично. В сети задержка 30 мс, а на графике задержка десятки секунд Ядро процессора загружено примерно на 10% -------------- Возможно не знаете, но недавно я делал тест на скорость выставления снятие заявок на вашем демо сервере. Полагаю я нго либо положил либо очень нагрузил так как меня отключили. По тестам скорость выставления и снятия заявки без учета прохождения по сети составляет порядка 10-100 мкс. ------------------------- Если у Вас есть возможность, то сделайте подобный тест и покажите результат. -------------------------- Если покажете, что у вас задержка прихода обезличенной сделки через колбек onAllTrade в пределах разумного, то вопрос будет закрыт. -------------------- Я мог бы повторить Ваш тест, так как у сбербанка постоянно какие-то глюки. Например вчера пропал предыдущий торговый день и не вогсстановлися.
QUIK clients support
Сообщений: Регистрация: 28.07.2022
20.04.2023 13:29:41
Цитата
nikolz написал: примерно такое же можно наблюдать и на вашем демо сервере. относительно задержек в сети и на компьютере не логично. В сети задержка 30 мс, а на графике задержка десятки секунд Ядро процессора загружено примерно на 10% -------------- Возможно не знаете, но недавно я делал тест на скорость выставления снятие заявок на вашем демо сервере. Полагаю я нго либо положил либо очень нагрузил так как меня отключили. По тестам скорость выставления и снятия заявки без учета прохождения по сети составляет порядка 10-100 мкс. ------------------------- Если у Вас есть возможность, то сделайте подобный тест и покажите результат. -------------------------- Если покажете, что у вас задержка прихода обезличенной сделки через колбек onAllTrade в пределах разумного, то вопрос будет закрыт. -------------------- Я мог бы повторить Ваш тест, так как у сбербанка постоянно какие-то глюки. Например вчера пропал предыдущий торговый день и не вогсстановлися.
Если Вы встречаете такое поведение также и на демо-доступе QUIK, то точно также ждём от Вас конкретные примеры по описанному ранее принципу: номер сделки - время их исполнения - время прихода на терминал. Без примеров сделать какие-либо заключения невозможно, так как задержек на демо-доступе не наблюдаем у себя.
Пользователь
Сообщений: Регистрация: 30.01.2015
20.04.2023 14:00:54
выкладываю скрипт теста:
Код
local tmp={}
local ds={}
local ns=0;
local count,count1=0,0; local sts={} for i=1,200 do sts[i]=0; end
function main()
while true do
-- nkevent.wait(event); --ждем события
while #tmp>0 do
local t=tmp[1]; table.sremove(tmp,1);
if count>=100 then count=0;
local s=""; for i=1,60 do s=s..tostring(sts[i])..",";end
Log:write(tostring(ns)..":"..tostring(count1)..">"..s.."\n"); Log:flush();
end
end
sleep(100);
end
end
function OnParam(c,s)
local d=ds[c..s]
if d==nil then
d,err=CreateDataSource (c,s,INTERVAL_TICK);
if d then ds[c..s]=d; d:SetEmptyCallback(); ns=ns+1; end
else
table.sinsert(tmp,{1,c,s});
end
end
function OnAllTrade(t)
local Ti=t.datetime; local HMS=(100*(100*Ti.hour+Ti.min)+Ti.sec)+0.001*Ti.ms;
local hms=string.sub(os.date(),12,19); hms=string.gsub(hms,':','')-10000;
local dt=hms-HMS; if 0>dt then dt=0 end
if 60>dt then
count=count+1; count1=count1+1; local m=math.floor(dt)+1; sts[m]=sts[m]+1;
end
end
function OnInit(pfile)
path = getScriptPath(); Log=io.open(path.."/test.log","w") --лог файл
end
результат помещается в лог файл test.log, который создается в каталоге , где размещается этот скрипт. в лог файл через каждые 100 обезличенных сделок записывается следующая строка:
77 - число инструментов 3554 - число обезличенных сделок далее количество сделок в интервале запаздывания с шагом 1 секунда 79 - в интервале запаздывания до 1 секунды 90 - в интервале запаздывания от 1 до 2 секунд 89 -в интервале запаздывания от 2 до 3 секунд
Пользователь
Сообщений: Регистрация: 30.01.2015
20.04.2023 15:42:03
думал что ошибка в тесте, написал новый , но лучше не стало. в тесте надо установить смещение часового пояса и секунд
Код
local tmp={}
local ds={}
local ns=0;
local shH=1 --сдвиг часового пояса
local shS=10 -- сдвиг секунд
local count,count1=0,0; local sts={} for i=1,200 do sts[i]=0; end
function main()
while true do
while #tmp>0 do
local t=tmp[1]; table.sremove(tmp,1);
if count>=1000 then count=0;
local s=""; for i=1,60 do s=s..tostring(sts[i])..",";end
Log:write(tostring(ns)..":"..tostring(count1)..">"..s.."\n"); Log:flush();
end
end
sleep(1);
end
end
function OnParam(c,s)
local d=ds[c..s]
if d==nil then
d,err=CreateDataSource (c,s,INTERVAL_TICK);
if d then d:SetEmptyCallback(); ns=ns+1; ds[c..s]=d; end
else
table.sinsert(tmp,{1,c,s});
end
end
function OnAllTrade(t)
local c,s=t.class_code,t.sec_code; local d=ds[c..s];
if d then
local Ti=t.datetime; local HMS=(60*(60*Ti.hour+Ti.min)+Ti.sec);--+0.001*Ti.ms;
local D=os.date("*t"); local hms=60*(60*(D.hour-shH)+D.min)+D.sec-shS;
local dt= hms-HMS; local size=d:Size(); local T1=d:T(size);
local HMS1=(60*(60*T1.hour+T1.min)+T1.sec);--+0.001*T1.ms;
if HMS==HMS1 then
if 0>dt then dt=0 end
if 60>dt then
count=count+1; count1=count1+1; local m=math.floor(dt)+1; sts[m]=sts[m]+1;
end
end
end
end
function OnInit(pfile)
local path = getScriptPath(); Log=io.open(path.."/test.log","w") --лог файл
end
Для того, чтобы можно было провести анализ, нам необходимо знать номер сделки, которая пришла с запозданием, время её исполнения и время её появления на Вашем терминале. Потому просим Вас привести примеры в указанном формате, это позволит нам начать разбор Вашей ситуации.
Для того, чтобы можно было провести анализ, нам необходимо знать номер сделки, которая пришла с запозданием, время её исполнения и время её появления на Вашем терминале. Потому просим Вас привести примеры в указанном формате, это позволит нам начать разбор Вашей ситуации.
сделал тест с автоподстройкой времени выкладываю скрипт теста
Код
local tmp={}
local ds={}
local ns=0;
local shH=1 --сдвиг часового пояса
local shS=0 -- сдвиг секунд
local count,count1=0,0; local sts={} ;-- for i=1,100 do sts[i]=0; end
function main()
while true do
-- nkevent.wait(event); --ждем события
while #tmp>1 do
local t=tmp[1]; table.sremove(tmp,1);
if count>=1000 then count=0;
local s=""; for i=1,100 do if sts[i] then s=s..tostring(sts[i])..","; end end
Log:write(tostring(ns)..":"..tostring(count1)..">"..s.."\n"); Log:flush();
end
end
sleep(1);
end
end
function OnParam(c,s)
local z=ds[c..s]
if z==nil then
d,err=CreateDataSource (c,s,INTERVAL_TICK);
if d then d:SetEmptyCallback(); ns=ns+1; ds[c..s]={d,0,0}; end
else
table.sinsert(tmp,{1,c,s}); --nkevent.Set(event);
end
end
function OnAllTrade(t)
local c,s=t.class_code,t.sec_code; local z=ds[c..s];
if z then local d=z[1]; local n=z[2]; local f=z[3];
local Ti=t.datetime; local HMS=(60*(60*Ti.hour+Ti.min)+Ti.sec)+0.001*Ti.ms;
local D=os.date("*t"); local hms=60*(60*(D.hour-shH)+D.min)+D.sec-shS;
local dt= hms-HMS+n;
local size=d:Size();
local T1=d:T(size); local HMS1=(60*(60*T1.hour+T1.min)+T1.sec)+0.001*T1.ms;
-- if 0>dt then dt=0 end
if f==0 then
if 0>=dt then f=1 z[3]=f end
end
if f~=0 and HMS==HMS1 then
-- if 60>dt then
if 0>dt then
if -1>=dt then
local n1=math.floor(0-dt) dt=dt+n1 n=n+n1;
if n>100 then n=0; z[3]=0; dt=0; end
z[2]=n
end
end
-- Log:write(tostring(hms)..","..tostring(s)..",size="..tostring(size)..",HMS="..tostring(HMS)..",dt="..tostring(dt)..",n="..tostring(n).."\n"); Log:flush();
if f~=0 then
local dt1=dt; if 0>dt then dt=0 end count=count+1; count1=count1+1;
local m=math.floor(dt)+1;
if m==nil or sts[m]==nil then
Log:write(tostring(hms)..","..tostring(s)..",size="..tostring(size)..",HMS="..tostring(HMS)..",HMS1="..tostring(HMS1)..",dt="..tostring(dt1)..",n="..tostring(n)..",m="..tostring(m).."\n"); Log:flush();
end
-- if m and 99>m then
if sts[m] then sts[m]=sts[m]+1; else sts[m]=1 end
-- end
end
end
end
end
function OnInit(pfile)
local path = getScriptPath(); Log=io.open(path.."/test.log","w") --лог файл
end
Так как Вам лень запускать его на вашем демо сервере, то выкладываю последние результаты На печать выводится сделка, которая первая с данной задержкой. Время компьютера, код инструмента, size, время этой сделки, время сделки но номеру size, разница времен, автосмещение, индекс ячейки (запаздывание sec+1)
Даниил Волошин написал: Нужен также номер сделки, по которому можно её отследить на всех этапах её следования.
Обнаружил, что в колбек onAllTrade сделки прилетают повторно!!!! ------------------- Написал для этого такой тест:
Код
local ds={}
local count=0;
function OnParam(c,s)
local z=ds[c..s] if z==nil then d,err=CreateDataSource (c,s,INTERVAL_TICK); if d then d:SetEmptyCallback(); ds[c..s]={d,0,0}; end end
end
function OnAllTrade(t)
count=count+1;
local c,s=t.class_code,t.sec_code; local z=ds[c..s]; local num=t.trade_num;
if z then
if z[2]==num then
Log:write(os.date()..","..tostring(s)..",num="..tostring(num)..","..tostring(count)..",повторение "..tostring(z[3]) .."\n"); Log:flush();
else
Log:write(os.date()..","..tostring(s)..",num="..tostring(num)..","..tostring(count).."\n"); Log:flush();
end
z[2]=num; z[3]=count;
end
end
function OnInit(pfile) local path = getScriptPath(); Log=io.open(path.."/test.log","w") end
function main() while true do sleep(1000); end end
анализ результата: ---------------------- 1-я сделка 26361,SBER,num=4781728079,size=57343,HMS=26306.0,dt=55.0,n=0,m=56,clock=2.4609999999998 ------------------------------ последняя сделка 26361,SBER,num=4781729267,size=57604,HMS=26358.0,dt=3.0,n=0,m=4,clock=2.4740000000002 --------------------- Первое число 26361 - это время компьютера в секундах. Оно не изменилось ------------------------- Последнее число - это os.clock в секундах изменяется от 2.461 до 2.474 т е на 13 миллисекунд. ---------------------- HMS - время сделок в секундах изменилось от 26306 до 26358 т е на 52 секунды ---------------------- Таким образом , запаздывание прихода сделок самого ликвидного инструмента составило 52 секунду. ----------------------------------------- Причем, сделки почти за минуту получили за 13 миллисекунд ------------------------------ Все верно? ----------------------------- Можете объяснить?
Пользователь
Сообщений: Регистрация: 30.01.2015
22.04.2023 09:36:15
в итоге имеем это: 229:156066>64821,89358,916,70,5,18,2,11,3,3,7,11,7,9,22,6,23,13,4,13,30,23,16,10,1,6,8,4,25,8,9,11,41,47,1,18,43,10,4,10,4,9,13,6,22,9,4,15,22,7,44,13,10,3,22,2,2,4,6,10,7,6,3,2,2,10,1,2,1,4,8,6,
Пользователь
Сообщений: Регистрация: 30.01.2015
24.04.2023 08:54:44
, Добрый день,
Вам достаточно информации, что объяснить по данным Вашего демо сервера: ----------------------------- 1) повторение обезличенных сделок в onAllTrade ---------------------------------- 2) запаздывание прихода обезличенных сделок до 60 секунд по ликвидному инструменту SBER.
Просим прощения, немного поторопили Вас. На демо-доступе QUIK Junior идёт эмуляция торгов - так называемый игровой полигон, следовательно причины могут отличаться от таковых на реальных торгах.
Просим Вас всё же в аналогичном формате привести в пример: номер сделки, которая пришла с запозданием, её время и время её появления на терминале, но с реального рынка (подключаясь к Сбербанку). Также укажите обязательно дату и сервер (его адрес) к которому Вы подключались. Так мы сможем обратиться к Вашему брокеру и совместно с ним разобрать возможную задержку обезличенных сделок.
Просим прощения, немного поторопили Вас. На демо-доступе QUIK Junior идёт эмуляция торгов - так называемый игровой полигон, следовательно причины могут отличаться от таковых на реальных торгах.
Просим Вас всё же в аналогичном формате привести в пример: номер сделки, которая пришла с запозданием, её время и время её появления на терминале, но с реального рынка (подключаясь к Сбербанку). Также укажите обязательно дату и сервер (его адрес) к которому Вы подключались. Так мы сможем обратиться к Вашему брокеру и совместно с ним разобрать возможную задержку обезличенных сделок.
Добрый день, Понятно. Но хотел бы услышать Ваше объяснение применительно к Вашему демо серверу. Судя по данным , приведенным мною выше, Вы отправляете обезличенные сделки пакетом. Для демо сервера размер пакета получается в 1 минуту. Полагаю, что на рабочем сервере отправка пакетами остается но возможно, что интервал меньше. Это так? ---------------------------------- Кроме того, могу выложить задержки по свечам. На 1 минутных свечах на демо сервере у Вас задержки до 20 секунд. ====================== Для свечей я наблюдал аналогичные задержки и на рабочем сервере. Обычно это задержка до 10 секунд. ------------------------------- Поясните механизм возникновение этих задержек. ------------------------------- Задержка интернет и загрузка процессора исключаются, так как их величина на несколько порядков меньше. ------------------
QUIK clients support
Сообщений: Регистрация: 28.07.2022
30.05.2023 11:12:15
Добрый день,
Просим прощения за долгое ожидание ответа,
Задержки в получении данных на терминале могут возникать также в том случае, если терминал получает большое количество данных за короткий промежуток времени (например включен заказ всех доступных данных), из-за этого просто напросто может возникать очередь. Такой вариант развития событий вполне возможен при подключении к серверу брокера пользователем, у которого есть права на большое количество классов. В данном случае имеет смысл указать в настройках терминала в "Получение данных" у котировок - "умным" заказом данных и у обезличенных сделок - выбрать только необходимые классы.
По демо-доступу: Просим Вас уточнить, задержки наблюдаются как на фондовом рынке, так и на срочном?
Если есть возможность, то просьба написать нам на почту с ссылкой на данную тему, указав Ваш UID на демо-доступе. Постараемся оперативно разобрать данную ситуацию.