Тема: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

с помощью OnTrade пытаюсь получить инфу, какая была сделка

function OnTrade (trade_data)

operat=trade_data.side_qualifier

у меня операт всегда равно 0.
Что значит из документации  - не определено, почему так???

Как можно еще узнать, какая была сделка, продажа или купля?

2

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

dkostiunin пишет:

Как можно еще узнать, какая была сделка, продажа или купля?

Вам нужно поле flags, которое содержит битовый флаг направления сделки.

local function Operation_TLR(flags)
    if bit.band(flags, 0x1) ~= 0 then
        return -1 --продажа
    end
    return 1 --покупка
end
function OnTrade(item)
   local direction = Operation_TLR(item.flags)
end
--из таблиц тоже пойдет
local item = getItem("AllTrades", i) --i = № строки в таблице
local item = getItem("Trades", i) 
local direction = Operation_TLR(item.flags)

3

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

Спасибо за наводку.
Поэкспериментировал
вот так

function OnTrade (trade_data)
    flag=trade_data.flags

выяснил, что при покупке flag=25 а при продаже 29

написал вот так

        if (flag==29) then
            flag = 'продажа'
        else flag = 'покупка'
                end

если можно, еще хотел спросить, в описании параметров таблицы сделки есть sec_code
но чего нибудь связанного с названием инструмента (ни краткого ни полного) не вижу.
Мне это надо, чтобы получать в телеграм оповещения о произошедших сделках - а у меня облигации
у которых код инструмента это RUXXXXXXX

Можно выгрузить в файл названия вместе с кодами, и потом забирать при запуске скрипта в таблицу, и оттуда уже присваивать, но все таки может какой то вариант получения из таблиц квика напрямую?

4 (2020-03-03 00:57:14 отредактировано kalikazandr)

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

dkostiunin пишет:

        if (flag==29) then
            flag = 'продажа'
        else flag = 'покупка'
                end

Так нельзя, это битовые флаги и могут иметь отличные от увиденных вами чисел, пользуйтесь функцией Operation_TLR(flags), если вас смущают возвращаемые цифры -1/1, замените их на "продажа"/"покупка".

dkostiunin пишет:

если можно, еще хотел спросить, в описании параметров таблицы сделки есть sec_code
но чего нибудь связанного с названием инструмента (ни краткого ни полного) не вижу.

По коду инструмента вы найдете всю инфо в таблице securities, скорее всего подойдет параметр short_name. Но не берусь утверждать, т.к. с облигациями дел не имел.

5

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

dkostiunin пишет:

Можно выгрузить в файл названия вместе с кодами, и потом забирать при запуске скрипта в таблицу, и оттуда уже присваивать, но все таки может какой то вариант получения из таблиц квика напрямую?

вот, можете воспользоваться моей вынималкой параметров инструментов:

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

6

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

Здравствуйте
Вы меня озадачили с этими битами.
Попытался вникнуть , что это вообще такое, дается тяжко
эту строку толком не понял,

if bit.band(flags, 0x1) ~= 0

здесь сравнивается два бита, из теории (если я правильно понял), если оба бита равны 1, то условие выполняется.

flags  - это то число, которое я пытался использовать,  оно , как я уже выяснил, бывает и 25 и 26 и 28 и 29 и 30.
Как это число может быть равно нулю или единице ?

0х1 - это , флаг, берется из  описания битов флагов, но как это здесь используется, не пойму(ведь это в контексте каждой таблицы означает что то свое), по идее оно либо true  либо false
почему сравнивается тип - число, и тип boolean ?

написал вот так

flag=trade_data.flags

flag1=bit.test(flag, 2)

if flag1==true then
   flag1 = 'продажа'
    else flag1 = 'покупка'
end

вроде работает



kalikazandr пишет:

Так нельзя, это битовые флаги и могут иметь отличные от увиденных вами чисел, пользуйтесь функцией Operation_TLR(flags), если вас смущают возвращаемые цифры -1/1, замените их на "продажа"/"покупка".


По коду инструмента вы найдете всю инфо в таблице securities, скорее всего подойдет параметр short_name. Но не берусь утверждать, т.к. с облигациями дел не имел.

7

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

dkostiunin пишет:

Здравствуйте
Вы меня озадачили с этими битами.

Здравствуйте, это не я вас озадачил, это арка придумала, шлет таблицу с заявкой, где ооочень много полей просто никак и никем не используются, зато есть флаги битовые, что бы вам и остальным высушить мозг и потратить ваше драгоценное время, на изучение темы, которая вам, я уверен, никогда не пригодится.
Как работают их функции побитового сравнения мне не известно, в доке нет их описания, зато есть описание битовых масок, по которым можно понять что это за заявка/сделка/направление и проч.
Не забивайте себе голову этой чепухой, сосредоточиться нужно на поиске и реализации Грааля, остальное все блажь.
Нашли что искали, воткнули в код, работает и отлично. А как оно там работает, разберетесь в свободное время, попивая пивко на пляже (хотя вряд ли вы даже вспомните про биты, какие то маски, маски у хоккеистов).

8

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

dkostiunin пишет:

Попытался вникнуть , что это вообще такое, дается тяжко
эту строку толком не понял

википедия [url]https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F#%D0%9F%D0%BE%D0%B1%D0%B8%D1%82%D0%BE%D0%B2%D0%BE%D0%B5_%D0%98[/url] и калькулятор windows вам в помощь.

9

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

Здравствуйте
Спасибо за инфу, честно говоря, для меня сложно понять, мозгов не хватает таблицы в других таблицах с кучей условий.

Я воспользовался советом выше, и использовал функцию SearchItems
все взял из документации

function fn(par1 )
    if par1 == instr then       
        return true   
        else
        return false   
    end
end

function OnTrade (trade_data)

    instr=trade_data.sec_code
    numm=getNumberOf("securities")
    t1 = SearchItems("securities", 0, numm-1, fn, "code ")
    t2=getItem ("securities", t1[1])
    name_instr=t2.name



toxa пишет:

10

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

dkostiunin пишет:

Спасибо за инфу, честно говоря, для меня сложно понять, мозгов не хватает таблицы в других таблицах с кучей условий.

тогда так:

name_instr = getParamEx('TQBR', 'VTBR', 'SHORTNAME').param_image

11

Re: почему параметр side_qualifier таблицы Сделки всегда выдает ноль?

Ух спасибо, это еще проще! Без всяких доп функций


toxa пишет:
dkostiunin пишет:

Спасибо за инфу, честно говоря, для меня сложно понять, мозгов не хватает таблицы в других таблицах с кучей условий.

тогда так:

name_instr = getParamEx('TQBR', 'VTBR', 'SHORTNAME').param_image