Напоролся на эту же проблему - brokerref не передаётся в OnTrade, попытка идентифицировать ордер только по brokerref, закончилась неудачей? В результате мой PositionManager не может связать сделку с ожидающим ордером! Что это такое не знаю? Это проблема QUIK или отдельного брокера "не передаёт brokerref в OnTrade для сделок, исполненных по лимитным ордерам"?
У себя слепил из того что было:
| Код |
|---|
function OnTrade(trade)
if not ctx or not ctx.instruments[trade.sec_code] then return end
ctx.logger:info("OnTrade: %s %s qty=%d price=%.2f flags=0x%X brokerref=%s",
trade.class_code, trade.sec_code, trade.qty, trade.price, trade.flags, trade.brokerref or "")
-- Получаем номер заявки, связанной со сделкой
local order_num = nil
if trade.order_num and trade.order_num ~= "" then
order_num = trade.order_num
elseif trade.trade_num and trade.trade_num ~= "" then
-- Пытаемся получить информацию о заявке по номеру сделки, если номер заявки недоступен напрямую
local order_info = getOrderByNumber(trade.class_code, trade.trade_num)
if order_info and order_info.order_num then
order_num = order_info.order_num
end
end
local event = ctx.pool:acquire()
event.type_id = EVENT.TRADE
event.sec_id = ctx.distributor.sec_to_id[trade.sec_code] or 0
event.sec_code = trade.sec_code
event.sec = trade.sec_code
event.price = trade.price or 0
event.qty = trade.qty or 0
event.trade_num = trade.trade_num or 0
event.flags = trade.flags or 0
event.time = ctx.time:now()
event.volume = trade.qty or 0
event.brokerref = trade.brokerref
event.order_num = order_num -- сохраняем номер заявки
ctx.queue:push(event)
local pm = ctx.position_managers[trade.sec_code]
if pm then
pm:update_from_trade(trade, order_num) -- передаём order_num
end
if ctx.executor then
ctx.executor:on_trade(trade)
end
end
|