sec_params_fetcher = {}
setmetatable(sec_params_fetcher, {
__call = function(__call_self, ...)
local tbl = {}
if select('#', ...) == 0 then
setmetatable(tbl, {
__index = function(self, class_code)
local sec_codes = {}
setmetatable(sec_codes, {
__index = function(self, sec_code)
local sec_params = __call_self(class_code, sec_code)
rawset(self, sec_code, sec_params)
return sec_params
end
})
rawset(self, class_code, sec_codes)
return sec_codes
end
})
else
local class_code, sec_code, is_cached = ...
setmetatable(tbl, {
__index = function(self, key)
local res = rawget(getmetatable(self) or {}, key)
if res == nil then
local paramtable = getParamEx(class_code, sec_code, key)
if paramtable ~= nil and paramtable.result == '1' then
if paramtable.param_type == '1' or paramtable.param_type == '2' or paramtable.param_type == '4' then
res = tonumber(paramtable.param_value)
elseif paramtable.param_type == '3' then
res = paramtable.param_image
elseif paramtable.param_type == '5' then
local t = {year = 1970, month = 1, day = 1}
t.hour,t.min,t.sec = string.match(paramtable.param_image, "(%d%d)%p(%d%d)%p(%d%d)")
res = os.time(t)
elseif paramtable.param_type == '6' then
local d = {hour = 0, min = 0, sec = 0}
d.day,d.month,d.year = string.match(paramtable.param_image, "(%d*)\.(%d*)\.(%d*)")
res = os.time(d)
else
res = paramtable.param_image
end
end
if res ~= nil and self.__cached then rawset(self, key, res) end
end
return res
end,
SetCached = function(self, is_cached)
if (is_cached ~= true) then
for i, v in pairs(self) do rawset(self, i, nil) end
end
rawset(getmetatable(self) or {}, '__cached', (is_cached == true))
end
})
tbl:SetCached(is_cached)
end
return tbl
end
})
-- securities parameters list (QUIK 8.1):
--
-- LONGNAME, SHORTNAME, CODE, ISINCODE, REGNUMBER, CFI_CODE, CLASSNAME, CLASS_CODE, TRADE_DATE_CODE, SEC_FACE_VALUE, SEC_FACE_UNIT, SEC_SCALE, LCURRENTPRICE,
-- SEC_PRICE_STEP, DISCOUNT1, DISCOUNT2, DISCOUNT3, SEC_COMMENT, LOTSIZE, SECTYPE, CURRENCYID, LISTLEVEL, PRIMARYDIST, QUALIFIED, ASSURED, ANONTRADE, STATUS,
-- BID, BIDDEPTH, BIDDEPTHT, NUMBIDS, OFFER, OFFERDEPTH, OFFERDEPTHT, NUMOFFERS, OPEN, HIGH, LOW, LAST, CHANGE, QTY, TIME, VOLTODAY, VALTODAY, TRADINGSTATUS,
-- VALUE, WAPRICE, HIGHBID, LOWOFFER, NUMTRADES, PREVPRICE, PREVWAPRICE, CLOSEPRICE, LASTCHANGE, MARKETPRICE, PRICEMAX, PRICEMIN, SELLDEPO, BUYDEPO, STEPPRICET,
-- STEPPRICE, CLPRICE, STARTTIME, ENDTIME, MAT_DATE, DAYS_TO_MAT_DATE, OPTIONBASECLASS, R_SETTLEPRICE, OPENPCTCHANGE, STEP_IN_CURRENCY, PRICEMINUSPREVWA,
-- SETTLEDATE, SETTLECODE, SETTLEDATE1, TRADINGPHASE, FIRST_CUR, SECOND_CUR, DPVALINDICATORBU, DPVALINDICATORSE, MARKETPRICETODAY, ISSUESIZE, PREVDATE, BASEPRICE,
-- LCLOSEPRICE, QUOTEBASIS, ADMITTEDQUOTE, PREVADMITTEDQUOT, LASTBID, LASTOFFER, MARKETPRICE2, PREVLEGALCLOSEPR, OPENPERIODPRICE, MIN_CURR_LAST, MIN_CURR_LAST_TI,
-- ISSUESIZEPLACED, COUNTERPRICE, PREVLOTSIZE, LOTSIZECHANGEDAT, PLANNEDTIME, AUCTPRICE, AUCTVALUE, AUCTVOLUME, AUCTNUMTRADES, IMBALANCE, MARKETVOLB, MARKETVOLS
function main()
local sec = sec_params_fetcher()
-- example 1:
message('TQBR@SBER.LAST == ' .. tostring(sec.TQBR.SBER.LAST))
message('TQBR@VTBR.LAST == ' .. tostring(sec.TQBR.VTBR.LAST))
message('TQBR@SBER.TRADINGSTATUS == ' .. tostring(sec.TQBR.SBER.TRADINGSTATUS))
-- example 2:
local tqbr_sber = sec.TQBR.SBER
message('TQBR@SBER.SHORTNAME == ' .. tostring(tqbr_sber.SHORTNAME))
-- example 3:
local tqbr = sec.TQBR
message('TQBR@VTBR.STARTTIME == ' .. tostring(tqbr.VTBR.STARTTIME))
tqbr.SBER:SetCached(true) -- enable parameter caching for SBER
message('TQBR@SBER.SETTLEDATE == ' .. tostring(tqbr.SBER.SETTLEDATE))
-- example 4:
local tqbr_rosn_cached = sec_params_fetcher('TQBR', 'ROSN', true) -- enable parameter caching, getParamEx() is called only once per parameter
message('TQBR@ROSN.SHORTNAME == ' .. tostring(tqbr_rosn_cached.SHORTNAME))
end