佣金与费用报告
佣金与费用报告在成交后返回,用来说明这笔成交对应的佣金、费用、币种和已实现盈亏。
较新的 Python API 使用的回调是 commissionAndFeesReport()。它通常和 execDetails() 成对理解:execDetails() 告诉你成交本身,commissionAndFeesReport() 告诉你这笔成交的费用结果。
def commissionAndFeesReport(self, commissionAndFeesReport) -> None: print( commissionAndFeesReport.execId, commissionAndFeesReport.commissionAndFees, commissionAndFeesReport.currency, commissionAndFeesReport.realizedPNL, )| 字段 | 中文说明 |
|---|---|
execId | 成交 ID,用来和 Execution.execId 对应。 |
commissionAndFees | 佣金与费用金额。 |
currency | 费用币种。 |
realizedPNL | 已实现盈亏。 |
yield_ | 收益率字段,主要用于部分债券场景。 |
yieldRedemptionDate | 到期/赎回日期,格式通常是 YYYYMMDD。 |
和成交详情的对应关系
Section titled “和成交详情的对应关系”佣金与费用报告不是独立凭空出现的,它要和成交记录关联:
| 成交回调字段 | 佣金回调字段 | 说明 |
|---|---|---|
Execution.execId | commissionAndFeesReport.execId | 同一笔成交的关联键。 |
Execution.orderId | 无直接同名字段 | 可以通过成交记录找到本地订单。 |
Execution.clientId | 无直接同名字段 | 可以判断成交来自哪个 API 客户端。 |
Execution.price / shares | commissionAndFees | 成交价和数量配合费用一起做成本统计。 |
保存成交时,建议先保存 execId,佣金报告稍后到达时再按 execId 更新同一条成交记录。
EXEC_ROWS=0COMMISSION_ROWS=0COMPLETED_ORDER_ROWS=4如果查询范围内没有新的成交,就不会返回佣金与费用报告。这不是接口失败;佣金报告依赖真实成交或可查询到的成交记录。
如果同一轮查询里返回已完成订单,也不代表一定会有佣金报告。取消单、未成交订单或没有成交明细的记录不会产生 commissionAndFeesReport();只有能关联到成交的 execId,才适合继续做费用和盈亏统计。
保存成交时,建议同时保存:
| 字段 | 用途 |
|---|---|
execId | 成交和佣金报告的关联键。 |
orderId | 对应本地订单。 |
permId | 对应 IB 系统级订单。 |
commissionAndFees | 成本统计。 |
realizedPNL | 已实现盈亏统计。 |
如果 execDetails() 已经返回但佣金报告稍后才到,程序应允许先保存成交,再异步补上佣金字段。
| 误解 | 正确理解 |
|---|---|
| 取消单也会有佣金 | 没有成交就通常没有佣金。 |
reqExecutions() 返回 0 就是接口坏了 | 可能只是查询范围里没有成交。 |
| 佣金报告一定先于成交详情到达 | 不要依赖回调顺序,应按 execId 关联。 |
realizedPNL 一定可直接用于全部产品 | 不同产品、币种和账户设置下要结合成交、汇率和账户报表理解。 |