Кусочек текста скрипта,занимающегося обработкой таблицы обезличенных сделок:
что мы тут имеем?
rescan() получает новые сделки из ТОС и для каждой вызывает обработчик process_trade
первое действие в process_trade есть вывод в лог самой сделки
следующее действие - превращение времени сделки в некий объект.
Время от времени (закономерность неясна) последнее действие приводит к развалу скрипта по причине недопустимых данных в datetime сделки.
Смотрим конец логфайла:
Все строчки абсолютно нормальные, а последняя выведенная очень интересна. Все поля нулевые, в том числе и datetime.
Соответственно, обработка datetime приводит к краху:
Ситуация регулярно появляется как на моем компьютере, так и на множестве других компьютеров, что установлен этот скрипт.
И собственно вопросы:
Код |
---|
-- Собирает из ТОС новые обезличенные сделки rescan = function() if not database.need_tos_rescan then return end local num_trades = getNumberOf("all_trades") - 1 local items = SearchItems("all_trades", database.tos + 1, num_trades, database.search_function, "class_code,sec_code,datetime.day,datetime.month,datetime.year" ) or {} database.tos = num_trades for _,n in ipairs(items) do database.process_trade(getItem("all_trades",n)) end database.save() end, --------------------------------------------------------------- -- Обработка одной сделки process_trade = function(trade) log.write(trade) local trade_datetime = datetime(trade.datetime) |
что мы тут имеем?
rescan() получает новые сделки из ТОС и для каждой вызывает обработчик process_trade
первое действие в process_trade есть вывод в лог самой сделки
следующее действие - превращение времени сделки в некий объект.
Время от времени (закономерность неясна) последнее действие приводит к развалу скрипта по причине недопустимых данных в datetime сделки.
Смотрим конец логфайла:
Код |
---|
8:44:57.500 {repoterm=0,price=111620,trade_num=1899010832,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010832,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440244} 18:44:57.562 {repoterm=0,price=111620,trade_num=1899010833,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010833,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440242} 18:44:57.703 {repoterm=0,price=111620,trade_num=1899010834,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010834,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240} 18:44:57.796 {repoterm=0,price=111610,trade_num=1899010835,yield=0,value=772272,qty=6,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010835,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240} 18:44:57.875 {repoterm=0,price=111620,trade_num=1899010836,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010836,flags=1025,datetime={week_day=4,hour=10,ms=405,mcs=405000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240} 18:44:58.093 {repoterm=0,price=0,trade_num=0,yield=0,value=0,qty=0,reporate=0,class_code=TQBR,repovalue=0,exchange_code=,accruedint=0,tradenum=0,flags=0,datetime={week_day=1,hour=0,ms=0,mcs=0,day=1,month=1,sec=0,year=1601,min=0},sec_code=ABRD,seccode=ABRD,settlecode=,period=0,repo2value=0,open_interest=0} |
Соответственно, обработка datetime приводит к краху:
Код |
---|
E:\quik\LuaIndicators\BS.lua:1085: Assert failed: /GoogleDisk/ROBOT/_LUA/datetime.lua : 106 Невозможно рассчитать Unix time: {week_day=1,hour=0,ms=0,mcs=0,year=1601,month=1,day=1,sec=0,min=0,isdst=false} stack traceback: E:\quik\LuaIndicators\BS.lua:1085: in function <E:\quik\LuaIndicators\BS.lua:1074> (tail call): ? E:\quik\LuaIndicators\BS.lua:1446: in function 'floor' E:\quik\LuaIndicators\BS.lua:2563: in function 'process_trade' E:\quik\LuaIndicators\BS.lua:2545: in function 'rescan' E:\quik\LuaIndicators\BS.lua:2828: in function 'iterate' E:\quik\LuaIndicators\BS.lua:1839: in function <E:\quik\LuaIndicators\BS.lua:1802> |
Ситуация регулярно появляется как на моем компьютере, так и на множестве других компьютеров, что установлен этот скрипт.
И собственно вопросы:
- Что это было?
- За что такое счастье?
- Как этого счастья избежать?
Пасхалочка для Алексея Иванникова: