Как получить цены "BID" и "OFFER" чтобы они выводились как в стакане?

Страницы: 1
RSS
Как получить цены "BID" и "OFFER" чтобы они выводились как в стакане?
 
Профи, подскажите пожалуйста как правильно получить цены "BID" и "OFFER"
делаю так
Код
bid = tonumber(getParamEx(classcod, ticker, "BID").param_value)

выводит цену в виде 150,0 но в стакане цена вида 150 и заявка не выставляется
если добавляю так bid = math.floor(bid) тогда все нормально bid = 150
Но если меняю инструмент в котором к примеру 3 знака после запятой то такой код будет округлять до целого. Пробовал получить количество знаков после запятой через Шаг цены, с помощью чат жпт получился такой код

Код
function countDecimalPlaces(number)    local _, decimal = tostring(number):match"([^.]*).(.*)"    return #decimalend      -- Получаем информацию о выбранном инструментеlocal security_info = getSecurityInfo(classcod, ticker)-- Получаем шаг ценыlocal price_step = security_info.min_price_steplocal decimal_places = countDecimalPlaces(price_step)

и вот тут возникла проблема decimal_places (кол-во знаков после запятой) при шаге цены к примеру 2 выдает 1, а если инструмент имеет шаг к примеру 0,5 то decimal_places выдает тоже 1
каждый раз при смене инструмента приходится менять код, прошу помочь с решением этой проблемы.

 
код почему-то опубликовался в одну строку, не знаю как редактировать пост, продублирую код тут

function countDecimalPlaces(number)
   local _, decimal = tostring(number):match"([^.]*).(.*)"
   return #decimal
end

-- Получаем информацию о выбранном инструменте
local security_info = getSecurityInfo(classcod, ticker)

-- Получаем шаг цены
local price_step = security_info.min_price_step
local decimal_places = countDecimalPlaces(price_step)
 
Lankaster, добрый день.

Можем предложить следующие варианты решения:
1) получать цену с помощью функции getQuoteLevel2 - в этом случае Вы получите значение, идентичное отображаемому в стакане;
2) добавить проверку точности инструмента и в зависимости от ее результата оставлять выполнять преобразование числа или оставлять исходное значение.

Например:

Код
bid = tonumber(getParamEx(classcode, seccode, "BID").param_value)
scale = tonumber(getParamEx(classcode, seccode, "SEC_SCALE").param_value)

if scale == 0 then
   price = math.floor(bid) --если точность инструмена равна 0, выполнить округление до целого числа
else
   price = bid --в противном случае преобразование не требуется
end

 
Цитата
Lankaster написал:
Профи, подскажите пожалуйста как правильно получить цены "BID" и "OFFER"
делаю так
Код
  bid  =  tonumber( getParamEx (classcod, ticker,  "BID" ).param_value)
  
 выводит цену в виде 150,0 но в стакане цена вида 150 и заявка не выставляется
если добавляю так bid = math.floor(bid) тогда все нормально bid = 150
Но если меняю инструмент в котором к примеру 3 знака после запятой то такой код будет округлять до целого. Пробовал получить количество знаков после запятой через Шаг цены, с помощью чат жпт получился такой код
   
Код
   function   countDecimalPlaces (number)     local  _, decimal  =  tostring(number):match"([^.] * ).(. * )"     return   # decimalend       -- Получаем информацию о выбранном инструментеlocal security_info = getSecurityInfo(classcod, ticker)-- Получаем шаг ценыlocal price_step = security_info.min_price_steplocal decimal_places = countDecimalPlaces(price_step)   
 и вот тут возникла проблема decimal_places (кол-во знаков после запятой) при шаге цены к примеру 2 выдает 1, а если инструмент имеет шаг к примеру 0,5 то decimal_places выдает тоже 1
каждый раз при смене инструмента приходится менять код, прошу помочь с решением этой проблемы.
можно делать так:
Цитата
Lankaster написал:
Профи, подскажите пожалуйста как правильно получить цены "BID" и "OFFER"
делаю так
Код
  bid  =  tonumber( getParamEx (classcod, ticker,  "BID" ).param_value)
  
 выводит цену в виде 150,0 но в стакане цена вида 150 и заявка не выставляется
если добавляю так bid = math.floor(bid) тогда все нормально bid = 150
Но если меняю инструмент в котором к примеру 3 знака после запятой то такой код будет округлять до целого. Пробовал получить количество знаков после запятой через Шаг цены, с помощью чат жпт получился такой код
   
Код
   function   countDecimalPlaces (number)     local  _, decimal  =  tostring(number):match"([^.] * ).(. * )"     return   # decimalend       -- Получаем информацию о выбранном инструментеlocal security_info = getSecurityInfo(classcod, ticker)-- Получаем шаг ценыlocal price_step = security_info.min_price_steplocal decimal_places = countDecimalPlaces(price_step)   
 и вот тут возникла проблема decimal_places (кол-во знаков после запятой) при шаге цены к примеру 2 выдает 1, а если инструмент имеет шаг к примеру 0,5 то decimal_places выдает тоже 1
каждый раз при смене инструмента приходится менять код, прошу помочь с решением этой проблемы.
если надо целое, то можно делать так:
Код
local bid=150.123456; local price=bid//1>>0; print("price="..price)

результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "example.lua" 
price=150
>Exit code: 0
 
если надо с каким-то дробным хвостиком то надо делать так:
Код
local bid=150.123456;
local step=0.1; price=bid- bid % step;  print("price="..price)  -- десятые доли
local step=0.01; price=bid- bid % step;  print("price="..price)  --сотые доли

результат:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "example.lua" 
price=150.1
price=150.12
>Exit code: 0

 
Цитата
nikolz написал:
если надо с каким-то дробным хвостиком то надо делать так:
Код
   local  bid =  150.123456 ;
 local  step =  0.1 ; price = bid -  bid % step;   print ( "price="  .. price)   -- десятые доли 
 local  step =  0.01 ; price = bid -  bid % step;   print ( "price="  .. price)   --сотые доли 

  
результат:
Код
   > D:/lua53/lua53.exe  - e  "io.stdout:setvbuf 'no'"   "example.lua"  
price =  150.1 
price =  150.12 
 > Exit code:  0 

  
а как же округление?
Код
function Normalize(num,step)
  local a=(num+step*0.5)-(num+step*0.5)%step
  return math.tointeger(a) or a
end

local bid=150.123456
local step=0.0001
local res=Normalize(bid,step)
print("res="..res)
результат
Код
res=150.1235
 
Цитата
Anton Belonogov написал:
Lankaster, добрый день.

Можем предложить следующие варианты решения:
1) получать цену с помощью функции getQuoteLevel2 - в этом случае Вы получите значение, идентичное отображаемому в стакане;
2) добавить проверку точности инструмента и в зависимости от ее результата оставлять выполнять преобразование числа или оставлять исходное значение.

Например:

Код
    bid  =  tonumber( getParamEx (classcode, seccode,  "BID" ).param_value)
scale  =  tonumber( getParamEx (classcode, seccode,  "SEC_SCALE" ).param_value)

 if  scale  =  =   0   then 
   price  =   math.floor (bid)  --если точность инструмена равна 0, выполнить округление до целого числа 
 else 
   price  =  bid  --в противном случае преобразование не требуется 
 end 

  
Спасибо за помощь!
 
Но ведь для выставления заявки цену в sendTransaction() надо в виде строки?
Код
string.format('%.'..tostring(price_scale)..'f', tonumber(price))
 
Цитата
paluke написал:
Код
string.format('%.'..tostring(price_scale)..'f', tonumber(price))
Здесь вызов tostring по-моему лишний.
Страницы: 1
Читают тему
Наверх