Тема: Математика в скрипте 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)