测试订单影响 / WhatIf
whatIf=True 用来让 TWS 计算订单影响,而不是把订单真正提交到市场。它很适合新手检查合约、价格、数量、账户权限和保证金影响。
order = Order()order.action = "BUY"order.orderType = "LMT"order.totalQuantity = 1order.lmtPrice = 100.00order.tif = "DAY"order.whatIf = Trueorder.transmit = True
app.placeOrder(order_id, contract, order)whatIf=True 是“只预览”的关键。transmit=True 是让 TWS 执行预览计算,否则可能无法进入完整的订单影响检查。
返回结果示例
Section titled “返回结果示例”AAPL BUY 1 LMT 100.00 的 WhatIf 请求返回:
OPEN_ORDER=orderId=25;symbol=AAPL;action=BUY;orderType=LMT;totalQuantity=1;lmtPrice=100.0;whatIf=True;transmit=True;status=PreSubmitted;warningText=[价格偏离参考价提示]OPEN_ORDER=orderId=25;symbol=AAPL;action=BUY;orderType=LMT;totalQuantity=1;lmtPrice=100.0;whatIf=True;transmit=True;status=PreSubmitted;initMarginChange=96.2;equityWithLoanChange=0.0这说明 TWS 给出了保证金影响预览。不同账户、市场价格、产品权限和账户币种下,数值会不同。
风险提示怎么理解
Section titled “风险提示怎么理解”WhatIf 还可能返回限价距离参考价过远的警告,大意是:如果订单不能立即执行,系统可能根据市场条件拒绝距离参考价过远的限价单,以满足避免向市场提交扰乱性订单的监管要求。
这类警告不是 Python 程序错误,而是 TWS/IBKR 的订单保护逻辑。用户看到类似提示时,应先检查:
- 限价是否离参考市场价格太远。
- 数量是否过大。
- 合约是否正确。
- 账户是否有该产品交易权限。
- TWS 的订单预防设置是否过严。
常用返回字段
Section titled “常用返回字段”| 字段 | 中文意思 |
|---|---|
orderState.status | what-if 检查状态,常见为 PreSubmitted。 |
orderState.initMarginChange | 初始保证金变化。 |
orderState.maintMarginChange | 维持保证金变化。 |
orderState.equityWithLoanChange | 含贷款权益变化。 |
orderState.warningText | 风险、价格偏离或权限提示。 |
orderState.commissionAndFees | 预估佣金与费用,新版 API 字段名可能与旧资料不同。 |
orderState.minCommissionAndFees | 预估最低佣金与费用。 |
orderState.maxCommissionAndFees | 预估最高佣金与费用。 |
orderState.commissionAndFeesCurrency | 佣金与费用币种。 |
自建交易系统可以先实现 WhatIf,再开放模拟账户正式下单。这样用户能先看到订单影响,再决定是否提交模拟订单。
WhatIf 不能替代真实下单回调。它只能说明“如果提交这张订单,TWS 预估会产生什么影响”,不代表正式订单一定会被接受,也不代表一定成交。