Помогите восстановить работоспособность скрипта LUA после перехода на quik 8.5 с lua 5.3

Страницы: 1
RSS
Помогите восстановить работоспособность скрипта LUA после перехода на quik 8.5 с lua 5.3
 
Это скрипт выставления стоп и тэйк профит заявки при открытии позиции (согласно заранее заданным в настройках параметрам условных заявок). С возможностью выставления лесенкой (но этим не пользовался).

После запуска скрипта на новой версии quik 8.5, при открытии позиции по Si выдается сообщение:

Цитата
Не правильно указана цена: "7581.0". Сообщение об ошибке: Число не может содержать знак разделителя дробной части.
Предполагаю, что надо подправить в скрипте форматы числа. Но вообще не знаком с Lua, скрипт в свое время скачал на Смарт-лабе.
При этом не понимаю претензии к дробной части. Ну ладно шаг в Си 1 рубль, но в других же инструментах он может быть и дробным, например 0,1.


Вот скрипт: https://cloud.mail.ru/public/214c/3K9knu96h

P.S. Не понимаю, почему за столько лет такой очевидно нужный многим функционал не встроен в QUIK, как, например, в Метатрейдер.
А еще круче была бы возможность так же выставлять стоп и тейк-профит по позициям, открываемым по срабатыванию другого стопа/тейка.
 
Здравствуйте,
Начиная с версии 8.5 терминала выполнено обновление ядра Lua до версии 5.3, и об этом мы не однократно всех уведомляли разными способами.
Вам следует адаптировать скрипт под новую версию.
Если нет возможности сделать это самостоятельно рекомендуем обратиться к автору скрипта.
В частности, возникшая у Вас проблема описана на официальном сайте 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.)


Проще говоря, замените везде функцию tostring на string.format
Например тут наши пользователи обсуждали такой же вопрос
 
Sergey Gorokhov,
Так проблема в самом QUIK, который в getParamEx возвращает строку с дробной частью: "1.000000" вместо "1", а на входе в sendTransaction для того же инструмента требует строку без разделителя.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Sergey Gorokhov,
Так проблема в самом QUIK, который в getParamEx возвращает строку с дробной частью: "1.000000" вместо "1", а на входе в sendTransaction для того же инструмента требует строку без разделителя.

Вы не правы, в представленном коде SEC_PRICE_STEP используется в математических операциях, так что проблема точно не с ним, а с тем что в результате попадает в tostring
 
Цитата
Sergey Gorokhov написал:
Цитата
Старатель написал:
Sergey Gorokhov ,
Так проблема в самом QUIK, который в getParamEx возвращает строку с дробной частью: "1.000000" вместо "1", а на входе в sendTransaction для того же инструмента требует строку без разделителя.
Вы не правы, в представленном коде SEC_PRICE_STEP используется в математических операциях, так что проблема точно не с ним, а с тем что в результате попадает в tostring

Дополним, как уже было сказано Lua 5.3 при переводе числа с типом float в строк добавляет к строке суфикс ".0"
Далее возникает вопрос от куда возник float, если все числа "целые".
Lua считает float любое число с разделителем (кстати не только lua).
если указать SEC_PRICE_STEP = 1.0
то получите ту же ошибку.

Да  getParamEx возвращает строку с дробной частью: "1.000000"
Но проблема же не в этом, вернее не только в этом, в конкретно этой ситуации изменение формата SEC_PRICE_STEP помогло бы.
Но стоит поменять инструмент на любой другой в котором дробный шаг цены и ошибка опять бы появилась.

По этому правильно форматировать то что попадает непосредственно в параметры транзакции, а не то что было до этого.
 
Цитата
Sergey Gorokhov написал:
в представленном коде SEC_PRICE_STEP используется в математических операциях, так что проблема точно не с ним, а с тем что в результате попадает в tostring
в tostring как раз попадает float из-за возвращаемого значения в getParamEx.

Цитата
Sergey Gorokhov написал:
Но стоит поменять инструмент на любой другой в котором дробный шаг цены и ошибка опять бы появилась.
Какая ошибка будет для инструмента с дробным шагом цены?

Цитата
Sergey Gorokhov написал:
По этому правильно форматировать то что попадает непосредственно в параметры транзакции, а не то что было до этого.

Правильно всё же работать с правильными значениями. Так, для целочисленных вычислений все входящие параметры необходимо привести к integer. Не после, а до вычислений!
Скрытый текст
В данном случае проблема именно в самом QUIK. Так, например, getParamEx(CLASS_CODE,SEC_CODE,"BID").param_value даст вам значение, которое вы не сможете подать в sendTransaction без лишних вычислений.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
В данном случае проблема именно в самом QUIK. Так, например, getParamEx(CLASS_CODE,SEC_CODE,"BID").param_value даст вам значение, которое вы не сможете подать в sendTransaction без лишних вычислений.
Добрый день.
Чтобы было более прозрачно, опишу как сейчас реализовано. Если в структурах Quik параметр, например bid, хранится в double, то и в QLua вернется в double, а из-за особенности Lua 5.2 tostring для double будет добавлять постфикс в виде '.0'. Так будет для всех чисел которые ездят в Quik в double, они будут отдаваться в сыром виде.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Цитата
Nikolay Pavlov написал:
а из-за особенности Lua 5.2 tostring для double будет добавлять постфикс в виде '.0'.
конечно я говорю о Lua 5.3
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Цитата
Sergey Gorokhov написал:
Если нет возможности сделать это самостоятельно рекомендуем обратиться к автору скрипта.
Я сразу написал, что у меня нет возможности, потому что я вообще не знаком с Lua. К автору скрипта я то же не могу обратиться, т.к. скачал 2 или больше года назад. Я не сохранял ссылку на место скачки, т.к. не предполагал, что ARQA когда-то и зачем-то захочется внедрить в QUIK другую обратно не совместимую версию Lua.Sergey Gorokhov написал:
Цитата
Например  тут  наши пользователи обсуждали такой же вопрос
И как я вижу все обсуждение закончилось "Ваше письмо получено, проблема изучается".

Я предполагал, что разбирающийся человек может за пару минут просто поменять в скрипте в нескольких местах форматы чисел. Но, как вижу из обсуждения, даже для понимающих в Lua людей это проблема.

Вы, как вижу, прекрасно понимаете, что и где надо поменять. Так может сделаете доброе дело и подправите скрипт? В конце концов, это же Ваша инициатива с заменой версии Lua создала людям проблему. Не говоря о том, что за столько лет существования QUIK такая базовая функция как автоматическое выставление стопа/тэйка по открытию позиции могла быть имплементирована в сам QUIK без дополнительных костылей.
 
Цитата
Дмитрий написал:
Я сразу написал, что у меня нет возможности, потому что я вообще не знаком с Lua. К автору скрипта я то же не могу обратиться, т.к. скачал 2 или больше года назад. Я не сохранял ссылку на место скачки, т.к. не предполагал, что ARQA когда-то и зачем-то захочется внедрить в QUIK другую обратно не совместимую версию Lua
Если нет автора, попросите помощи у людей на форуме, может найдется герой который исправит нужный Вам код за деньги или просто по доброте душевной.

Цитата
Дмитрий написал:
И как я вижу все обсуждение закончилось "Ваше письмо получено, проблема изучается".
не путайте темы, вопрос про ".0" вообще никак, от слова совсем, не связан с аварийным завершением работы терминала у пользователя ISR и то что эти два обсуждения попали в одну ветку совершенно не значит что между ними есть что-то общее.

Цитата
Дмитрий написал:
Вы, как вижу, прекрасно понимаете, что и где надо поменять. Так может сделаете доброе дело и подправите скрипт? В конце концов, это же Ваша инициатива с заменой версии Lua создала людям проблему.
Написание скриптов для клиентов не является задачей тех поддержки.
Мы можем указать на ошибку в коде, и даже указать как именно ошибку исправить, но само исправление должны сделать Вы, ну или человек который готов будет Вам помочь.

Цитата
Дмитрий написал:
Не говоря о том, что за столько лет существования QUIK такая базовая функция как автоматическое выставление стопа/тэйка по открытию позиции могла быть имплементирована в сам QUIK без дополнительных костылей.
Эта тема вообще никак не связана с Lua, если хотите доработку в терминале, оформите пожелание в соответствующей ветке форума
 
Цитата
Дмитрий написал:
у меня нет возможности
Поправил по быстрому, тупо tostring -> string.format("%i", ...
https://cloud.mail.ru/public/vDr4/5rJvUDHbn
Как в соседней ветке указывали возможны проблемы с дробной ценой, но мне не понятно как можно представить дробную цену без дробного разделителя.
 
Самое простое в вашем случае привести шаг цены к точности инструмента:
Код
Security = getSecurityInfo(CLASS_CODE, SEC_CODE)
SEC_PRICE_STEP = tonumber(string.format("%." .. Security.scale .. "f", Security.min_price_step))
Надо делать так, как надо. А как не надо - делать не надо.
 
Обновил с учетом точности инструмента.
 
ISR, Старатель, спасибо Вам, добрые люди за помощь! Попробовал и на Si (с целым шагом) и на Br (с дробным шагом) - скрипт сработал.
Страницы: 1
Читают тему
Наверх