getFuturesHolding

Страницы: 1
RSS
getFuturesHolding
 
На версии 8.х столкнулся на реальных счетах разных брокеров, что функции получения текущих позиций как getFuturesHolding,
getDepoEx работают нестабильно. Чаще всего это происходит с getFuturesHolding на едином счете.
В течении сессии часто (обычно перед клирингом) функция не возвращает ничего. При этом если перебрать строки прямым итератором, то все нормально находится.

Приходится отказываться от использования функций. Но перебор - это существенный расход памяти и просто медленней.
 
Добрый день.

Николай, не обходим какой нибудь конкретный пример.

Например:

1. Ваш скрипт.
2. Скриншот результата работы скрипта, когда функция ничего не возвращает.
 
Добрый день.

На этом форуме вы очень часто просите привести текст скрипта. Но я же написал просто про функцию.
Я не могу привести конкретные примеры, т.к. это сообщения от клиентов. Анализ логов явно указывает на то, что эта функция возвращает результат пустой. Я всего лишь обращаю ваше внимание, что такое поведение проявляется в редких случаях перед клирингом. Это происходит на счетах с единой позицией.

Я попробую промоделировать. Правда у меня нет счета с единой позицией.
Вам же прогнать unit тесты не составит труда.
 
Здравствуйте, Nikolay.

Воспроизвести описанную ситуацию не удаётся.
Наиболее вероятно, это обусловлено специфичностью условий воспроизведения ошибки, которые не удаётся корректным образом воссоздать. В этом случае - выполнить тесты с нашей стороны оказывается не так эффективно. Необходимы конкретные примеры для разбора.

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

Запрошенные данные просьба предоставить нам по почте quiksupport@arqatech.com со ссылкой на данную ветку форума.

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

Заранее большое спасибо!
 
Сначала решил проверить на вашем тестовом контуре в вечений клиринг. Кулено 2 контракта SRU0.

Вот простейший скрипт:
Код
local isRun = true
local logFile

local function log_tostring(...)
    local n = select('#', ...)
    if n == 1 then
    return tostring(select(1, ...))
    end
    local t = {}
    for i = 1, n do
    t[#t + 1] = tostring((select(i, ...)))
    end
    return table.concat(t, " ")
end

local function myLog(...)
    if logFile==nil then return end
    logFile:write(tostring(os.date("%c",os.time())).." "..log_tostring(...).."\n");
    logFile:flush();
end

local function GetFuturesHolding(Sec)

    local futures_client_holding = _G.getFuturesHolding(Sec.FIRM_ID, Sec.ACCOUNT, Sec.SEC_CODE, 0)
    if futures_client_holding then
        return futures_client_holding.totalnet
    end
    return 0
end

local function GetTotalnet(Sec)

    local num = getNumberOf('futures_client_holding')
    for i = 0, num - 1 do
        local futures_client_holding = getItem('futures_client_holding',i)
        if futures_client_holding and futures_client_holding.sec_code == Sec.SEC_CODE and futures_client_holding.trdaccid == Sec.ACCOUNT then
            return futures_client_holding.totalnet
        end
    end
    return 0
end

function _G.main()

    logFile = io.open(_G.getScriptPath().."\\test_log.txt", "w")

    local Sec          = {SEC_CODE = 'SRU0', CLASS_CODE = 'SPBFUT', ACCOUNT = 'SPBFUT001nw', FIRM_ID = 'SPBFUT000000'}
    local curOpenCount = GetTotalnet(Sec)

    while isRun do
        local new_count = GetFuturesHolding(Sec)
        if  new_count ~= curOpenCount then
            myLog('----------------------------------------------------------------------------------')
            myLog('getFuturesHolding new_count', new_count)
            curOpenCount = new_count
            for i = 0, _G.getNumberOf('futures_client_holding') - 1 do
                local fut_pos = _G.getItem('futures_client_holding', i)
                myLog('futures_client_holding', i, 'sec_code', fut_pos.sec_code, 'avrposnprice', fut_pos.avrposnprice, 'totalnet', fut_pos.totalnet)
            end
            myLog('----------------------------------------------------------------------------------')
        end
        sleep(100)
    end
end

function _G.OnFuturesClientHolding(fut_pos)
    myLog('----------------------------------------------------------------------------------')
    myLog('          OnFuturesClientHolding ', 'sec_code', fut_pos.sec_code, 'avrposnprice', fut_pos.avrposnprice, 'totalnet', fut_pos.totalnet)
    myLog('----------------------------------------------------------------------------------')
end

function _G.OnStop()
    isRun = false
    myLog("Script Stoped")
    if logFile then logFile:close() end
end

function _G.OnClose()
    isRun = false
    myLog("Script OnClose")
end

А вот, что происходит во время вечернего клиринга. Я так понимаю это технологические изменения позиции. Реальные скрипты не проверяют баланс во время клиринга, но здесь вопрос: а согласованы ли параметры
TRADINGSTATUS и CLSTATE с изменением баланса? Т.е. не может ли быть так, что статус клиринга еще не успел обновиться, а баланс через getFuturesHolding обнулился?

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

[INFO  2020-08-04 15:37:55] : ----------------------------------------------------------------------------------[INFO  2020-08-04 15:37:55] : futures_client_holding 0 {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 18, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 18}
[INFO  2020-08-04 15:37:55] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:38:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:38:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -12, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -12}
[INFO  2020-08-04 15:38:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:39:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:39:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 6, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 6}
[INFO  2020-08-04 15:39:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:40:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:40:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 24, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 24}
[INFO  2020-08-04 15:40:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:41:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:41:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 18, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 18}
[INFO  2020-08-04 15:41:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:42:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:42:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 10, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 10}
[INFO  2020-08-04 15:42:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:43:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:43:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 28, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 28}
[INFO  2020-08-04 15:43:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:44:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:44:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 36, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 36}
[INFO  2020-08-04 15:44:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:45:00] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:45:00] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:45:00] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] :           OnFuturesClientHolding  {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : getFuturesHolding new_count 0
[INFO  2020-08-04 15:47:06] : futures_client_holding 0 {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] :           OnFuturesClientHolding  {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] : getFuturesHolding new_count 2
[INFO  2020-08-04 15:47:07] : futures_client_holding 0 {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] :           OnFuturesClientHolding  {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : getFuturesHolding new_count 0
[INFO  2020-08-04 15:47:10] : futures_client_holding 0 {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : getFuturesHolding new_count 2
[INFO  2020-08-04 15:47:10] : futures_client_holding 0 {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:48:26] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:48:26] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -300, sec_code = "SRU0", seccode = "SRU0", session_status = 5, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -300}
[INFO  2020-08-04 15:48:26] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:50:48] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:50:48] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -300, sec_code = "SRU0", seccode = "SRU0", session_status = 5, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 16, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -300}
[INFO  2020-08-04 15:50:48] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 16:00:01] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 16:00:01] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -300, sec_code = "SRU0", seccode = "SRU0", session_status = 6, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 16, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -300}
[INFO  2020-08-04 16:00:01] : ----------------------------------------------------------------------------------
 
Nikolay,
Благодарим за предоставленную информацию.

Цитата
Nikolay написал:
согласованы ли параметры TRADINGSTATUS и CLSTATE с изменением баланса? Т.е. не может ли быть так, что статус клиринга еще не успел обновиться, а баланс через getFuturesHolding обнулился?
Согласованность параметров TRADINGSTATUS и CLSTATE следует уточнить у специалистов биржи. Наиболее вероятно, они согласованы, но обновиться в рабочем месте могут не синхронно, в виду различных факторов, влияющих на регулярность обновления данных в рабочем месте. Таблица позиций по клиентским счетам на срочном рынке также рассчитывается и транслируется биржей, но в другом информационном потоке, нежели данные таблицы текущих торгов, поэтому нельзя исключать ситуации, когда имеет место несущественная рассинхронизация между обновлениями статусов в потоке ТТТ и в таблице позиции по клиентским счетам в рабочем месте. Скрипт же покажет те данные, которые есть у рабочего места в момент выполнения.
Цитата
Nikolay написал:
Правда также возникает вопрос: а с чего он так скачет туда-обратно? Если вывести позицию в торговую панель стакана, то там стабильно позиция остается правильной.
Как уже было отмечено, Вы опрашиваете таблицу Позиции по клиентским счетам, которая рассчитывается и транслируется биржей. Изменения позиций во время клиринга, как Вы верно отметили - является результатом технологических изменений позиций на бирже (подробнее о них рекомендуем проконсультироваться у специалистов биржи). На сколько становится понятно из приведённых логов, текущая чистая позиция отражается нулевой в течении весьма короткого времени (0.5с или меньше), наиболее вероятно, стакан просто не успевает отобразить нулевую позицию, до того, как она опять будет отображена корректным образом в "Позиции по клиентским счетам".
 
Ваш тестовый контур тоже транслируется биржей?
Хоть это и технологические изменения, но не очень понятно почему меняется позиция. Вар. маржа, суммовая позиция - это понятно, но количественный баланс не очень.
 
Nikolay,

Да, на срочном рынке учебный сервер QUIK Junior подключается к учебным торговым системам биржи.
Страницы: 1
Читают тему
Наверх