Блог им. kurd
Replikant_mih, последнюю мою систему Квик просто физически не потянул, хотя вся его задача была, это трансляция данных и получение заявок. До заявок дело не дошло.))Это слова. Факты таковы. Регистрируем обезличенные сделки — это самый интенсивный поток данных с биржи. Самые торгуемые фьючерсы MXZ3, RIZ3, SiZ3. Вместо неуказанного протокола передачи данных используем самый дубовый, напролом, вывод в текстовый файл на HDD.
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
Dlt;ServerTm;LocalTm;TradeDateTime;Sec;Cls;Per;TradeNo;Flags;Price;QtyА вот код на QLua 5.3.5
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
-- Вывод в файл обезличенные сделки и 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()...
Ну а со среднем временем в позиции больше 30 минут и(или) со средней прибыльной сделкой больше 0,8% в квике нет никаких проблем.
«Flash Boys. Высокочастотная революция на Уолл-Стрит» Майкл Льюис.
В Quik'е событие OnQuote() и команда getQuoteLevel2() не дают такой информации.
И почему события в стакане должны иметь задержку в несколько раз большую, чем в таблице обезличенных сделок?
В моих системах минутки закачиваются и этот «сбой» со сменой цен закрытия минуток я заметил, качая минутки с графика в моменты окончания минуток и потому сделал программу формирования минуток из таблиц всех сделок с отслеживанием времени совершения сделок. Потому что для моих алгоритмов не имеет значение задержка на секунды, а вид минутки имеет значение.
После подачи заявки из QLua командой sendTransaction() до подтверждения от брокера в событии OnTransReply() проходит 50-100 миллисекунд.
После этого до получения от брокера регистрации заявки на бирже по событию OnOrder() проходит ещё 50-100 миллисекунд.
Т.е. подтверждение заявки после её подачи Quik'ом приходит от брокера (с биржи) через 0.2 секунды максимум.
Но точно ли, что все спекули, подавая заявки через Quik, «отдают все деньги дяде»?
Про себя могу сказать, что мои прибыльные заявки, в основном, исполняет именно Quik.
А вот мой скрипт — это вполне эталон качества. Знай наших!