Скрипт выводит в лог последнюю котировку bid/offer из OnParam и OnQuote:
Скрытый текст
Код
function OnQuote(class_code, sec_code)
if not bRun or sec_code ~= sSecCode or class_code ~= sClassCode then return end
local tStakan = getQuoteLevel2(class_code, sec_code)
local nBid_Count, nOffer_Count = tonumber(tStakan.bid_count), tonumber(tStakan.offer_count)
if nBid_Count ~= 0 then
local nBid = tonumber(tStakan.bid[nBid_Count].price)
if nBid ~= nBid_Q then
_toLog('[OnQuote] bid='..nBid); nBid_Q = nBid
end
end
if nOffer_Count ~= 0 then
local nOffer = tonumber(tStakan.offer[1].price)
if nOffer ~= nOffer_Q then
_toLog('[OnQuote] offer='..nOffer); nOffer_Q = nOffer
end
end
end
function OnParam(class_code, sec_code)
if not bRun or sec_code ~= sSecCode or class_code ~= sClassCode then return end
local nOffer = tonumber(getParamEx(class_code, sec_code, "OFFER").param_value)
local nBid = tonumber(getParamEx(class_code, sec_code, "BID").param_value)
if nBid ~= nBid_P then
_toLog('[OnParam] bid='..nBid); nBid_P= nBid
end
if nOffer ~= nOffer_P then
_toLog('[OnParam] offer='..nOffer); nOffer_P = nOffer
end
end
Старатель пишет: Скрипт выводит в лог последнюю котировку bid/offer из OnParam и OnQuote Из лога видно, что OnParam даёт информацию об изменении котировки раньше.
Кстати, я специально даю фрагменты кода, чтобы каждый мог самостоятельно проверить на своём рабочем месте и опровергнуть мои доводы. Пока этого никто не сделал.
Надо делать так, как надо. А как не надо - делать не надо.
Сомнительные выводы из эксперимента (что непременно через OnParam надо котировки доставать). Там разница в пределах погрешности измерения + время на вызов колбека. Наверняка в квике написано что-то вроде --- нашКрутойОбработчикКотировок(котировка) начать засунутьКотировкуВТТП(котировка) вызватьЭтотВашOnParam(paramPamPam) вызватьЭтотВашOnQuote(класс, бумага) закончить --- Т.е. если OnParam нет, то и переживать не стоит, что он мог бы раньше вызваться. Кроме того, в привидённом примере есть запись, противоречащая (по крайней мере на первый взгляд) утверждению о последовательности:
В общем случае - это разные сигналы с биржи. Это очевидно хотя бы из того, что в OnParam - одно любое (!) значение, а OnQuote - это всегда целый стакан, а не только bid/offer
Если бы всё было так, как вы говорите - мы бы не узнали об изменении данных в стакане в случае, когда bid/offer не изменились.
Таким образом наблюдаемые факты - результат везения пакетов в интернете и настройка серверов биржи и брокера по поводу частоты обновления стакана (именно это параметр в бОльшей степени рулится биржей и где-то было на форуме, что сервер квик тоже настраивается на эту тему вроде, нежели рассылка данных ТТП).
Максим пишет: Сомнительные выводы из эксперимента (что непременно через OnParam надо котировки доставать). Там разница в пределах погрешности измерения + время на вызов колбека.
Ну наконец-то хоть кто-то решил оспорить мои выводы. Парирую: Да, действительно, в большинстве случаев разница небольшая. Среднее значение за рассматриваемый период порядка 22 мс. Но погрешность тут ни при чём: и без времени видно, что в большинстве случаев OnParam даёт котировку раньше.
Цитата
Максим пишет: Кроме того, в привидённом примере есть запись, противоречащая (по крайней мере на первый взгляд) утверждению о последовательности
Есть такая запись. Но это единственный случай из приведённого фрагмента лога, когда OnQuote оказывается "быстрее".
Очевидно, OnParam, как и OnAllTrade, приходят "пачками". Немного подчистил лог, удалив из него близкие по времени записи OnParam:
Не трудно заметить, что помимо того, что OnParam приходит раньше (в большинстве случаев), но и несколько чаще (незначительно, но факт). Уверен, это зависит от настроек сервера. Поэтому у каждого могут быть свои результаты. Но в моём случае, очевидно, работа с OnParam позволит раньше, пусть и ненамного, среагировать на изменение котировок.
Надо делать так, как надо. А как не надо - делать не надо.
уже не раз было подтвердено, что даже биржа грешит с поставкой и релевантностью данных
квик, ка было доказано ранее, исходя из противоречивых ответов самих разработчиков - ещё та система.
вы - не являетесь юридическими пользователями квика, а всего лишь - конечными. Так что Вы можете от них просить/требовать? При том, что они сами не знают свой софт. Разъясняю на пальцах: в рзное время, задавая те же вопросы разным представителям "Арки" - Вы гарантировано получите разные ответы по причинам указанным выше.
Как решить проблему? Для себя - я сделал для каждого эмитента - профиль изменяемых параметров. И если параметры в профиль не укладываются - значит есть факт манипулирвания или технического сбоя (как сейчас принято говорить)
Подытожив: Надо строить свой торговый алгоритм не на времени, а на качестве. (можно долго разъяснять всю "кухню" но, со временем вы к этому сами придёте...)
что можно просить от компании, которая принимает на работу студентов (если верить их официальным интервью...) читай между строк -> так меньше платить:))))
Так OnParam на кучу всего реагирует, так что частота не показатель. Возможно OnQuote дёргается не на каждую котировку, а только если стакан поменялся с момента последнего вызова OnQuote. Т.е. если с сервера идёт 1000 котировок в секунду, а я могу обрабатывать только 100, то нигде эти котировки не копятся, просто меняется объект, возвращаемый по getQuoteLevel2, после возврата из OnQuote она вызывается ещё раз, итого ровно 100 раз в секунду. Ну я бы так реализацию написал :) Попробуйте добавить getQuoteLevel2 в OnParam и getParamEx в OnQuote. Может статься, что в OnParam показывается вообще не та же котировка, что потом покажется в OnQuote. И ещё, у вас же в скрипте хитрость - если между двумя вызовами OnQuote действительно стакан может несколько раз туда-сюда сходить, то вы на второй вызов ничего не напечатаете, т.к. best bid/offer "те же". Для OnParam оно имеет смысл, а тут уменьшает кол-во настоящих записей в логах. Или можно не гадать и дождаться ответа разработчиков =)
К сожалению нет возможности однозначно и точно ответить на озвученный здесь вопрос. Схема приоритезации и синхронизации разных потоков торговой информации зависит зависят от тех или иных настроек сервера QUIK, и шлюзов к различным торговым системам. В общих чертах можно сказать, что "как правило" соблюдается следующий порядок рассылки на клиентские места QUIK — таблица текущих параметров, котировки, сделки, заявки, стоп-заявки, лимиты, графики, все-сделки.
Также на "скорость" получения данных на клиентском месте будут влиять другие факторы (канал, загрузка cpu, загрузка HDD), поэтому, как тут верно подметили, нужно брать конкретного брокера и смотреть "свой" результат.
Максим пишет: Так OnParam на кучу всего реагирует, так что частота не показатель.
Цитата
Максим пишет: И ещё, у вас же в скрипте хитрость - если между двумя вызовами OnQuote действительно стакан может несколько раз туда-сюда сходить, то вы на второй вызов ничего не напечатаете, т.к. best bid/offer "те же".
Частоту вызовов OnParam и OnQuote имеет смысл сравнивать только при изменении одинаковых параметров. В данном случае при изменении bid/offer. Поэтому я написал так, как написал - сравниваем только те колбеки, которые дают новую котировку bid/offer. По другому никак.
Цитата
Максим пишет: Может статься, что в OnParam показывается вообще не та же котировка, что потом покажется в OnQuote.
А по логу разве не видно, что в большинстве случаев OnQuote приносит туже котировку, что до этого нам показал OnParam?
Надо делать так, как надо. А как не надо - делать не надо.
Alexandr Shumilin пишет: В общих чертах можно сказать, что "как правило" соблюдается следующий порядок рассылки на клиентские места QUIK — таблица текущих параметров, котировки, сделки, заявки, стоп-заявки, лимиты, графики, все-сделки.
Вот тут у меня есть сомнения: графики обновляются с большой задержкой по сравнению с ТВС. Хотя это может быть результатом частного случая настройки частоты обновлений графиков на сервере. В моём случае частота обновлений графиков - примерно 1 раз/сек.
Надо делать так, как надо. А как не надо - делать не надо.
Идёт с сервера bid=10, offer=11 вызывается OnParam, печатает bid=10, offer=11 вызывается OnQuote, печатает bid=10, offer=11 идёт с сервера bid=9, offer=11 вызывается OnParam, печатает bid=9 идёт с сервера bid=10, offer=11 вызывается OnParam, печатает bid=10 вызывается OnQuote, печатает ... а ничего не печатает, для него ничего не изменилось.
Я такую ситуацию имел в виду. Что "та же котировка" и "те же значения чисел лучших спроса-предложения" - несколько разные вещи.
Кстати, сотрудники арки, можете описать механизм вызова OnQuote? Вызывается ли он на каждое изменение котировок? Если случилось 1000 обновлений стакана в секунду, мой скрипт обрабатывает OnQuote со скоростью 100 в секунду, сколько раз будет вызван OnQuote? 1000 (и будет работать 10 секунд)? 100 (и будет работать секунду)? Другое число? Те же вопросы к OnParam.
замечал, что частенько бывает, что стакан иногда начинает "догонять" пропущенные данные - т.е. как на ускоренной перемотке навёрстывать из прошлого данные.
Добрый день. OnQuote вызывается на каждое изменение стакана, полученное с сервера. Если вы получите на терминал 1000 изменений с сервера и ваш скрипт обрабатывает 100 в секунду, то сетевая очередь на стороне клиента будет разобрана за 10 секунд.
Michael Bulychev пишет: Добрый день. OnQuote вызывается на каждое изменение стакана, полученное с сервера. Если вы получите на терминал 1000 изменений с сервера и ваш скрипт обрабатывает 100 в секунду, то сетевая очередь на стороне клиента будет разобрана за 10 секунд.
можно было сказать проще - стакан - тоже кешируется.
Цитата
и ваш скрипт обрабатывает 100 в секунду
а если скрипт не запущен, а работает просто обычный квик? Почему стаканы показывают информацию из прошлого? Кому она нужна???
единственное, что могу я допустить в этом случае - это увеличение доступа к файловой системе компьютера клиента. Как правило, одна из причин - связана с интенсивным ипользованием файла подкачки и сопутствующими этому разрушениями файловой системы. В итоге, - виртуальная память не успевает выделяться, а данные - всё прут и прут. Потом, наконец - выделяется. Но, спрашивается, кому нужен стакан, несоответствующи реальному timestamp.
Michael Bulychev пишет: По какому параметру Вы оцениваете что это стаканы "из прошлого"? Как определяете задержку?
если специально в него долго "пялиться" - то нетрудно заметить, что иной раз, идёт отставание данных на несколько секунд при интенсивных торгах. И видно, что такие цены и котировки - просто не могли быть в настоящем и будущем. Особенно заметно, когда ещё поглядываешь в это время на график. К тому же, именно в такие локальные моменты - слышется интенсивная работа винчестера, после которой с данными всё становится в порядке. Подозреваю, что идёт интенсивное обращение к диску, а именно, к файлу подкачки с целью выделения памяти.
Честно говоря - для меня всё это непроблема - я привёл лишь аргумент основанный на личном наблюдении. Данное явление происходит нечасто - потому и терпимо. Кроме того, прочитал в соседней ветке, что у народа есть определённые проблемы иной раз с доступом к своим базам данным. И что после перехода на SSD-диски - они благополучно решаются. ну, у меня-то SSD - нет. Я использую старый добрый checkdsk.
Michael Bulychev пишет: Добрый день. OnQuote вызывается на каждое изменение стакана, полученное с сервера. Если вы получите на терминал 1000 изменений с сервера и ваш скрипт обрабатывает 100 в секунду, то сетевая очередь на стороне клиента будет разобрана за 10 секунд.
Т.е. getQuoteLevel2 внутри одного вызова OnQuote будет всегда возвращать одно значение до следующего вызова OnQuote? А вызов getQuoteLevel2 в main тоже не вернёт новый стакан до тех пор, пока OnQuote не обработает старый? Если у меня торги длились секунду, было 1000 изменений, за эту секунду OnQuote обработал 100 стаканов, то в начале второй секунды он получит стакан, который в реальности был после 0.1 секунды от начала потока, т.е. 0.9 секунд назад, верно? Как объяснить эксперимент выше, где в OnQuote показывалось меньше данных, чем в OnParam?
sam063rus пишет: Но, спрашивается, кому нужен стакан, несоответствующи реальному timestamp.
С одной стороны, да. А с другой, может кто-то сохраняет историю стакана. Может, стоит сделать настройку: если на сервере скопилась очередь OnQuote, то, в зависимости от этой настройки выдавать на рабочее место либо всю очередь в хронологическом порядке (как сейчас) либо только последнее состояние стакана.
Надо делать так, как надо. А как не надо - делать не надо.
Как много написано. Но вот простой пример, который дает на правильный ответ: .... ------------------------------ function OnQuote(cl,se) if se~=set or mstart==false then return end; nqute=nqute+1; Log(nqute,"qut"); end
function OnParam(cl,se) if se~=set or mstart==false then return end; npar= npar+1; Log(npar,"par") end ... А вот результат для сбербанка: 06/18/15 19:15:06 par=230 -- это число вызовов колбека оnParam в том числе и по изменению стакана 06/18/15 19:15:06 qut=415 -- это число вызовов OnQuote при изменении стакана Т е если следить за изменением очереди котировок не нужно, а надо лишь какую-нибудь цену, которая была лучшей когда-то то можно работать по onParam. Но делать вывод что onParam быстрее, когда вызов OnQuote в 2 раза чаще - это прикольно.
Николай Камынин пишет: Но вот простой пример, который дает на правильный ответ
Звучит, как "А сейчас я расскажу вам всю правду..." Ну, ну, ага.
Цитата
Николай Камынин пишет: Но делать вывод что onParam быстрее, когда вызов OnQuote в 2 раза чаще - это прикольно.
Это тем более забавно, когда вы делаете выводы на основе данных с игрового сервера.
Ну вот скажите, зачем желаемое выдавать за действительное? У Вас слишком богатая фантазия. Вам это надо? Ну, Врать? ---------------------------- Я никогда не делаю тесты на игровых. Но Вы можете, я не против. --------------------------- Это результаты на моем реальном счете и соответственно рабочем сервере в реальном времени.
Николай Камынин пишет: Это результаты на моем реальном счете и соответственно рабочем сервере в реальном времени.
В таком случае, вам надо настроить интервал обновления данных, чтобы не вводить людей (и себя в первую очередь) в заблуждение своими тестами. Информация как настроить есть в указанной выше мной теме. Почитайте, не ленитесь. ;-)
Надо делать так, как надо. А как не надо - делать не надо.