跳转到内容

接收账户盈亏

账户级 PnL 通过 pnl() 回调接收。

def pnl(self, reqId, dailyPnL, unrealizedPnL, realizedPnL):
...

它只返回账户级汇总金额,不返回单个合约细节。如果需要单个持仓盈亏,应使用 reqPnLSingle()

字段中文含义说明
reqId请求编号对应 reqPnL() 的请求编号
dailyPnL当日盈亏按 TWS 的 PnL 重置规则计算
unrealizedPnL未实现盈亏未平仓持仓的总未实现盈亏
realizedPnL已实现盈亏已平仓或已实现部分的总盈亏

这些字段是账户级金额,适合在后台按权限返回给已授权用户。公共日志中不要直接打印真实数值。

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=True
ACCOUNT_PNL_ROW_COUNT=1
ACCOUNT_PNL_REQID_COUNTS=9301:1
ACCOUNT_PNL_VALUE_TYPE_COUNTS=number/number/number:1
INFO_CODES=2104,2106,2158
NON_INFO_ERROR_COUNT=0

TWS 模拟账户收到账户级 PnL 回调,dailyPnLunrealizedPnLrealizedPnL 都以数字类型返回。公共示例只展示字段类型和回调次数,不展示真实金额。

dailyPnL 是从开仓以来的盈亏吗?

Section titled “dailyPnL 是从开仓以来的盈亏吗?”

不是。dailyPnL 是当日盈亏,受 TWS PnL 重置规则影响。

unrealizedPnLrealizedPnL 有什么区别?

Section titled “unrealizedPnL 和 realizedPnL 有什么区别?”

unrealizedPnL 是未平仓部分的浮动盈亏;realizedPnL 是已经实现的盈亏。

不能。账户级 PnL 是汇总值,不告诉你每个合约的持仓数量和成本。