盈亏总览
盈亏接口用于订阅账户或单个持仓的实时 PnL 数据。这里的 PnL 指 Profit and Loss,也就是盈亏。
TWS API 主要提供两类 PnL 请求:
| 类型 | 请求方法 | 回调方法 | 取消方法 |
|---|---|---|---|
| 账户级盈亏 | reqPnL() | pnl() | cancelPnL() |
| 单个持仓盈亏 | reqPnLSingle() | pnlSingle() | cancelPnLSingle() |
它们都是订阅型接口:请求后会持续推送更新,程序不再需要时应该主动取消。
适合解决什么问题
Section titled “适合解决什么问题”| 问题 | 推荐接口 |
|---|---|
| 查看账户今日盈亏、未实现盈亏、已实现盈亏 | reqPnL() |
| 查看某个持仓的盈亏、数量、市值 | reqPnLSingle() |
| 多账户或模型组合下按账户过滤盈亏 | reqPnL(reqId, account, modelCode) |
| 没有持仓但想确认接口是否可用 | 先用 reqPnL() 验证账户级回调 |
和账户更新、持仓接口的区别
Section titled “和账户更新、持仓接口的区别”| 接口 | 重点 |
|---|---|
reqAccountUpdates() | 账户值、组合行、保证金、现金等综合数据 |
reqPositions() | 持仓合约、数量、平均成本 |
reqPnL() | 账户级实时盈亏 |
reqPnLSingle() | 单个持仓的实时盈亏和市值 |
不要把 PnL 接口当作完整账户报表。它更适合做交易界面上的实时盈亏显示。
官方文档说明,PnL 数据与 TWS Portfolio Window 显示相关,数值会受到 TWS 中盈亏重置规则影响。账户级 PnL 还依赖 TWS 配置中的组合 PnL 准备设置。
单个持仓 PnL 有一个容易踩坑的地方:如果 conId 无效,或者这个合约并不在账户持仓中,可能不会返回 pnlSingle() 回调,也不一定报错。因此不能只用“没有错误”判断请求成功。
TWS 模拟账户参考结果:
CONNECTED=TrueACCOUNT_ALIAS=ACCOUNT_1MANAGED_ACCOUNT_COUNT=1ACCOUNT_REQUEST_ID=9301ACCOUNT_PNL_CALLBACK_RECEIVED=TrueACCOUNT_PNL_ROW_COUNT=1ACCOUNT_PNL_REQID_COUNTS=9301:1ACCOUNT_PNL_VALUE_TYPE_COUNTS=number/number/number:1ACCOUNT_CANCEL_SENT=TrueACCOUNT_ROWS_BEFORE_CANCEL=1ACCOUNT_ROWS_AFTER_CANCEL_WAIT=1SINGLE_REQUEST_ID=9302SINGLE_CONID=265598SINGLE_PNL_CALLBACK_RECEIVED=FalseSINGLE_PNL_ROW_COUNT=0SINGLE_PNL_REQID_COUNTS=NONESINGLE_PNL_VALUE_TYPE_COUNTS=NONESINGLE_CANCEL_SENT=TrueSINGLE_ROWS_BEFORE_CANCEL=0SINGLE_ROWS_AFTER_CANCEL_WAIT=0INFO_CODES=2104,2106,2158NON_INFO_ERROR_COUNT=0IS_CONNECTED_AFTER_DISCONNECT=FalseTWS 模拟账户连接、请求和取消链路正常。账户级 PnL 返回了 1 行回调,字段类型都是数字;单个 AAPL 合约 PnL 没有返回回调,原因通常是账户当前没有该合约持仓。文档示例会按这个边界处理:账户级 PnL 可以验证回调结构,单持仓 PnL 必须先确认账户里确实有对应持仓。