Николай Камынин пишет: код увидел. Мне читать все топики лень, поэтому я выскажусь, возможно что кто-то уже это сказал. 1) Работа через onParam - самый плохой вариант. Там и хранилище очень тяжелое и данный колбек на каждый чих срабатывает при этом если срез не пришел и не актуальный то он вообще потеряется. Т е через этот колбек Вы обязательно недосчитаетесь сделок когда-нибудь --------------------------------- 2) Поэтому данную задачу полагаю надо решать через onAllTrade По крайней мере решение через onAllTrade будет полным, но возможно что есть и более быстрое но не полное. Поэтому решение через onAllTrade должно быть базовым а остальные, если они будут быстрее надо сравнивать с базовым.
-------------------------------- Поэтому предлагаю написать вариант через onAllTrade и изложить претензии к такому решению (желательно с примерами)
отлично, жду от Вас примера кода. (без иронии)
Пользователь
Сообщений: Регистрация: 01.02.2015
28.05.2015 18:38:00
Цитата
Николай Камынин пишет: Поэтому предлагаю написать вариант через onAllTrade и изложить претензии к такому решению (желательно с примерами)
Время в ТТП транслируется без мкс, поэтому сказать точно, какая там разница не представляется возможным.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 31.01.2015
28.05.2015 18:43:43
Пример кода сейчас писать некогда, но для OnAllTrade могу сказать, что в пределах одной торговой площадки там сделки поступают строго в порядке увеличения времени, поэтому считать можно по ним. При этом надо запоминать время самой последней сделки из этой секции биржи и если придет сделка с более ранним временем с той же секции, то просто игнорировать ее (такое может быть если не включена галка "получать информацию по всем сделкам с текущего момента" и сделки по какому-то инструменту были заказаны спустя какое-то время после начала торгов - тогда сначала придут все сделки по этому инструменту, совершенные с начала торгов до текущего момента).
Пользователь
Сообщений: Регистрация: 01.02.2015
28.05.2015 18:44:52
с другой стороны, если с биржи в квик каким-то образом приходит биржевое время и разработчики вдруг (ну а вдруг?) согласятся сделать коллбек OnMarketTimeChange - то многие задачи отпадут сами собой (и эта в том числе)
Пользователь
Сообщений: Регистрация: 01.02.2015
28.05.2015 18:48:26
Цитата
Дмитрий пишет: Пример кода сейчас писать некогда, но для OnAllTrade могу сказать, что в пределах одной торговой площадки там сделки поступают строго в порядке увеличения времени, поэтому считать можно по ним. При этом надо запоминать время самой последней сделки из этой секции биржи и если придет сделка с более ранним временем с той же секции, то просто игнорировать ее (такое может быть если не включена галка "получать информацию по всем сделкам с текущего момента" и сделки по какому-то инструменту были заказаны спустя какое-то время после начала торгов - тогда сначала придут все сделки по этому инструменту, совершенные с начала торгов до текущего момента).
тут мы опять имеем "галки" - для моей задачи - это неприемлемо.
Пользователь
Сообщений: Регистрация: 31.01.2015
28.05.2015 18:50:05
Цитата
sam063rus пишет: тут мы опять имеем "галки" - для моей задачи - это неприемлемо.
Я описал, как сделать, чтобы наличие или отсутствие галки не влияло на работу скрипта:
Цитата
sam063rus пишет: При этом надо запоминать время самой последней сделки из этой секции биржи и если придет сделка с более ранним временем с той же секции, то просто игнорировать ее
Пользователь
Сообщений: Регистрация: 30.01.2015
28.05.2015 18:50:11
Ну вот я написал Вам черновик вашего счетчика: он будет считать для всех инструментов Сразу скажу, что это черновик и в нем изложены основные идеи, но детально не отлаживал Дерзайте. ------------------- 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 --------------------
Пользователь
Сообщений: Регистрация: 01.02.2015
28.05.2015 18:53:14
, большое спасибо за пример. Посмотрю.
Пользователь
Сообщений: Регистрация: 01.02.2015
28.05.2015 22:49:42
Убрал пока что из скрипта все расчёты:
Код
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 - это работает.
В итоге, имеем то, что имеем....
Прошу tech support пояснить.
Пользователь
Сообщений: Регистрация: 01.02.2015
28.05.2015 22:56:22
Цитата
sam063rus пишет: т.е. время: 21:18:19 - попросту отсутствует.
для справки: я также на всякий случай делал анализ нарастающего итога по сделкам в ТВС - всё равно не сходится. (с временным гистерезисом в одну секунду - тоже)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.05.2015 01:07:10
Написал тестовый скрипт для подсчёта общего количества сделок по колбекам OnAllTrade и OnParam Результаты на демо-сервере по SBER:
Price - цена последней сделки Num Trades - количество сделок с момента запуска скрипта Time - время последней сделки, согласно колбеку Local Time - локальное время получения колбека Count - количество полученных колбеков: 1) для OnParam счётчик увеличивается при увеличении параметра NUMTRADES 2) для OnAllTrade: поскольку OnAllTrade приходят "пачками", то счётчик увеличивается при приходе новой "пачки" сделок при условии, когда между соседними колбеками прошло более 20 мс
Как видите, количество сделок совпадает. Количество колбеков немного отличается. Завтра проверю на боевом сервере.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 01:34:17
проверьте на "боевом", на фортс, фьючерс SiM5. То, что Вы показали - не объясняет почему в OnParam не было изменения параметра за 21:18:19. К тому же, как Вы можете видеть - мои таблицы - тоже не дадут мне соврать - визуально видно, что нет сходимости в данных.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.05.2015 01:34:33
Цитата
sam063rus пишет: т.е. время: 21:18:19 - попросту отсутствует.
Вы не привели миллисекунды сделок, а мс там такие:
Т.е., эти сделки могли попросту не успеть попасть в "срез" на 21:18:19, а попали в следующий "срез".
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 01:37:55
повторюсь - мой скрипт вполне даже себе уверенно и правильно считает. местами... )) потом - хреново считает (такое ощущение, что идёт прогрузка данных) потом - опять замечательно считает.
Мне надо - чтоб он считал -ВСЕГДА и не итог, а именно то, что мне надо: количество сделок в секунду.
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 01:43:22
Цитата
sam063rus пишет: повторюсь - мой скрипт вполне даже себе уверенно и правильно считает. местами... )) потом - хреново считает (такое ощущение, что идёт прогрузка данных)
Имеется в виду который считает по AllTrade, и только по одному инструменту?
Цитата
sam063rus пишет: что мне надо: количество сделок в секунду.
По одному инструменту или по классу или на одной секции биржи?
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 01:44:09
насчёт мс и мкс - я сохранил данные таблиц в текстовые файлы, потом выгрузил в эксель. Но при сохранении в текстовый файл штатными средствами квика - почему-то не сохранились все поля таблицы. да это по сути и не особо важно бо как даже при таком представлении - все отсчёты в ТВС - реально показаны. Насчёт срезов - скажу так, имхо: параметры "время" в ТВС и TIME в ТТП - насколько я себе это представляю, - одинаковые по определению. и именно по ним построены таблицы. Так о каких тогда срезах можно говорить?
sam063rus пишет: Так о каких тогда срезах можно говорить?
на бирже были три сделки подряд все три придут в ТВС а обновлений ТТП за это время может прийти, например, только два (а то и меньше), так как они происходят только с определенной периодичностью в первом обновлении ТТП будет указано число сделок 1 и время 1-й сделки во втором - число сделок 3 и время 3-й сделки
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 01:52:26
в ТТП у меня: Время последней сделки и количество сделок
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 01:53:15
т.е. не просто какое-то время с потолка (время обновления по непонятно какому параметру), а именно время последней сделки
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 01:55:03
Цитата
Старатель пишет: Написал тестовый скрипт для подсчёта общего количества сделокпо колбекам OnAllTrade и OnParam Результаты на демо-сервере по SBER:
Даже на демо-сервере видно, что число коллбэков по изменению ТТП меньше, чем по приходу новой сделки (при том что там еще не все колбэки OnAllTrade посчитаны, т.е. не учтены идущие подряд с минимальным интервалом). Это иллюстрация к моему предыдущему сообщению. Думаю, на боевом сервере в самый разгар торгов разница будет еще больше.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.05.2015 01:56:34
Цитата
sam063rus пишет: Насчёт срезов - скажу так, имхо: параметры "время" в ТВС и TIME в ТТП - насколько я себе это представляю, - одинаковые по определению. и именно по ним построены таблицы. Так о каких тогда срезах можно говорить?
Ещё раз: в ТТП показываются не все сделки, а только часть, срезами один-несколько раз в сек. Поэтому сделки с 940 мс могли просто не попасть в таблицу, а попала, скажем следующая
Старатель пишет: Написал тестовый скрипт для подсчёта общего количества сделокпо колбекам OnAllTrade и OnParam Результаты на демо-сервере по SBER:
Даже на демо-сервере видно, что число коллбэков по изменению ТТП меньше, чем по приходу новой сделки (при том что там еще не все колбэки OnAllTrade посчитаны, т.е. не учтены идущие подряд с минимальным интервалом). Это иллюстрация к моему предыдущему сообщению. Думаю, на боевом сервере в самый разгар торгов разница будет еще больше.
я в версии скрипта на основе OnParam коллбеки и не считал, а учитывал изменение количества сделок к предыдущему.
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 01:59:09
Я думаю, что по OnParam невозможно сделать точный подсчет количества сделок в секунду.
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 02:00:29
Цитата
sam063rus пишет: я в версии скрипта на основе OnParam коллбеки и не считал, а учитывал изменение количества сделок к предыдущему
я к тому, что ТТП изменяется далеко не при каждой новой сделке
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:02:37
Цитата
Дмитрий пишет: Я думаю, что по OnParam невозможно сделать точный подсчет количества сделок в секунду.
я не спорю - осталось дождаться "официального подтверждения" и пусть укажут в документации (зарегистрируют очередное пожелание), что по факту полагаться на коллбеки OnParam однозначно нестоит бо как они не учитывают все изменения.
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 02:06:22
Цитата
sam063rus пишет: я не спорю - осталось дождаться "официального подтверждения" и пусть укажут в документации (зарегистрируют очередное пожелание), что по факту полагаться на коллбеки OnParam однозначно нестоит бо как они не учитывают все изменения
Если поискать на форуме, то по-моему уже найдется немало указаний на это, в том числе и официальных.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:06:42
Цитата
Дмитрий пишет: я к тому, что ТТП изменяется далеко не при каждой новой сделке
по нормальному - должна при каждорй сделке - т.к. сделка - это уже существенный факт.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.05.2015 02:08:41
Цитата
sam063rus пишет: по нормальному - должна при каждорй сделке - т.к. сделка - это уже существенный факт.
У вас в стоит "Запрашивать данные раз в 1 сек"
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:09:32
А там меньше и не поставишь насколько я знаю
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 02:10:26
Цитата
sam063rus пишет: по нормальному - должна при каждорй сделке - т.к. сделка - это уже существенный факт.
В свое время разработчики решили иначе :) Насколько я понимаю, обновление ТТП происходит через определенные интервалы времени, независимо от частоты изменения тех или иных параметров. Таков принцип работы квика с ТТП.
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 02:11:36
Цитата
sam063rus пишет: А там меньше и не поставишь насколько я знаю
Там можно вообще не ставить галку, тогда ТТП будет обновляться намного чаще.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:12:47
в таком случае, боюсь задча счётчика останет ся не разрешимой бо как на фортс вдобавок ко всему в OnAllTrade округляется всё до миллисекунд.
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 02:15:34
По-моему, задача вполне решаема, именно с использованием OnAllTrade. Округление до миллисекунд не критично - если и даст погрешность, то незначительную.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:16:09
либо, пусть разработчики решат проблему с синхронизацией ТТП - потому как скрипт большую часть времени всё же правильно показывает.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:17:39
в общем, как и говорил ранее: у кого какие варианты с кодом есть - Welcome!
Пользователь
Сообщений: Регистрация: 31.01.2015
29.05.2015 02:20:05
Цитата
sam063rus пишет: в общем, как и говорил ранее: у кого какие варианты с кодом есть - Welcome!
На досуге напишу, если к тому времени вопрос еще не решится.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:20:32
Цитата
Дмитрий пишет: По-моему, задача вполне решаема, именно с использованием OnAllTrade. Округление до миллисекунд не критично - если и даст погрешность, то незначительную.
остаётся только вопрос как её правильно оценивать бо как ТТП - уже скомпрометирована. А визуально по ТВС - результаты получаются ещё хуже чем в версии скрипта с OnParam
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.05.2015 02:20:37
sam063rus, по-моему вы "из мухи делаете слона". Если вам нужен счётчик сделок, то за отдельную плату я могу вам его написать. По OnAllTrade. Больше ничего не надо. Можно и по OnParam, но там точность будет не очень.
Надо делать так, как надо. А как не надо - делать не надо.
sam063rus пишет: что мне надо: количество сделок в секунду.
По одному инструменту или по классу или на одной секции биржи?
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:22:46
если бы я за каждую муху платил денег - я осталс бы без штанов.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:26:29
Цитата
Дмитрий пишет: По одному инструменту или по классу или на одной секции биржи?
изначально я планировал по классу (по фьючерсам), потом выяснилось,что наблюдается рассинхронизация между отдельными бумагами в классе. В итоге, остановился хотя бы на одной бумаге (тут синхронизация - полная)
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
29.05.2015 02:36:02
Цитата
sam063rus пишет: если бы я за каждую муху платил денег - я осталс бы без штанов.
sam063rus, хитрый вы какой: с других , а сами за чужой труд платить не желаете (Дмитрий спрашивал вас, кстати о .)
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 02:38:33
с OnAllTrade также пришлось столкнуться с тем, что надо знать "правильное чередование" и наличие "галочек". К тому же, коллбеки приходили со вчерашней вечерней сессии (понятно что сессия длится от клиринга до клиринга). В общем, это только кажется, что так всё просто.
sam063rus пишет: если бы я за каждую муху платил денег - я осталс бы без штанов.
sam063rus , хитрый вы какой: с других , а сами за чужой труд платить не желаете (Дмитрий спрашивал вас, кстати о .)
С Дмитрием - мы всё уже решили - к тому же, моя подсказка в формате "clear room" была в топике для всех. Насчёт "трясти денег" - если создадите функциональный аналог qchart.dll - вам тогда не 10тыр, а в 3 раза больше будет )))))
Пользователь
Сообщений: Регистрация: 01.02.2015
29.05.2015 03:11:07
Цитата
sam063rus пишет: с OnAllTrade также пришлось столкнуться с тем, что надо знать "правильное чередование" и наличие "галочек". К тому же, коллбеки приходили со вчерашней вечерней сессии (понятно что сессия длится от клиринга до клиринга). В общем, это только кажется, что так всё просто.
Дмитрий пишет: По одному инструменту или по классу или на одной секции биржи?
изначально я планировал по классу (по фьючерсам), потом выяснилось,что наблюдается рассинхронизация между отдельными бумагами в классе. В итоге, остановился хотя бы на одной бумаге (тут синхронизация - полная)
вдобавок ко всему, - чем сложней и совершенней алгоритм в OnAllTrade был - тем больше тормозил квик, а учитывая, что сделок туда сыпется видимо-невидимо - то ...