quik 8.5 + lua 5.3 = ошибка

Страницы: 1
RSS
quik 8.5 + lua 5.3 = ошибка
 
Попробовал перейти на на указанную связку - перекомпилил своего робота, возникает ошибка при выставлении стоп заявки:
Неправильно указана цена: "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 это фидно не нравится. Кого леи как лечить не очень понятно :(
 
Блин, добавьте уже редактирование сообщений на форуме, даже опечатки не исправить. Я даже боюсь представить как там квик еще работает, если такие элементарные вещи годами не могут сделать :(
 
Цитата
ISR написал:
как лечить
Довольно легко лечится
 
На сайте Lua вот что сказано:
Цитата

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
 
string.format ("%i", price) - так подойдет?
Ну и я так понимаю назад дороги уже нет? Все равно нужно переходить рано или поздно на 5.3, если не сидеть на старых версиях квика.
Но пока сырая версия - часто висит в состоянии "не отвечает", раз просто грохнулся молча - остался дамп ~1Гб.
 
Код
function formatPrice(price)
    price = tostring(price)

    if string.match(price, '%.(0+)$') then
        price = string.format("%.0f", price)
    end

    return price
end
 
Здравствуйте, ISR.
Для диагностики причин аварийного завершения работы терминала при выполнении lua-скрипта, нам необходимо изучить дамп-файл.
Загрузите его, пожалуйста, в какое-либо облачное хранилище, после напишите нам по адресу quiksupport@arqatech.com. В письме укажите ссылку на данный форум, а также ссылку на скачивание файла.
Заранее большое спасибо.
 
Цитата
Aphelion написал:
Код
   function   formatPrice (price) 
Спасибо, но вроде и string.format ("%i", price) работает.

Цитата
Evgeniy Karnaukhov написал:
...нам необходимо изучить дамп-файл...
Отправил.
 
ISR, Ваше письмо получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
Цитата
ISR написал:
Спасибо, но вроде и string.format ("%i", price) работает.
string.format("%i", price) приведет число к челому виду. Заявки по инструментам с дробным шагом цены будете выставлять по неправильной цене.
 
Я делаю так, если price уже есть, и это значение (число или текст) уже кратно шагу цены.

Код
local scale = getSecurityInfo(classCode, secCode).scale
local price = string.format("%." .. scale .. "f", tonumber(price))
 
Цитата
Aphelion написал:
Цитата
ISR написал:
Спасибо, но вроде и string.format ("%i", price) работает.
string.format("%i", price) приведет число к челому виду. Заявки по инструментам с дробным шагом цены будете выставлять по неправильной цене.
Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.
 
Цитата
ISR написал:
Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.

QUIK ругается потому что ему передают дробное число а на инструменте целый шаг цены.
ели шаг цены дробный то можно передавать дробное число округленное до шага цены.
 
Цитата
Sergey Gorokhov написал:
Цитата
ISR написал:
Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.

QUIK ругается потому что ему передают дробное число а на инструменте целый шаг цены.
ели шаг цены дробный то можно передавать дробное число округленное до шага цены.
Значит так будет правильно?

local scale = getSecurityInfo(classCode, secCode).scale
local price = string.format("%." .. scale .. "f", tonumber(price))
 
Цитата
ISR написал:
Значит так будет правильно?

Если работает значит правильно (не проверял)
 
function Round(num, n) -- Функция округляет до указанного количества знаков
  local n = (n or 0)
  return tonumber(string.format("%."..n.."f", num))
end
 
Попробуйте что-то типа такого
Код
-- Получение цены в правильном представленнии для выставления транзакции
---@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 5.3
Скрипт в обычной текстовой форме, не компилирован.

Цитата
Александр М написал:
с изменением синтаксиса естественно под новую версию
Где можно почитать об отличиях синтаксиса 5.1 от 5.3 ?
 
На оффициальном сайте LUA - есть все изменения в языке по версиям. Для примера https://lua.org.ru/contents_ru.html#8
Также по вот этому коду: https://github.com/keplerproject/lua-compat-5.3
можно понять, что пришлось напсать для обеспечения совместимости 5.1 и 5.3. Это рекомендуется делать, т.к. не ясно где будет запущен скрипт - в строй версии Квика или в новой.
 
Цитата
Egor Zaytsev написал:
Если совет Александра не поможет, то пришлите архив рабочего места QUIK (без ключей доступа и файла chm) а также Ваш скрипт
Это сделать затруднительно, т.к. совместно с lua работает фреймворк, написанный на С++



Вот, выдаёт такую ошибку. Что бы это значило?
 
Запускаешь скрипт первый раз - выдаёт ошибку на скрине. Запускаешь второй - квик слетает, не оставляя дампа. Имеет смысл снять дамп с помощью for_dump ?
 
Цитата
Александр Волфовиц написал:
совместно с lua работает фреймворк, написанный на С++
Почти уверен, что причина в загружаемой длл. В 8.5.2 подлечили обработку ошибок, если вылетает акцесс виолейшен, это с хорошей вероятностью именно акцесс виолейшен, а не что-то другое. А это, в свою очередь, означает косяк в сишном коде. Запускайте под отладчиком, смотрите, где падает, окружайте брейкпойнтами, все как обычно на сях.
 
Anton,всё оказалось до смешного проще: я скомпилировал dll со сборкой с sourceforge для 64bit lua 5.1  :shock:


После замены на 64bit lua53 и небольшой коррекции кода всё заработало как по маслу )))
Страницы: 1
Читают тему
Наверх