Иван (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Critical error ACCESS_VIOLATION in script...
 
Поймал ошибку "ACCESS VIOLATION" при вызове методов ParamRequest и CancelParamRequest из Lua скрипта индикатора.
Код
2 20:34:58 Function OnChangeSettings: ACCESS VIOLATION at address 00007FF8154C4F69 
6 20:35:15 File E:\MOEX\QUIK\LuaIndicators\test.lua, function OnDestroy(): ACCESS VIOLATION at address 00007FFFC6378993 

При вызове ParamRequest и CancelParamRequest из Lua скрипта (не индикатора) данная ошибка не наблюдается.
Согласно документации, ParamRequest и CancelParamRequest доступны из скрипта индикатора:
Цитата
Список функций, доступных из скрипта индикатора
ParamRequest  – заказывает получение параметров Таблицы текущих торгов.
CancelParamRequest  – отменяет заказ на получение параметров Таблицы текущих торгов.
getParamEx2  – получает значения всех параметров биржевой информации из Таблицы текущих торгов с возможностью в дальнейшем отказаться от получения определенных параметров.
QUIK версия 9.3.1.11
Lua версия 5.4.1
Код индикатора
Скрытый текст
Вывод индикатора
Тип Время Сообщение
1 20:34:58 [Indicator] ParamRequest
2 20:34:58 Function OnChangeSettings: ACCESS VIOLATION at address 00007FF8154C4F69
3 20:34:58 [Indicator] getParamEx2 'PRICEMAX' {param_image=164,990, result=1, param_value=164990.000000, param_type=1}
5 20:35:15 [Indicator] CancelParamRequest
6 20:35:15 File E:\MOEX\QUIK\LuaIndicators\test.lua, function OnDestroy(): ACCESS VIOLATION at address 00007FFFC6378993
Код скрипта
Скрытый текст
Вывод скрипта
Тип Время Сообщение
1 20:00:56 [Script] ParamRequest true
2 20:00:56 [Script] getParamEx2 'PRICEMAX' {param_image=164,990, param_value=164990.000000, param_type=1, result=1}
3 20:00:56 [Script] CancelParamRequest true
Изменение открытого интереса, Дополнительный параметр таблицы обезличенных сделок.
 
Есть более очевидный аргумент в пользу добавления нового параметра "Изменение открытого интереса" в таблицу обезличенных сделок - это возможность включить фильтрацию в таблице.

При включенном фильтре в таблице обезличенных сделок "Открытый интерес" сам по себе уже смысла не имеет.
Нужно именно значение "Изменение открытого интереса" относительно предыдущей сделки, которая чаще всего в фильтр уже не попадает и не видна в таблице в данном случае.

Скрытый текст
Неверная дата и время, Стандартные функции Lua возвращают неверное время сервера
 
Roman Azarov, в моем предыдущем примере точности до микросекунд не потребовалось. Но, все же это частный случай.
Тот же тест с микросекундами + статистика
Скрытый текст
вывод:
Скрытый текст
'sysdate.mcs' step-up:               'sysdate.mcs' step-up:               'sysdate.mcs' step-up:
 max     15644                        max     17826                        max     15640
 min     15603                        min     3049                         min     1065
 mean    15622.769231                 mean    13450.000000                 mean    12378.941176
Сейчас уже лучше видно, что os.sysdate имеет реальную точность ~16 msec +/-, как и было отмечено выше уже.

Цитата
Roman Azarov написал:
os.sysdate в отличие от os.clock вызывает в довесок к winapi'шной GetSystemTimeAsFileTime ещё и конвертацию через FileTimeToSystemTime. В последней и происходит округление миллисекунд.
т.е. пока получается, что реализация в полной мере не соответствует заявленному поведению в документациии
в документации нет примечания, что есть определенная погрешность в результате, выдаваемом функцией
Неверная дата и время, Стандартные функции Lua возвращают неверное время сервера
 
Цитата
Sergey Gorokhov написал:
в терминале версии 7.16 добавлена функция os.sysdate, позволяющая получить локальное время с точностью до микросекунд
обнаружил, что полученные из os.sysdate миллисекунды/микросекунды прирастают неравномерно, скачкообразно
ниже сравнил вывод sysdate.ms с os.clock()
версия QUIK 8.12.0.41
Код
function trace(level, msg)
   local sysdate = os.sysdate()
   local local_t = ("%02d:%02d:%04d %02d:%02d:%02d.%03d"):format(
         sysdate.day, sysdate.month, sysdate.year, sysdate.hour, sysdate.min, sysdate.sec, sysdate.ms)
   local _, clock_frac = math.modf(os.clock())
   local ms = ("%d"):format(math.floor(clock_frac*1000))

   local file = io.open(getScriptPath() .. "\\testSysDate.txt", "a")
   file:write(("%s %s [%s] : %s\n"):format(local_t, ms, level, msg))
   file:flush()
   file:close()
end

function testSysDate()
   for i = 0,getNumberOf("classes") - 1 do
      local code = getItem("classes", i).code
      trace("info", "Class " .. code)
   end
end
function main() testSysDate() end
вывод
Скрытый текст

28:03:2021 02:00:46.358 228 [info] : Class PSAU
28:03:2021 02:00:46.358 236 [info] : Class PSBB
28:03:2021 02:00:46.358 242 [info] : Class PSSU
..
28:03:2021 02:00:46.389 260 [info] : Class TQBR
28:03:2021 02:00:46.389 265 [info] : Class TQDE
28:03:2021 02:00:46.389 272 [info] : Class TQOB
...
389 - sysdate.ms
272 - fractional part of os.clock() -- milliseconds precision

видно, что вывод os.clock() гораздо точнее
Страницы: 1
Наверх