OnMoneyLimit шлет четыре события вместо одного

Страницы: 1
RSS
OnMoneyLimit шлет четыре события вместо одного
 
Суть проблемы - подписываюсь на изменение денежного лимита, совершаю одну сделку и OnMoneyLimit срабатывает аж четыре раза.
Код
function OnMoneyLimit(bt)
    -- просто выводит все поля таблицы
    PrintDbgStr(table.tostring(bt))
end

Логи такие (первое событие чуть отличается от след. трех одинаковых):
Код
[2932] {leverage=2,currentbal=280000.67,limit_kind=0,client_code="11309",openlimit=0,firmid="NC0011100000",locked_margin_value=0,currcode="SUR",openbal=281330.93,locked=1448.19,locked_value_coef=0.29,currentlimit=0,tag="EQTV"}
[2932] {leverage=2,currentbal=278672.11,limit_kind=0,client_code="11309",openlimit=0,firmid="NC0011100000",locked_margin_value=0,currcode="SUR",openbal=281330.93,locked=0,locked_value_coef=0,currentlimit=0,tag="EQTV"}
[2932] {leverage=2,currentbal=278672.11,limit_kind=0,client_code="11309",openlimit=0,firmid="NC0011100000",locked_margin_value=0,currcode="SUR",openbal=281330.93,locked=0,locked_value_coef=0,currentlimit=0,tag="EQTV"}
[2932] {leverage=2,currentbal=278672.11,limit_kind=0,client_code="11309",openlimit=0,firmid="NC0011100000",locked_margin_value=0,currcode="SUR",openbal=281330.93,locked=0,locked_value_coef=0,currentlimit=0,tag="EQTV"}

Ответьте, пожалуйста, на вопросы:
1) Согласно документации, OnMoneyLimit вызывается только при изменении денежного лимита. Тогда почему первое события в currentbal содержит старое значение лимита?
2) Почему 3 след. события одинаковые? Я подозреваю, что это связано с режимами T0, T1, T2, но ведь limit_kind там 0 ?


QUIK последний 7.14.
 
Добрый день.

Алексей, можете полный скрипт выложить.
 
Здравствуйте, вот
Код
function table.val_to_str ( v )
    if "string" == type( v ) then
        v = string.gsub( v, "\n", "\\n" )
        if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then
            return "'" .. v .. "'"
        end
        return '"' .. string.gsub(v,'"', '\\"' ) .. '"'
    else
        return "table" == type( v ) and table.tostring( v ) or
                tostring( v )
    end
end

function table.key_to_str ( k )
    if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
        return k
    else
        return "[" .. table.val_to_str( k ) .. "]"
    end
end

function table.tostring( tbl )
    local result, done = {}, {}
    for k, v in ipairs( tbl ) do
        table.insert( result, table.val_to_str( v ) )
        done[ k ] = true
    end
    for k, v in pairs( tbl ) do
        if not done[ k ] then
            table.insert( result,
                table.key_to_str( k ) .. "=" .. table.val_to_str( v ) )
        end
    end
    return "{" .. table.concat( result, "," ) .. "}"
end

function OnMoneyLimit(bt)
    PrintDbgStr(table.tostring(bt))
end


function main()
    while true do
        sleep(1000)
    end
end
 
Егор, по-видимому, проблема шире.
Событий от OnTrade и OnOrder приходят дважды. Взять к примеру OnTrade - по документации он должен приходить при изменении параметров сделки. Но вот скрипт -
Код
function table.val_to_str ( v )
    if "string" == type( v ) then
        v = string.gsub( v, "\n", "\\n" )
        if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then
            return "'" .. v .. "'"
        end
        return '"' .. string.gsub(v,'"', '\\"' ) .. '"'
    else
        return "table" == type( v ) and table.tostring( v ) or
                tostring( v )
    end
end

function table.key_to_str ( k )
    if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
        return k
    else
        return "[" .. table.val_to_str( k ) .. "]"
    end
end

function table.tostring( tbl )
    local result, done = {}, {}
    for k, v in ipairs( tbl ) do
        table.ins ert( result, table.val_to_str( v ) )
        done[ k ] = true
    end
    for k, v in pairs( tbl ) do
        if not done[ k ] then
            table.ins ert( result,
                table.key_to_str( k ) .. "=" .. table.val_to_str( v ) )
        end
    end
    return "{" .. table.concat( result, "," ) .. "}"
end

function OnTrade(te)
    PrintDbgStr("new trade: "..table.tostring(te))
end

function OnOrder(oe)
    PrintDbgStr("new order: " .. table.tostring(oe))
end

function main()
    while true do
        sleep(1000)
    end
end

Посылаю заявку в терминале на покупку одного лота - исполняется в одну сделку. Но в логах:
Код
[2932] new trade: {price=131.9,settle_date=0,trade_num=2367642180,lower_discount=0,exchange_comission=0,value=1319,qty=1,reporate=0,clearing_bank_accid="",class_code="QJSIM",userid="NC0011100000",tradenum=2367642180,flags=0,canceled_datetime={week_day=1,hour=0,ms=0,mcs=0,day=1,month=1,sec=0,year=1601,min=0},datetime={week_day=6,hour=1,ms=0,mcs=0,day=18,month=11,sec=22,year=2017,min=5},clearing_firmid="",kind=1,canceled_uid=0,ordernum=3456591012,sec_code="SBER",system_ref="",block_securities=0,repoterm=0,broker_comission=0,period=1,client_code="11309",linked_trade=0,firmid="NC0011100000",account="NL0011100043",yield=0,seccode="SBER",trans_id=0,upper_discount=0,repo2value=0,start_discount=0,tech_center_comission=0,trade_currency="SUR",accrued2=0,order_num=3456591012,repovalue=0,exchange_code="",accruedint=0,settle_currency="",cpfirmid="",uid=116882,brokerref="11309/",station_id="",price2=0,clearing_comission=0,settlecode="",bank_acc_id=""}
[2932] new trade: {price=131.9,settle_date=0,trade_num=2367642180,lower_discount=0,exchange_comission=0,value=1319,qty=1,reporate=0,clearing_bank_accid="",class_code="QJSIM",userid="NC0011100000",tradenum=2367642180,flags=0,canceled_datetime={week_day=1,hour=0,ms=0,mcs=0,day=1,month=1,sec=0,year=1601,min=0},datetime={week_day=6,hour=1,ms=0,mcs=0,day=18,month=11,sec=22,year=2017,min=5},clearing_firmid="",kind=1,canceled_uid=0,ordernum=3456591012,sec_code="SBER",system_ref="",block_securities=0,repoterm=0,broker_comission=0,period=1,client_code="11309",linked_trade=0,firmid="NC0011100000",account="NL0011100043",yield=0,seccode="SBER",trans_id=0,upper_discount=0,repo2value=0,start_discount=0,tech_center_comission=0,trade_currency="SUR",accrued2=0,order_num=3456591012,repovalue=0,exchange_code="",accruedint=0,settle_currency="",cpfirmid="",uid=116882,brokerref="11309/",station_id="",price2=0,clearing_comission=0,settlecode="",bank_acc_id=""}
[2932] new order: {withdraw_datetime={week_day=1,hour=0,ms=0,mcs=0,day=1,month=1,sec=0,year=1601,min=0},price=0,value_entry_type=0,balance=0,repo_value_balance=0,value=0,qty=1,passive_only_order=0,class_code="QJSIM",activation_time=0,userid="NC0011100000",expiry=-1,flags=16,linkedorder=0,ordernum=3456591012,sec_code="SBER",canceled_uid=0,side_qualifier=0,client_code="11309",visible=0,firmid="NC0011100000",datetime={week_day=6,hour=1,ms=0,mcs=0,day=18,month=11,sec=22,year=2017,min=5},yield=0,reject_reason="",capacity=0,acnt_type=0,repo2val ue=0,start_discount=0,min_qty=0,ext_order_flags=0,exec_type=0,order_num=3456591012,repovalue=0,repoterm=0,accruedint=0,account="NL0011100043",seccode="SBER",uid=0,brokerref="11309/",exchange_code="",settlecode="",price2=0,trans_id=0,bank_acc_id=""}
[2932] new order: {withdraw_datetime={week_day=1,hour=0,ms=0,mcs=0,day=1,month=1,sec=0,year=1601,min=0},price=0,value_entry_type=0,balance=0,repo_value_balance=0,value=0,qty=1,passive_only_order=0,class_code="QJSIM",activation_time=0,userid="NC0011100000",expiry=-1,flags=16,linkedorder=0,ordernum=3456591012,sec_code="SBER",canceled_uid=0,side_qualifier=0,client_code="11309",visible=0,firmid="NC0011100000",datetime={week_day=6,hour=1,ms=0,mcs=0,day=18,month=11,sec=22,year=2017,min=5},yield=0,reject_reason="",capacity=0,acnt_type=0,repo2val ue=0,start_discount=0,min_qty=0,ext_order_flags=0,exec_type=0,order_num=3456591012,repovalue=0,repoterm=0,accruedint=0,account="NL0011100043",seccode="SBER",uid=116882,brokerref="11309/",exchange_code="",settlecode="",price2=0,trans_id=0,bank_acc_id=""}

События в OnTrade полностью одинаковы.
События в OnOrder отличаются только тем, что в первом uid = 0, а во втором uid = идентификатору моего пользователя. Что тоже непонятно, заявка же посылалась изначально моим пользователем.
Ключевой вопрос - зачем два события приходят, если они одинаковые?

Если что, это демо QUIK от ARQA.
 
Добрый день.

По поводу onTrade и OnOrder на форуме уже вопрос обсуждался.

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

Более подробно по ссылкам: https://forum.quik.ru/messages/forum10/message24910/topic2839/#message24910

С вопросом по OnMoneyLimit разбираемся, в ближайшее время постараемся дать ответ.
 
Ясно. По OnOrder и OnTrade я фиксирую, что абсолютно одинаковые сообщения могут приходить.
 
Добрый день.

Сообщаем информацию по поводу OnMoneyLimit.

Да, проблема обнаружена. К сожалению, мы не можем предложить временного решения этой
     ошибки, но постараемся устранить ее в одной из ближайших версий
     серверного ПО QUIK.
Страницы: 1
Читают тему
Наверх