跳转到内容

佣金与费用报告

佣金与费用报告在成交后返回,用来说明这笔成交对应的佣金、费用、币种和已实现盈亏。

较新的 Python API 使用的回调是 commissionAndFeesReport()。它通常和 execDetails() 成对理解:execDetails() 告诉你成交本身,commissionAndFeesReport() 告诉你这笔成交的费用结果。

官方参考:IBKR Campus - TWS API 文档

def commissionAndFeesReport(self, commissionAndFeesReport) -> None:
print(
commissionAndFeesReport.execId,
commissionAndFeesReport.commissionAndFees,
commissionAndFeesReport.currency,
commissionAndFeesReport.realizedPNL,
)
字段中文说明
execId成交 ID,用来和 Execution.execId 对应。
commissionAndFees佣金与费用金额。
currency费用币种。
realizedPNL已实现盈亏。
yield_收益率字段,主要用于部分债券场景。
yieldRedemptionDate到期/赎回日期,格式通常是 YYYYMMDD

佣金与费用报告不是独立凭空出现的,它要和成交记录关联:

成交回调字段佣金回调字段说明
Execution.execIdcommissionAndFeesReport.execId同一笔成交的关联键。
Execution.orderId无直接同名字段可以通过成交记录找到本地订单。
Execution.clientId无直接同名字段可以判断成交来自哪个 API 客户端。
Execution.price / sharescommissionAndFees成交价和数量配合费用一起做成本统计。

保存成交时,建议先保存 execId,佣金报告稍后到达时再按 execId 更新同一条成交记录。

EXEC_ROWS=0
COMMISSION_ROWS=0
COMPLETED_ORDER_ROWS=4

如果查询范围内没有新的成交,就不会返回佣金与费用报告。这不是接口失败;佣金报告依赖真实成交或可查询到的成交记录。

如果同一轮查询里返回已完成订单,也不代表一定会有佣金报告。取消单、未成交订单或没有成交明细的记录不会产生 commissionAndFeesReport();只有能关联到成交的 execId,才适合继续做费用和盈亏统计。

保存成交时,建议同时保存:

字段用途
execId成交和佣金报告的关联键。
orderId对应本地订单。
permId对应 IB 系统级订单。
commissionAndFees成本统计。
realizedPNL已实现盈亏统计。

如果 execDetails() 已经返回但佣金报告稍后才到,程序应允许先保存成交,再异步补上佣金字段。

误解正确理解
取消单也会有佣金没有成交就通常没有佣金。
reqExecutions() 返回 0 就是接口坏了可能只是查询范围里没有成交。
佣金报告一定先于成交详情到达不要依赖回调顺序,应按 execId 关联。
realizedPNL 一定可直接用于全部产品不同产品、币种和账户设置下要结合成交、汇率和账户报表理解。