Rostislav Kudryashov
Rostislav Kudryashov личный блог
21 ноября 2023, 15:43

Экспорт данных. Похвала 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()
...


22 Комментария
  • А. Г.
    21 ноября 2023, 15:52
    В стаканах квика задержки по времени от 1 до 5 секунд, в таблице всех сделок от 0.5 до 2 секунд. Поэтому высокочастотная торговля там не работает, как и торговля с отслеживанием стаканов.

    Ну а со среднем временем в позиции больше 30 минут и(или) со средней прибыльной сделкой больше 0,8% в квике нет никаких проблем.
      • А. Г.
        21 ноября 2023, 17:22
        Rostislav Kudryashov, не знаю, но задержки есть. Квик даже свечки в графиках  одноминуток меняет из-за задержек в таблице сделок  после окончания минуты.

        В моих системах минутки закачиваются и этот «сбой» со сменой цен закрытия минуток  я заметил, качая минутки с графика в моменты окончания минуток и потому сделал программу формирования минуток из таблиц всех сделок с отслеживанием времени совершения сделок. Потому что для моих алгоритмов  не имеет значение задержка на секунды, а вид минутки имеет значение.
  • OrinokoA
    21 ноября 2023, 19:09
    лучше за себя говорить. работает и ладно. но не у всех хорошо, или бы не ругали
      • OrinokoA
        21 ноября 2023, 20:06
        Rostislav Kudryashov, то есть все плохие, один ты хороший и умный. а почему ты решил, что если сейчас тебя устраивает работа квика и скриптов на твоем компе, то и у других тоже должно работать хорошо? ты — эталон? вообще есть другие люди с другими задачами и их реализацией, не стоит собой все мерить, мир гораздо шире
      • OrinokoA
        21 ноября 2023, 20:08
        Rostislav Kudryashov, дмитрий зы — не твой ник?
  • OrinokoA
    22 ноября 2023, 07:53
    тебе ж не про твой helloworld на луа пишут, а про другие системы и задачи которые квик не тянет. ты серьезно пишешь сделки прям на HDD? 
      • OrinokoA
        22 ноября 2023, 18:33
        Rostislav Kudryashov, это хорошо, если три инструмента тянешь. я тяну все, что есть — в sqlite3. и по опционам инфу сохраняю. по всем. я понимаю, что сейчас мне все инструменты не нужны, но уже сталкивался с тем, что бывает нужно что-то, чего нет в других источниках и брать данные просто неоткуда. или данные кривые. так что у каждого свое. 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн