接收账户盈亏
账户级 PnL 通过 pnl() 回调接收。
def pnl(self, reqId, dailyPnL, unrealizedPnL, realizedPnL): ...它只返回账户级汇总金额,不返回单个合约细节。如果需要单个持仓盈亏,应使用 reqPnLSingle()。
| 字段 | 中文含义 | 说明 |
|---|---|---|
reqId | 请求编号 | 对应 reqPnL() 的请求编号 |
dailyPnL | 当日盈亏 | 按 TWS 的 PnL 重置规则计算 |
unrealizedPnL | 未实现盈亏 | 未平仓持仓的总未实现盈亏 |
realizedPnL | 已实现盈亏 | 已平仓或已实现部分的总盈亏 |
这些字段是账户级金额,适合在后台按权限返回给已授权用户。公共日志中不要直接打印真实数值。
安全保存结构
Section titled “安全保存结构”def pnl(self, reqId, dailyPnL, unrealizedPnL, realizedPnL): row = { "reqId": reqId, "dailyPnL": dailyPnL, "unrealizedPnL": unrealizedPnL, "realizedPnL": realizedPnL, }如果只是做文档或接口连通性检查时,可以只输出字段类型和回调次数:
def pnl(self, reqId, dailyPnL, unrealizedPnL, realizedPnL): self.pnl_rows.append({ "reqId": reqId, "daily_is_number": isinstance(dailyPnL, (int, float)), "unrealized_is_number": isinstance(unrealizedPnL, (int, float)), "realized_is_number": isinstance(realizedPnL, (int, float)), })ACCOUNT_PNL_CALLBACK_RECEIVED=TrueACCOUNT_PNL_ROW_COUNT=1ACCOUNT_PNL_REQID_COUNTS=9301:1ACCOUNT_PNL_VALUE_TYPE_COUNTS=number/number/number:1INFO_CODES=2104,2106,2158NON_INFO_ERROR_COUNT=0TWS 模拟账户收到账户级 PnL 回调,dailyPnL、unrealizedPnL、realizedPnL 都以数字类型返回。公共示例只展示字段类型和回调次数,不展示真实金额。
dailyPnL 是从开仓以来的盈亏吗?
Section titled “dailyPnL 是从开仓以来的盈亏吗?”不是。dailyPnL 是当日盈亏,受 TWS PnL 重置规则影响。
unrealizedPnL 和 realizedPnL 有什么区别?
Section titled “unrealizedPnL 和 realizedPnL 有什么区别?”unrealizedPnL 是未平仓部分的浮动盈亏;realizedPnL 是已经实现的盈亏。
账户级 PnL 能替代持仓列表吗?
Section titled “账户级 PnL 能替代持仓列表吗?”不能。账户级 PnL 是汇总值,不告诉你每个合约的持仓数量和成本。