Sergey Pavlov
Sergey Pavlov личный блог
19 октября 2017, 14:38

Как в квике получить текущую позицию по бумагам

Коллеги! Помогите решить простую задачку.

Дано: имеются позиции по бумагам (TQBR).

Надо: получить текущую позицию по каждой бумаге при помощи LUA.

Пробовал пользоваться таблицами depo_limits, firm_holding и account_balance.

Хоть каких-то чисел добился лишь через таблицу depo_limits следующим кодом:
pos1={}
pos2={}
for j=0,getNumberOf("DEPO_LIMITS")-1 do
 pos1[#pos1+1]=getItem("DEPO_LIMITS",j).sec_code
 pos2[#pos2+1]=getItem("DEPO_LIMITS",j).currentbal
end
Проблема такого варианта в том, что он показывает ненулевые значения в currentbal только для позиций, которые были открыты ранее (возможно, по которым прошло +2 дня). По позициям, которые были открыты сегодня, он точно показывает 0.

Подскажите, как правильно решить эту задачку?

Премного благодарен:)
10 Комментариев
  • SergeyJu
    19 октября 2017, 14:42
    Т+2
  • Igr
    19 октября 2017, 14:48

    quikluacsharp.ru/

    отличный сайт, отличный чувак там, всегда отвечает, скажите что igr его порекомендовал;)  

  • Maximus
    19 октября 2017, 15:27

    Посмотри вот этот код. Возможно тебе подойдет.

    --Возвращает значение открытой позиции или false, если нет открытых позиций.

    function Active_poz() --poz_condition(направление), poz_balance(количество), poz_price(цена)
        --Определим текущую цену открытой позы и ее направление
         — Перебирает строки таблицы «Позиции по клиентским счетам (фьючерсы)», ищет Текущие чистые позиции по инструменту «RIH5»
        local poz_condition,poz_balance,poz_price=0,0,0
        for i = 0,getNumberOf(«FUTURES_CLIENT_HOLDING») — 1 do
             — ЕСЛИ строка по нужному инструменту и чистая позиция не равна нулю ТО
            if getItem(«FUTURES_CLIENT_HOLDING»,i).sec_code == sec_code and getItem(«FUTURES_CLIENT_HOLDING»,i).totalnet ~= 0 then
                 — ЕСЛИ текущая чистая позиция > 0, ТО открыта длинная позиция (BUY)
                if getItem(«FUTURES_CLIENT_HOLDING»,i).totalnet > 0 then
                    poz_condition=«B»
                    poz_balance = getItem(«FUTURES_CLIENT_HOLDING»,i).totalnet    -- Количество лотов в позиции BUY                
                    poz_price=getItem(«FUTURES_CLIENT_HOLDING»,i).avrposnprice
                else   — ИНАЧЕ открыта короткая позиция (SELL)
                    poz_condition=«S»
                    poz_balance = math.abs(getItem(«FUTURES_CLIENT_HOLDING»,i).totalnet) — Количество лотов в позиции SELL
                    poz_price=getItem(«FUTURES_CLIENT_HOLDING»,i).avrposnprice
                end
            else
                printlogs(«p»,«Active_poz() Нет открытой позы. Выходим из функции.»)
                return false
            end
        end
        printlogs(«p»,«Active_poz() Открытая позиция (B-BUY,S-SELL)-»..poz_condition.."; Кол-во-"..poz_balance.."; Цена-"..poz_price)
        
        if poz_balance>0 then
            return poz_condition, poz_balance, poz_price
        else
            return false
        end
    end

  • А. Г.
    19 октября 2017, 16:43
    В таблице лимитов по бумагам есть столбец  c T0 и T2. По нему можно отфильтровать.
  • Albus
    19 октября 2017, 20:50

    это функция:
    function get_balance(sec, client_code)
    local n=getNumberOf(«depo_limits»)
    for i=0,n-1 do
    limit = getItem(«depo_limits», i)
    if limit~=nil and limit.sec_code == sec and limit.client_code == client_code and limit.limit_kind==2 then
    return limit.currentbal
    end
    end
    return 0
    end

    а вызывается она так:
    balance=get_balance(«GAZP», «код клиента»)
    Я уже 5 лет пользуюсь ею в неизменном виде.

      • Юрий Волошин
        07 марта 2021, 23:46
        Sergey Pavlov, 

        немного улучшил Ваш программный код Lua QUIK:
        function get_balance(sec, client_code)
        local n = getNumberOf('depo_limits')
        for i=0,n-1 do
        limit = getItem('depo_limits', i)
        if limit and limit.sec_code == sec and limit.client_code == client_code and limit.limit_kind == 2 then return limit.currentbal end
        end
        return nil
        end

        balance = get_balance('GAZP, '123456')
        if balance then message('Тута '..balance) else message('Жопа') end

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн