1

Тема: Математика в скрипте LUA

Всем привет. Можете подсказать что творит скрипт луа, причем дело похоже в самом интерпретаторе луа, встроенного в квик. В принципе я и раньше изредка встречал этот глюк, думал надо бы переписать по другому и более надежно, ибо сейчас использую цикл while, их я как раз стараюсь избегать всеми правдами и неправдами, ибо чревато зависоном. Но сделал как сделал, т.к. это было быстрее и проще всего и отладки минимум.
Итого, что имеем в скрипте

        local temp_percent =  buy_price / 100 * percent + buy_price
        sell_price = buy_price
        while temp_percent > sell_price do
            sell_price = sell_price + PRICE_STEP
        end
        SendOrder("S", sell_price)

Здесь робот уже нашел точку входа, сделка совершена, он выставляет лимитку на продажу. Да да, плохая процедура... НО! Это в оригинале. Сегодня именно эта процедура неожиданно выдала глюк. Покупка состоялась 24,850, шаг цены 0,005, percent = 0,6, теперь если посчитать temp_percent, он получается 24,9991. Далее тупо добавляем шаг цены сколько надо раз, пока temp_percent больше sell_price. Теоретически я ожидаю sell_price = 25,000, а по факту получаю 24,1000, да, да. Именно дробная часть 1000, т.е. переноса в целую часть не произошло!
Как я уже говорил, этот глюк уже не первый, единственная закономерность, которую мне удалось уловить, этот глюк происходит как раз на подобных граничных условиях, т.е. именно когда переполняется дробная часть и должен произойти перенос в целую часть. При этом всем, если пройти это пограничное состояние хотя бы еще на один шаг, этого бага вообще не наблюдается и все корректно.
Почему я привел именно этот код? Ну во первых именно он дает этот баг, хотя цену на покупку я рассчитываю уже другой процедурой

        local n,m = math.modf(Temp / PRICE_STEP)                -- Целая n и дробная части m Price_temp
        if m > 0.5 then                                        -- Если дробная часть больше 0,5, то
            n = n + 1                                        -- Получили количество шагов до ближайшего кратного значения цены
        end
        buy_price = n * PRICE_STEP                            -- Цена для заявки на покупку готова.

Здесь Temp, это линия индикатора на графике, НО! Сложность в том, что значение линии не кратно шагу цены, приходится приводить к кратным значениям.
Вот я и задумался, получив очередной глюк(крайне редкий и отловить его вообще не представляется возможным), как не наступить на эти же грабли позже. Может кто сможет объяснить в чем причина? Возможно и вторая процедура преобразования точно такая же косячная? Возможно есть какая то стандартная функция для этого?
И да, тут работает все как надо [url]https://qlua.ru/demo/,[/url] получаю вполне ожидаемый результат 25.

sell_price = 0
PRICE_STEP = 0.005
percent = 0.6
buy_price = 24.850

local temp_percent =  buy_price / 100 * percent + buy_price
sell_price = buy_price
while temp_percent > sell_price do
    sell_price = sell_price + PRICE_STEP
end
print("sell_price = ", sell_price)

2

Re: Математика в скрипте LUA

dark184 пишет:

а по факту получаю 24,1000

Вот эта цифра откуда взялась?

Интерпретатор Lua ошибаться не может. Это я вам гарантирую.

А вот как у вас реализовано преобразование ценны из числа в текст внутри SendOrder() - хороший вопрос.

3 (2022-10-05 12:50:57 отредактировано dark184)

Re: Математика в скрипте LUA

Ой hmm. Я же уже выловил этот косяк пару месяцев назад и совсем забыл. Дело не в интерпретаторе, а вы попали в самую точку, дело в функции преобразования числа в строку. Я точно помню, как только выловил косяк, исправил его. Но для другого робота взял устаревший файл, где это не исправлено ;( Так что можно удалить лишнюю тему, я сам лоханулся smile

4

Re: Математика в скрипте LUA

dark184,
Любая тема на форуме имеет пользу.
Пусть будет.

Вам удачи в программировании и профита!