Николай Камынин пишет: код увидел. Мне читать все топики лень, поэтому я выскажусь, возможно что кто-то уже это сказал. 1) Работа через onParam - самый плохой вариант. Там и хранилище очень тяжелое и данный колбек на каждый чих срабатывает при этом если срез не пришел и не актуальный то он вообще потеряется. Т е через этот колбек Вы обязательно недосчитаетесь сделок когда-нибудь --------------------------------- 2) Поэтому данную задачу полагаю надо решать через onAllTrade По крайней мере решение через onAllTrade будет полным, но возможно что есть и более быстрое но не полное. Поэтому решение через onAllTrade должно быть базовым а остальные, если они будут быстрее надо сравнивать с базовым.
-------------------------------- Поэтому предлагаю написать вариант через onAllTrade и изложить претензии к такому решению (желательно с примерами)
Пример кода сейчас писать некогда, но для OnAllTrade могу сказать, что в пределах одной торговой площадки там сделки поступают строго в порядке увеличения времени, поэтому считать можно по ним. При этом надо запоминать время самой последней сделки из этой секции биржи и если придет сделка с более ранним временем с той же секции, то просто игнорировать ее (такое может быть если не включена галка "получать информацию по всем сделкам с текущего момента" и сделки по какому-то инструменту были заказаны спустя какое-то время после начала торгов - тогда сначала придут все сделки по этому инструменту, совершенные с начала торгов до текущего момента).
с другой стороны, если с биржи в квик каким-то образом приходит биржевое время и разработчики вдруг (ну а вдруг?) согласятся сделать коллбек OnMarketTimeChange - то многие задачи отпадут сами собой (и эта в том числе)
Дмитрий пишет: Пример кода сейчас писать некогда, но для OnAllTrade могу сказать, что в пределах одной торговой площадки там сделки поступают строго в порядке увеличения времени, поэтому считать можно по ним. При этом надо запоминать время самой последней сделки из этой секции биржи и если придет сделка с более ранним временем с той же секции, то просто игнорировать ее (такое может быть если не включена галка "получать информацию по всем сделкам с текущего момента" и сделки по какому-то инструменту были заказаны спустя какое-то время после начала торгов - тогда сначала придут все сделки по этому инструменту, совершенные с начала торгов до текущего момента).
тут мы опять имеем "галки" - для моей задачи - это неприемлемо.
sam063rus пишет: тут мы опять имеем "галки" - для моей задачи - это неприемлемо.
Я описал, как сделать, чтобы наличие или отсутствие галки не влияло на работу скрипта:
Цитата
sam063rus пишет: При этом надо запоминать время самой последней сделки из этой секции биржи и если придет сделка с более ранним временем с той же секции, то просто игнорировать ее
Ну вот я написал Вам черновик вашего счетчика: он будет считать для всех инструментов Сразу скажу, что это черновик и в нем изложены основные идеи, но детально не отлаживал Дерзайте. ------------------- is_run = true local Count={}
function OnAllTrade(t) local cl,se=t.class_code,t.sec_code; local t1=Count[cl] if t1==nil then t1={}; Count[cl]=t1; end local t2=t1[se] if t2==nil then t2={0;0}; t1[se]=t2; end local d=t.datetime; if d.sec==t2[1] then t2[2]=t[2]+1; t2[1]=d.sec else t2[2]=0; t2[1]=d.sec; end end
function main() while is_run do sleep(100) -- здесь я в своих программах использую Event OS но можно и так оставить end end
function OnStop() is_run = false return 1000 end --------------------
actNumTrades = 0
lastNumTrades = 0
lastTime = 0
actTime = 0
is_run = true
function OnParam(class_code, sec_code)
if class_code == "SPBFUT" and sec_code == "SiM5" then
actNumTrades = tonumber(getParamEx(class_code, sec_code, "NUMTRADES").param_value)
actTime = tonumber(getParamEx(class_code, sec_code, "TIME").param_value)
message(tostring(actTime) .. " " .. tostring(actNumTrades))
end
end
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
В общем, причина не работы моего скритпа была в том, что в OnParam почему-то теряются некоторые параметры, а точнее, сам коллбек - теряется. т.е. под апдейт невсегда всё попадает. Так, по ТВС ясно просматриваются реальные сделки по SiM5:
т.е. время: 21:18:19 - попросту отсутствует. И это ещё безобидный пример. Дальше - хлеще. Но, это уже, километры листинга. И хоть нам тут говорят, что мол, инфа копится и ничего не забывается. Но, что-то незаметно. Хотя, возможно для OnAllTrade - это работает.
sam063rus пишет: т.е. время: 21:18:19 - попросту отсутствует.
для справки: я также на всякий случай делал анализ нарастающего итога по сделкам в ТВС - всё равно не сходится. (с временным гистерезисом в одну секунду - тоже)
Написал тестовый скрипт для подсчёта общего количества сделок по колбекам OnAllTrade и OnParam Результаты на демо-сервере по SBER:
Price - цена последней сделки Num Trades - количество сделок с момента запуска скрипта Time - время последней сделки, согласно колбеку Local Time - локальное время получения колбека Count - количество полученных колбеков: 1) для OnParam счётчик увеличивается при увеличении параметра NUMTRADES 2) для OnAllTrade: поскольку OnAllTrade приходят "пачками", то счётчик увеличивается при приходе новой "пачки" сделок при условии, когда между соседними колбеками прошло более 20 мс
Как видите, количество сделок совпадает. Количество колбеков немного отличается. Завтра проверю на боевом сервере.
Надо делать так, как надо. А как не надо - делать не надо.
проверьте на "боевом", на фортс, фьючерс SiM5. То, что Вы показали - не объясняет почему в OnParam не было изменения параметра за 21:18:19. К тому же, как Вы можете видеть - мои таблицы - тоже не дадут мне соврать - визуально видно, что нет сходимости в данных.
повторюсь - мой скрипт вполне даже себе уверенно и правильно считает. местами... )) потом - хреново считает (такое ощущение, что идёт прогрузка данных) потом - опять замечательно считает.
Мне надо - чтоб он считал -ВСЕГДА и не итог, а именно то, что мне надо: количество сделок в секунду.
sam063rus пишет: повторюсь - мой скрипт вполне даже себе уверенно и правильно считает. местами... )) потом - хреново считает (такое ощущение, что идёт прогрузка данных)
Имеется в виду который считает по AllTrade, и только по одному инструменту?
Цитата
sam063rus пишет: что мне надо: количество сделок в секунду.
По одному инструменту или по классу или на одной секции биржи?
насчёт мс и мкс - я сохранил данные таблиц в текстовые файлы, потом выгрузил в эксель. Но при сохранении в текстовый файл штатными средствами квика - почему-то не сохранились все поля таблицы. да это по сути и не особо важно бо как даже при таком представлении - все отсчёты в ТВС - реально показаны. Насчёт срезов - скажу так, имхо: параметры "время" в ТВС и TIME в ТТП - насколько я себе это представляю, - одинаковые по определению. и именно по ним построены таблицы. Так о каких тогда срезах можно говорить?
sam063rus пишет: Так о каких тогда срезах можно говорить?
на бирже были три сделки подряд все три придут в ТВС а обновлений ТТП за это время может прийти, например, только два (а то и меньше), так как они происходят только с определенной периодичностью в первом обновлении ТТП будет указано число сделок 1 и время 1-й сделки во втором - число сделок 3 и время 3-й сделки
Старатель пишет: Написал тестовый скрипт для подсчёта общего количества сделокпо колбекам OnAllTrade и OnParam Результаты на демо-сервере по SBER:
Даже на демо-сервере видно, что число коллбэков по изменению ТТП меньше, чем по приходу новой сделки (при том что там еще не все колбэки OnAllTrade посчитаны, т.е. не учтены идущие подряд с минимальным интервалом). Это иллюстрация к моему предыдущему сообщению. Думаю, на боевом сервере в самый разгар торгов разница будет еще больше.
sam063rus пишет: Насчёт срезов - скажу так, имхо: параметры "время" в ТВС и TIME в ТТП - насколько я себе это представляю, - одинаковые по определению. и именно по ним построены таблицы. Так о каких тогда срезах можно говорить?
Ещё раз: в ТТП показываются не все сделки, а только часть, срезами один-несколько раз в сек. Поэтому сделки с 940 мс могли просто не попасть в таблицу, а попала, скажем следующая
Старатель пишет: Написал тестовый скрипт для подсчёта общего количества сделокпо колбекам OnAllTrade и OnParam Результаты на демо-сервере по SBER:
Даже на демо-сервере видно, что число коллбэков по изменению ТТП меньше, чем по приходу новой сделки (при том что там еще не все колбэки OnAllTrade посчитаны, т.е. не учтены идущие подряд с минимальным интервалом). Это иллюстрация к моему предыдущему сообщению. Думаю, на боевом сервере в самый разгар торгов разница будет еще больше.
я в версии скрипта на основе OnParam коллбеки и не считал, а учитывал изменение количества сделок к предыдущему.
Дмитрий пишет: Я думаю, что по OnParam невозможно сделать точный подсчет количества сделок в секунду.
я не спорю - осталось дождаться "официального подтверждения" и пусть укажут в документации (зарегистрируют очередное пожелание), что по факту полагаться на коллбеки OnParam однозначно нестоит бо как они не учитывают все изменения.
sam063rus пишет: я не спорю - осталось дождаться "официального подтверждения" и пусть укажут в документации (зарегистрируют очередное пожелание), что по факту полагаться на коллбеки OnParam однозначно нестоит бо как они не учитывают все изменения
Если поискать на форуме, то по-моему уже найдется немало указаний на это, в том числе и официальных.
sam063rus пишет: по нормальному - должна при каждорй сделке - т.к. сделка - это уже существенный факт.
В свое время разработчики решили иначе :) Насколько я понимаю, обновление ТТП происходит через определенные интервалы времени, независимо от частоты изменения тех или иных параметров. Таков принцип работы квика с ТТП.
По-моему, задача вполне решаема, именно с использованием OnAllTrade. Округление до миллисекунд не критично - если и даст погрешность, то незначительную.
Дмитрий пишет: По-моему, задача вполне решаема, именно с использованием OnAllTrade. Округление до миллисекунд не критично - если и даст погрешность, то незначительную.
остаётся только вопрос как её правильно оценивать бо как ТТП - уже скомпрометирована. А визуально по ТВС - результаты получаются ещё хуже чем в версии скрипта с OnParam
sam063rus, по-моему вы "из мухи делаете слона". Если вам нужен счётчик сделок, то за отдельную плату я могу вам его написать. По OnAllTrade. Больше ничего не надо. Можно и по OnParam, но там точность будет не очень.
Надо делать так, как надо. А как не надо - делать не надо.
Дмитрий пишет: По одному инструменту или по классу или на одной секции биржи?
изначально я планировал по классу (по фьючерсам), потом выяснилось,что наблюдается рассинхронизация между отдельными бумагами в классе. В итоге, остановился хотя бы на одной бумаге (тут синхронизация - полная)
с OnAllTrade также пришлось столкнуться с тем, что надо знать "правильное чередование" и наличие "галочек". К тому же, коллбеки приходили со вчерашней вечерней сессии (понятно что сессия длится от клиринга до клиринга). В общем, это только кажется, что так всё просто.
sam063rus пишет: если бы я за каждую муху платил денег - я осталс бы без штанов.
sam063rus , хитрый вы какой: с других трясёте денег , а сами за чужой труд платить не желаете (Дмитрий спрашивал вас, кстати о помощи .)
С Дмитрием - мы всё уже решили - к тому же, моя подсказка в формате "clear room" была в топике для всех. Насчёт "трясти денег" - если создадите функциональный аналог qchart.dll - вам тогда не 10тыр, а в 3 раза больше будет )))))
sam063rus пишет: с OnAllTrade также пришлось столкнуться с тем, что надо знать "правильное чередование" и наличие "галочек". К тому же, коллбеки приходили со вчерашней вечерней сессии (понятно что сессия длится от клиринга до клиринга). В общем, это только кажется, что так всё просто.
Дмитрий пишет: По одному инструменту или по классу или на одной секции биржи?
изначально я планировал по классу (по фьючерсам), потом выяснилось,что наблюдается рассинхронизация между отдельными бумагами в классе. В итоге, остановился хотя бы на одной бумаге (тут синхронизация - полная)
вдобавок ко всему, - чем сложней и совершенней алгоритм в OnAllTrade был - тем больше тормозил квик, а учитывая, что сделок туда сыпется видимо-невидимо - то ...