Попробовал перейти на на указанную связку - перекомпилил своего робота, возникает ошибка при выставлении стоп заявки: Неправильно указана цена: "18913.0" Сообщение об ошибке: Число не может содержать знак разделителя дробной части local trans_params = { ACCOUNT = Account, CLIENT_CODE = comment..Comment, -- comment CLASSCODE = ClassCode, SECCODE = SecCode, ACTION = "NEW_STOP_ORDER", TRANS_ID = trans_id, STOP_ORDER_KIND = "TAKE_PROFIT_AND_STOP_LIMIT_ORDER", OPERATION = operation, QUANTITY = tostring (quantity), PRICE = tostring (price), STOPPRICE = tostring (take_price), STOPPRICE2 = tostring (stop_price), OFFSET = tostring (TakeOffset), -- Отступ от мин/макс SPREAD = tostring (TakeSpread), -- Защитный спрэд OFFSET_UNITS = "PRICE_UNITS", SPREAD_UNITS = "PRICE_UNITS", EXPIRY_DATE = "GTC", MARKET_STOP_LIMIT = "NO", MARKET_TAKE_PROFIT = "NO", IS_ACTIVE_IN_TIME = "NO" } Я так понимаю tostring теперь стал вместо int'а float печатать, ну т.е. с дробной частью, а sendTransaction это фидно не нравится. Кого леи как лечить не очень понятно :(
Блин, добавьте уже редактирование сообщений на форуме, даже опечатки не исправить. Я даже боюсь представить как там квик еще работает, если такие элементарные вещи годами не могут сделать :(
The conversion of a float to a string now adds a .0 suffix to the result if it looks like an integer. (For instance, the float 2.0 will be printed as 2.0, not as 2.) You should always use an explicit format when you need a specific format for numbers. (Formally this is not an incompatibility, because Lua does not specify how numbers are formatted as strings, but some programs assumed a specific format.)
Цитата
ISR написал: Кого леи как лечить не очень понятно :(
string.format ("%i", price) - так подойдет? Ну и я так понимаю назад дороги уже нет? Все равно нужно переходить рано или поздно на 5.3, если не сидеть на старых версиях квика. Но пока сырая версия - часто висит в состоянии "не отвечает", раз просто грохнулся молча - остался дамп ~1Гб.
Здравствуйте, ISR. Для диагностики причин аварийного завершения работы терминала при выполнении lua-скрипта, нам необходимо изучить дамп-файл. Загрузите его, пожалуйста, в какое-либо облачное хранилище, после напишите нам по адресу quiksupport@arqatech.com. В письме укажите ссылку на данный форум, а также ссылку на скачивание файла. Заранее большое спасибо.
ISR написал: Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.
QUIK ругается потому что ему передают дробное число а на инструменте целый шаг цены. ели шаг цены дробный то можно передавать дробное число округленное до шага цены.
ISR написал: Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.
QUIK ругается потому что ему передают дробное число а на инструменте целый шаг цены. ели шаг цены дробный то можно передавать дробное число округленное до шага цены.
Значит так будет правильно?
local scale = getSecurityInfo(classCode, secCode).scale local price = string.format("%." .. scale .. "f", tonumber(price))
-- Получение цены в правильном представленнии для выставления транзакции
---@param price number
---@param SCALE number|nil
local function format_to_scale(price, SCALE)
if type(price) ~= 'number' then error(("bad argument price (number expected, got %s)"):format(type(price)),2) end
local status,res = pcall(function()
SCALE = SCALE or 0
price = tostring(price):gsub(',', '.')
-- Ищет в числе позицию точки
local dot_pos = price:find('%.')
if SCALE > 0 then
-- Если передано целое число
if dot_pos == nil then
-- Добавляет к числу '.' и необходимое количество нулей и возвращает результат
price = price..'.'..string_rep('0', SCALE)
else -- передано вещественное число
local remain = price:sub(dot_pos+1, -1)
local scale = remain:len()
if scale ~= SCALE then
price = price:sub(1, dot_pos)..remain:sub(1, math_min(scale, SCALE))
price = price..(SCALE > scale and string_rep('0', SCALE - scale) or '')
end
end
elseif dot_pos ~= nil and SCALE == 0 then
price = price:sub(1, dot_pos-1)
end
return price
end)
if not status then
log.error('Error format_to_scale: '..tostring(res))
return price
end
return res
end
Константин Рейм написал: function Round(num, n) -- Функция округляет до указанного количества знаков local n = (n or 0) return tonumber(string.format("%."..n.."f", num))end
Могу предложить альтернативу, работает в 10 раз быстрее (функции с текстом довольно тормозные)
Только обратите внимание, что параметр okrugl работает чуть иначе, ниже написано
-- округляет заданное значение -- если okrugl 10 то из 125, делает 120, а если 100, то из 1120 делает 1100 -- есил okrugl 1 то округлит до целого числа (по умолчанию) -- если okrugl дробное, например 0.01 то округлит до сотых function math_floor_my (znach, okrugl) if okrugl == nil then okrugl = 1 end
if znach < 0 then return - math.floor (-znach/okrugl)*okrugl else return math.floor (znach/okrugl)*okrugl end end --math_floor_my
Ну вот, обновил до 8.5.2.11 (до этого была 8.3.2.4) , и при запуске работавшего ранее без проблем скрипта квик вылетел с сообщением что-то вроде "закрыто рабочее место QUIK". Откатил обратно к 8.3.2.4 - всё нормально работает.
Александр Волфовиц написал: Ну вот, обновил до 8.5.2.11 (до этого была 8.3.2.4) , и при запуске работавшего ранее без проблем скрипта квик вылетел с сообщением что-то вроде "закрыто рабочее место QUIK". Откатил обратно к 8.3.2.4 - всё нормально работает.
В какую сторону хоть копать, подскажите?
Копать в сторону перекомпиляции скрипта под lua 5.3 с изменением синтаксиса естественно под новую версию.
Александр Волфовиц написал: Ну вот, обновил до 8.5.2.11 (до этого была 8.3.2.4) , и при запуске работавшего ранее без проблем скрипта квик вылетел с сообщением что-то вроде "закрыто рабочее место QUIK". Откатил обратно к 8.3.2.4 - всё нормально работает.
В какую сторону хоть копать, подскажите?
Добрый день.
Если совет Александра не поможет, то пришлите архив рабочего места QUIK (без ключей доступа и файла chm) а также Ваш скрипт, на почту quiksupport@arqatech.com
На оффициальном сайте LUA - есть все изменения в языке по версиям. Для примера https://lua.org.ru/contents_ru.html#8 Также по вот этому коду: https://github.com/keplerproject/lua-compat-5.3 можно понять, что пришлось напсать для обеспечения совместимости 5.1 и 5.3. Это рекомендуется делать, т.к. не ясно где будет запущен скрипт - в строй версии Квика или в новой.
Запускаешь скрипт первый раз - выдаёт ошибку на скрине. Запускаешь второй - квик слетает, не оставляя дампа. Имеет смысл снять дамп с помощью for_dump ?
Александр Волфовиц написал: совместно с lua работает фреймворк, написанный на С++
Почти уверен, что причина в загружаемой длл. В 8.5.2 подлечили обработку ошибок, если вылетает акцесс виолейшен, это с хорошей вероятностью именно акцесс виолейшен, а не что-то другое. А это, в свою очередь, означает косяк в сишном коде. Запускайте под отладчиком, смотрите, где падает, окружайте брейкпойнтами, все как обычно на сях.