Блог им. kurd

Экспорт данных. Похвала Quik'у. Позор его хулителям

Как-то зашла речь smart-lab.ru/blog/961365.php
хорош Quik или плох.
Replikant_mih, последнюю мою систему Квик просто физически не потянул, хотя вся его задача была, это трансляция данных и получение заявок. До заявок дело не дошло.))
3Qu Сегодня в 00:28

3Qu, использовать события типа On-Anything для чего-то, кроме table.sinsert() — очень плохая идея. Никаких ДЛЛ в событиях! Эти события — в главном потоке Квика.
Для обработки данных из таблицы следует использовать table.sremove() в  функции main(). Например в цикле через wait (1) или wait(100) — тыщу или 10 раз в секунду. И очищать накопления в  таблице одним махом.
Rostislav Kudryashov Сегодня в 01:02

Rostislav Kudryashov, про main я в курсе. С другой стороны, что отдать в main, что сразу в ДЛЛ — время практически одинаковое (еще неизвестно, куда быстрее)). Дальше по любому асинхронно.
Кстати, и через main не тянет. Даже с пропусками части значений.
Квик, кстати, не виснет, с виду все нормально, время сервера начинает отставать от реала. Как вам данные 5-ти минутной давности?))
3Qu Сегодня в 01:25
Это слова. Факты таковы. Регистрируем обезличенные сделки — это самый интенсивный поток данных с биржи. Самые торгуемые фьючерсы MXZ3, RIZ3, SiZ3. Вместо неуказанного протокола передачи данных используем самый дубовый, напролом, вывод в текстовый файл на HDD.
К каждой записи добавляем расхождение времени ПК и времени сервера. Оно практически постоянно.
Quik тянет как зверь. Всё вовремя. За несколько часов расхождение между локальным временем ПК, временем сервера и временем из обезличенных сделок осталось в пределах 2 секунд.

Десктоп не очень новый: Intel® Core(TM) i7-3770 CPU @ 3.40 GHz, ядер 4, логических процессоров 8. Память 16 Гб. SSD AMD RSSL256G, HDD WDC WD5003ABYX-01WERA1.
При этом был запущен виртуальный ПК для интернет-браузера.

За 3 с лишним часа испытания набралось 70077 записей. Вот первые и последние из этих записей.
Dlt;ServerTm;LocalTm;TradeDateTime;Sec;Cls;Per;TradeNo;Flags;Price;Qty
   2;13:00:29;13:00:27;2023.11.20-13:00:29;SiZ3;SPBFUT;1;1892948986797760030;1026;88990.0000;2
...
   2;13:00:29;13:00:27;2023.11.20-13:00:29;RIZ3;SPBFUT;1;1925037134142534737;1025;113400.0000;1
...
   2;13:00:29;13:00:27;2023.11.20-13:00:30;MXZ3;SPBFUT;1;1984991304181889167;1026;320500.0000;1
… ...
   2;16:28:44;16:28:42;2023.11.20-16:28:45;SiZ3;SPBFUT;1;1892948986797842050;1026;89153.0000;1

А вот код на QLua 5.3.5
-- Вывод в файл обезличенные сделки и SERVERTIME-LOCALTIME
SecTbl = {"MXZ3", "RIZ3", "SiZ3"}
LogPath = "D:\\TMP\\OnAllTradeLog.csv"
DataQueue = {}
StopFlag = false
AllTradeTitle = "TradeDateTime;Sec;Cls;Per;TradeNo;Flags;Price;Qty"

function AllTradeToString (t)
-- Не включаем поля accruedint, yield, settlecode, reporate, repovalue,
-- repo2value, repoterm, open_interest, exchange_code, exec_market, benchmark.
  local dt = DateTimeToString (t.datetime)
  return string.format ("%s;%s;%s;%d;%d;%d;%.4f;%d", dt
    ,t.sec_code, t.class_code, t.period, t.trade_num, t.flags, t.price, t.qty)
end -- AllTradeToString()

function DateTimeToString (dt)
  return string.format ("%04d.%02d.%02d-%02d:%02d:%02d"
    ,dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec)
end -- DateTimeToString()

function OnAllTrade (alltrade) -- В Quik'е д.б.
-- Настройки-Программа-Получение данных-Обезличенные и
-- открыть, свернуть окно "Обезличенные сделки".
  for _,v in ipairs (SecTbl) do
    if v == alltrade.sec_code then
      table.sinsert (DataQueue, {alltrade
        ,getInfoParam ("SERVERTIME"), getInfoParam ("LOCALTIME")})
      return
    end
  end
end -- OnAllTrade()

function OnStop (signal)
  StopFlag = true
  return 1000
end -- OnStop()

function SendData (data)
  local at = AllTradeToString (data[1])
  local st = data[2]
  local lt = data[3]
  local dlt = TimeToSeconds (st) - TimeToSeconds (lt)
  LogFile:write (string.format ("%4d;%s;%s;%s\n", dlt, st, lt, at))
end -- SendData()

function TimeToSeconds (t) -- Текст формата HH:MM;SS
  return (tonumber (t:sub(1,2)) * 60 + t:sub(4,5)) * 60 + t:sub(7,8)
end -- TimeToSeconds()

function main()
  message ("main started\n".. "SERVER ".. getInfoParam ("SERVERTIME")
    .."\nLOCAL ".. getInfoParam ("LOCALTIME"))
  if 1 ~= isConnected() then error ("Not Connected") end
  for i = 1, #SecTbl do
    if not Subscribe_Level_II_Quotes ("SPBFUT", SecTbl[i]) then
      message ("Subscribe_Level_II_Quotes failed with ".. SecTbl[i])
      return
    end
  end
  LogFile = io.open (LogPath, "w")
  LogFile:write ("Dlt;ServerTm;LocalTm;".. AllTradeTitle .."\n")
  while not StopFlag do
    sleep (10)
    while #DataQueue > 0 do
      SendData (table.sremove (DataQueue, 1))
    end
  end -- while not StopFlag
  LogFile:close()
  message ("main StopFlag ".. tostring (StopFlag))
end -- main()
...


  • обсудить на форуме:
  • QUIK
| ★4
22 комментария
В стаканах квика задержки по времени от 1 до 5 секунд, в таблице всех сделок от 0.5 до 2 секунд. Поэтому высокочастотная торговля там не работает, как и торговля с отслеживанием стаканов.

Ну а со среднем временем в позиции больше 30 минут и(или) со средней прибыльной сделкой больше 0,8% в квике нет никаких проблем.
avatar
А. Г., 15:52 для высокочастотной торговли (HFT) биржевые акулы ставят свои серверы не далее, чем на противоположной стороне улицы от сервера биржи. Или в том же здании.
«Flash Boys. Высокочастотная революция на Уолл-Стрит» Майкл Льюис.
avatar
А. Г., 15:52 как удалось измерить задержку данных в стакане?
В Quik'е событие OnQuote() и команда getQuoteLevel2() не дают такой информации.
И почему события в стакане должны иметь задержку в несколько раз большую, чем в таблице обезличенных сделок?
avatar
Rostislav Kudryashov, не знаю, но задержки есть. Квик даже свечки в графиках  одноминуток меняет из-за задержек в таблице сделок  после окончания минуты.

В моих системах минутки закачиваются и этот «сбой» со сменой цен закрытия минуток  я заметил, качая минутки с графика в моменты окончания минуток и потому сделал программу формирования минуток из таблиц всех сделок с отслеживанием времени совершения сделок. Потому что для моих алгоритмов  не имеет значение задержка на секунды, а вид минутки имеет значение.
avatar
Не знаю как сейчас, но несколько лет назад с брокером Церих провёл тест.
После подачи заявки из QLua командой sendTransaction() до подтверждения от брокера в событии OnTransReply() проходит 50-100 миллисекунд.
После этого до получения от брокера регистрации заявки на бирже по событию OnOrder() проходит ещё 50-100 миллисекунд.
Т.е. подтверждение заявки после её подачи Quik'ом приходит от брокера (с биржи) через 0.2 секунды максимум.
avatar
Again, 17:03 об «истинном предназначении» Quik'а спор беспредметен — нет способа ни подтвердить, ни опровергнуть чьё-то мнение.

Но точно ли, что все спекули, подавая заявки через Quik, «отдают все деньги дяде»?
Про себя могу сказать, что мои прибыльные заявки, в основном, исполняет именно Quik.
avatar
лучше за себя говорить. работает и ладно. но не у всех хорошо, или бы не ругали
avatar
OrinokoA, 19:09 я так думаю, что  если бы спекули понимали, что делают, то не ругали бы, а хвалили Quik. Потому что если правильный скрипт хорошо работает на моём самом обыкновенном ПК и с не самым выдающимся брокером БКС (у брокера Альфа-банк тоже хорошо), то будет хорош везде.
avatar
Rostislav Kudryashov, то есть все плохие, один ты хороший и умный. а почему ты решил, что если сейчас тебя устраивает работа квика и скриптов на твоем компе, то и у других тоже должно работать хорошо? ты — эталон? вообще есть другие люди с другими задачами и их реализацией, не стоит собой все мерить, мир гораздо шире
avatar
OrinokoA, 20:06 не выдумай про весь мир. Речь в статье о конкретной задаче.
А вот мой скрипт — это вполне эталон качества. Знай наших!
avatar
Rostislav Kudryashov, дмитрий зы — не твой ник?
avatar
OrinokoA, 20:08 Дм.Зыкин — псевдоним, автор Дионис Каптарь. Последнее издание «Запрещённой экономики» вышло без псевдонима. Он туда включил кое-что из другой своей книги — «Как оболгали нашу великую историю». Про Россию 1913-1916 и всамделе потрясные факты.
avatar
тебе ж не про твой helloworld на луа пишут, а про другие системы и задачи которые квик не тянет. ты серьезно пишешь сделки прям на HDD? 
avatar
OrinokoA, Сегодня в 07:53 Никаких ограничений в Quik'е! Если кто захочет, может из внешней среды слать заявки прямо в файл на диск ПК. Скрипт QLua исполнит в долю секунды.
avatar
Rostislav Kudryashov, это хорошо, если три инструмента тянешь. я тяну все, что есть — в sqlite3. и по опционам инфу сохраняю. по всем. я понимаю, что сейчас мне все инструменты не нужны, но уже сталкивался с тем, что бывает нужно что-то, чего нет в других источниках и брать данные просто неоткуда. или данные кривые. так что у каждого свое. 
avatar

Читайте на SMART-LAB:
Фото
Софтлайн полностью погасил пятый выпуск облигаций
Друзья, рады сообщить, что сегодня мы полностью погасили выпуск облигаций серии 002Р-01 на сумму 6 млрд рублей. Все обязательства перед...
Самолет лидер по объему ввода жилья в МО
Друзья, привет! Продолжаем делиться своими результатами. 🚀 По данным Главстройнадзора МО , мы стали лидером по объемам ввода  жилья в...
Фото
🔔 Информация о выплате купонного дохода для наших инвесторов
Сегодня, 19 февраля, ООО МФК «ПСБ Финанс» выплатило купонный доход по облигациям ПСБ Фин2P2 (RU000A10E4G8) за купонный период с...
Фото
Россети Ленэнерго. Отчет об исполнении инвестпрограммы за Q4 2025г. Опасения оправдались - обесценение съело прибыль
Компания Россети Ленэнерго опубликовала отчет об исполнении инвестпрограммы за Q4 2025г., где показаны финансовые показатели компании по...

теги блога Rostislav Kudryashov

....все тэги



UPDONW
Новый дизайн