跳转到内容

盈亏总览

盈亏接口用于订阅账户或单个持仓的实时 PnL 数据。这里的 PnL 指 Profit and Loss,也就是盈亏。

TWS API 主要提供两类 PnL 请求:

类型请求方法回调方法取消方法
账户级盈亏reqPnL()pnl()cancelPnL()
单个持仓盈亏reqPnLSingle()pnlSingle()cancelPnLSingle()

它们都是订阅型接口:请求后会持续推送更新,程序不再需要时应该主动取消。

问题推荐接口
查看账户今日盈亏、未实现盈亏、已实现盈亏reqPnL()
查看某个持仓的盈亏、数量、市值reqPnLSingle()
多账户或模型组合下按账户过滤盈亏reqPnL(reqId, account, modelCode)
没有持仓但想确认接口是否可用先用 reqPnL() 验证账户级回调
接口重点
reqAccountUpdates()账户值、组合行、保证金、现金等综合数据
reqPositions()持仓合约、数量、平均成本
reqPnL()账户级实时盈亏
reqPnLSingle()单个持仓的实时盈亏和市值

不要把 PnL 接口当作完整账户报表。它更适合做交易界面上的实时盈亏显示。

官方文档说明,PnL 数据与 TWS Portfolio Window 显示相关,数值会受到 TWS 中盈亏重置规则影响。账户级 PnL 还依赖 TWS 配置中的组合 PnL 准备设置。

单个持仓 PnL 有一个容易踩坑的地方:如果 conId 无效,或者这个合约并不在账户持仓中,可能不会返回 pnlSingle() 回调,也不一定报错。因此不能只用“没有错误”判断请求成功。

TWS 模拟账户参考结果:

CONNECTED=True
ACCOUNT_ALIAS=ACCOUNT_1
MANAGED_ACCOUNT_COUNT=1
ACCOUNT_REQUEST_ID=9301
ACCOUNT_PNL_CALLBACK_RECEIVED=True
ACCOUNT_PNL_ROW_COUNT=1
ACCOUNT_PNL_REQID_COUNTS=9301:1
ACCOUNT_PNL_VALUE_TYPE_COUNTS=number/number/number:1
ACCOUNT_CANCEL_SENT=True
ACCOUNT_ROWS_BEFORE_CANCEL=1
ACCOUNT_ROWS_AFTER_CANCEL_WAIT=1
SINGLE_REQUEST_ID=9302
SINGLE_CONID=265598
SINGLE_PNL_CALLBACK_RECEIVED=False
SINGLE_PNL_ROW_COUNT=0
SINGLE_PNL_REQID_COUNTS=NONE
SINGLE_PNL_VALUE_TYPE_COUNTS=NONE
SINGLE_CANCEL_SENT=True
SINGLE_ROWS_BEFORE_CANCEL=0
SINGLE_ROWS_AFTER_CANCEL_WAIT=0
INFO_CODES=2104,2106,2158
NON_INFO_ERROR_COUNT=0
IS_CONNECTED_AFTER_DISCONNECT=False

TWS 模拟账户连接、请求和取消链路正常。账户级 PnL 返回了 1 行回调,字段类型都是数字;单个 AAPL 合约 PnL 没有返回回调,原因通常是账户当前没有该合约持仓。文档示例会按这个边界处理:账户级 PnL 可以验证回调结构,单持仓 PnL 必须先确认账户里确实有对应持仓。