Расчет денег в лоты и обратно.

Страницы: 1
RSS
Расчет денег в лоты и обратно., Lot2Money и Money2Lot
 
Написал 2 программы Lot2Money и Money2Lot

Однако есть проблема, что иногда код неправильно считает.
т.е. Money2Lot выдаёт иногда 0, потому что Мосбиржа ставит большой LOTSIZE, но обычно правильно.

Наверно я что-то упустил в алгоритме. Подскажите где я ошибся.

Код
function Lot2Money(zCLASSCODE,zSECCODE,Lot)
local Price=tonumber(Get_gLast_Price_gr(zCLASSCODE,zSECCODE))
if Price==nil or Price==0 then return nil end
local LOTSIZE=getParamEx(zCLASSCODE,zSECCODE,"LOTSIZE").param_value
if LOTSIZE==nil then return nil end
message('Lot2Money'
..'\n'..'zCLASSCODE= '..tostring(zCLASSCODE)
..'\n'..'zSECCODE= '..tostring(zSECCODE)
..'\n'..'Lot= '..tostring(Lot)
..'\n'..'Price= '..tostring(Price)
..'\n'..'LOTSIZE= '..tostring(LOTSIZE)
..'\n'..'Lot*Price*LOTSIZE= '..tostring(Lot*Price*LOTSIZE)
)
return Lot*Price*LOTSIZE
end
Здесь я поставил заплатку, что не есть хорошо.
Код
function Money2Lot(zCLASSCODE, zSECCODE, Money)
if Money==nil then return 0 end
local Price=tonumber(Get_gLast_Price_gr(zCLASSCODE,zSECCODE))
if Price==nil or Price==0 then return nil end
local LOTSIZE=getParamEx(zCLASSCODE,zSECCODE,"LOTSIZE").param_value
if LOTSIZE==nil then return nil end
message('Money2Lot'
..'\n'..'zCLASSCODE= '..tostring(zCLASSCODE)
..'\n'..'zSECCODE= '..tostring(zSECCODE)
..'\n'..'Money= '..tostring(Money)
..'\n'..'Price= '..tostring(Price)
..'\n'..'LOTSIZE= '..tostring(LOTSIZE)
..'\n'..'Money/(Price * LOTSIZE= '..tostring(Money/(Price * LOTSIZE))
)
local RetLot=math.floor(Money/(Price * LOTSIZE))
if RetLot==0 then -- ЗАПЛАТКА: если брокер поставил избыточный LOTSIZE
    RetLot=math.floor(Money/Price)
end
return RetLot
end
 
1. getParamEx никогда не возвращает nil, но вот 0 там может быть запросто
2. Скорее всего у вас цена запрашивается тоже через getParamEx и тоже может быть 0, кроме того до первой сделки по инструменту, после открытия торговой сессии она гарантировано 0.
3. Money/(Price * LOTSIZE) Вызовет ошибку при 0 значениях в делителе.  
 
Дело в чем-то другом.

Просто откройте скриншот в первом сообщении, там внизу комментарий.

Думаю либо в формуле, что-то явно не хватает, либо Мосбиржа вносит кривые данные в статичную информацию об инструменте.

А баг с ноликом, который не нужен и опасен, у меня исправлен.
Код
function Get_gLast_Price_gr(zCLASSCODE,zSECCODE)
if zCLASSCODE==nil or zSECCODE==nil then return nil end
local Last_Price=getParamEx(zCLASSCODE,zSECCODE,'LAST').param_value
if Last_Price==0 then return nil end
return tostring_comma(Last_Price,nil,'.')
end
 
Скорее всего связано с этим: https://forum.quik.ru/messages/forum10/message70890/topic8157/
Страницы: 1
Читают тему
Наверх