Попробовал перейти на на указанную связку - перекомпилил своего робота, возникает ошибка при выставлении стоп заявки: Неправильно указана цена: "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 это фидно не нравится. Кого леи как лечить не очень понятно :(
Пользователь
Сообщений: Регистрация: 02.02.2015
20.04.2020 10:42:07
Блин, добавьте уже редактирование сообщений на форуме, даже опечатки не исправить. Я даже боюсь представить как там квик еще работает, если такие элементарные вещи годами не могут сделать :(
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
Пользователь
Сообщений: Регистрация: 02.02.2015
20.04.2020 11:56:34
string.format ("%i", price) - так подойдет? Ну и я так понимаю назад дороги уже нет? Все равно нужно переходить рано или поздно на 5.3, если не сидеть на старых версиях квика. Но пока сырая версия - часто висит в состоянии "не отвечает", раз просто грохнулся молча - остался дамп ~1Гб.
Пользователь
Сообщений: Регистрация: 17.05.2018
21.04.2020 03:33:29
Код
function formatPrice(price)
price = tostring(price)
if string.match(price, '%.(0+)$') then
price = string.format("%.0f", price)
end
return price
end
Пользователь
Сообщений: Регистрация: 21.04.2020
21.04.2020 08:53:44
Здравствуйте, ISR. Для диагностики причин аварийного завершения работы терминала при выполнении lua-скрипта, нам необходимо изучить дамп-файл. Загрузите его, пожалуйста, в какое-либо облачное хранилище, после напишите нам по адресу . В письме укажите ссылку на данный форум, а также ссылку на скачивание файла. Заранее большое спасибо.
написал: Спасибо, но вроде и string.format ("%i", price) работает.
string.format("%i", price) приведет число к челому виду. Заявки по инструментам с дробным шагом цены будете выставлять по неправильной цене.
Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.
Пользователь
Сообщений: Регистрация: 23.01.2015
22.04.2020 12:09:22
Цитата
ISR написал: Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.
QUIK ругается потому что ему передают дробное число а на инструменте целый шаг цены. ели шаг цены дробный то можно передавать дробное число округленное до шага цены.
написал: Так как можно представить дробное число без разделителя дроби? Ведь именно на такой разделитель и ругается квик.
QUIK ругается потому что ему передают дробное число а на инструменте целый шаг цены. ели шаг цены дробный то можно передавать дробное число округленное до шага цены.
Значит так будет правильно?
local scale = getSecurityInfo(classCode, secCode).scale local price = string.format("%." .. scale .. "f", tonumber(price))
function Round(num, n) -- Функция округляет до указанного количества знаков local n = (n or 0) return tonumber(string.format("%."..n.."f", num)) end
Пользователь
Сообщений: Регистрация: 27.01.2017
07.05.2020 16:19:12
Попробуйте что-то типа такого
Код
-- Получение цены в правильном представленнии для выставления транзакции
---@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
Пользователь
Сообщений: Регистрация: 20.04.2016
25.05.2020 14:08:13
Цитата
Константин Рейм написал: 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
Пользователь
Сообщений: Регистрация: 27.05.2015
01.06.2020 10:40:41
Ну вот, обновил до 8.5.2.11 (до этого была 8.3.2.4) , и при запуске работавшего ранее без проблем скрипта квик вылетел с сообщением что-то вроде "закрыто рабочее место QUIK". Откатил обратно к 8.3.2.4 - всё нормально работает.
В какую сторону хоть копать, подскажите?
Пользователь
Сообщений: Регистрация: 28.03.2016
01.06.2020 12:22:56
Цитата
Александр Волфовиц написал: Ну вот, обновил до 8.5.2.11 (до этого была 8.3.2.4) , и при запуске работавшего ранее без проблем скрипта квик вылетел с сообщением что-то вроде "закрыто рабочее место QUIK". Откатил обратно к 8.3.2.4 - всё нормально работает.
В какую сторону хоть копать, подскажите?
Копать в сторону перекомпиляции скрипта под lua 5.3 с изменением синтаксиса естественно под новую версию.
- Роботы и индикаторы
QUIK clients support
Сообщений: Регистрация: 27.01.2015
01.06.2020 13:04:53
Цитата
Александр Волфовиц написал: Ну вот, обновил до 8.5.2.11 (до этого была 8.3.2.4) , и при запуске работавшего ранее без проблем скрипта квик вылетел с сообщением что-то вроде "закрыто рабочее место QUIK". Откатил обратно к 8.3.2.4 - всё нормально работает.
В какую сторону хоть копать, подскажите?
Добрый день.
Если совет Александра не поможет, то пришлите архив рабочего места QUIK (без ключей доступа и файла chm) а также Ваш скрипт, на почту
Пользователь
Сообщений: Регистрация: 27.05.2015
01.06.2020 13:41:02
Цитата
Александр М написал: Копать в сторону перекомпиляции скрипта под lua 5.3
Скрипт в обычной текстовой форме, не компилирован.
Цитата
Александр М написал: с изменением синтаксиса естественно под новую версию
Где можно почитать об отличиях синтаксиса 5.1 от 5.3 ?
Пользователь
Сообщений: Регистрация: 27.01.2017
01.06.2020 14:27:30
На оффициальном сайте LUA - есть все изменения в языке по версиям. Для примера Также по вот этому коду: можно понять, что пришлось напсать для обеспечения совместимости 5.1 и 5.3. Это рекомендуется делать, т.к. не ясно где будет запущен скрипт - в строй версии Квика или в новой.
Пользователь
Сообщений: Регистрация: 27.05.2015
01.06.2020 20:14:34
Цитата
Egor Zaytsev написал: Если совет Александра не поможет, то пришлите архив рабочего места QUIK (без ключей доступа и файла chm) а также Ваш скрипт
Это сделать затруднительно, т.к. совместно с lua работает фреймворк, написанный на С++
Вот, выдаёт такую ошибку. Что бы это значило?
Пользователь
Сообщений: Регистрация: 27.05.2015
01.06.2020 20:20:25
Запускаешь скрипт первый раз - выдаёт ошибку на скрине. Запускаешь второй - квик слетает, не оставляя дампа. Имеет смысл снять дамп с помощью for_dump ?
Пользователь
Сообщений: Регистрация: 21.08.2015
01.06.2020 20:33:39
Цитата
Александр Волфовиц написал: совместно с lua работает фреймворк, написанный на С++
Почти уверен, что причина в загружаемой длл. В 8.5.2 подлечили обработку ошибок, если вылетает акцесс виолейшен, это с хорошей вероятностью именно акцесс виолейшен, а не что-то другое. А это, в свою очередь, означает косяк в сишном коде. Запускайте под отладчиком, смотрите, где падает, окружайте брейкпойнтами, все как обычно на сях.
Пользователь
Сообщений: Регистрация: 27.05.2015
02.06.2020 21:36:16
Anton,всё оказалось до смешного проще: я скомпилировал dll со сборкой с sourceforge для 64bit lua 5.1
После замены на 64bit lua53 и небольшой коррекции кода всё заработало как по маслу )))