跳转到内容

测试订单影响 / WhatIf

whatIf=True 用来让 TWS 计算订单影响,而不是把订单真正提交到市场。它很适合新手检查合约、价格、数量、账户权限和保证金影响。

order = Order()
order.action = "BUY"
order.orderType = "LMT"
order.totalQuantity = 1
order.lmtPrice = 100.00
order.tif = "DAY"
order.whatIf = True
order.transmit = True
app.placeOrder(order_id, contract, order)

whatIf=True 是“只预览”的关键。transmit=True 是让 TWS 执行预览计算,否则可能无法进入完整的订单影响检查。

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 给出了保证金影响预览。不同账户、市场价格、产品权限和账户币种下,数值会不同。

WhatIf 还可能返回限价距离参考价过远的警告,大意是:如果订单不能立即执行,系统可能根据市场条件拒绝距离参考价过远的限价单,以满足避免向市场提交扰乱性订单的监管要求。

这类警告不是 Python 程序错误,而是 TWS/IBKR 的订单保护逻辑。用户看到类似提示时,应先检查:

  • 限价是否离参考市场价格太远。
  • 数量是否过大。
  • 合约是否正确。
  • 账户是否有该产品交易权限。
  • TWS 的订单预防设置是否过严。
字段中文意思
orderState.statuswhat-if 检查状态,常见为 PreSubmitted
orderState.initMarginChange初始保证金变化。
orderState.maintMarginChange维持保证金变化。
orderState.equityWithLoanChange含贷款权益变化。
orderState.warningText风险、价格偏离或权限提示。
orderState.commissionAndFees预估佣金与费用,新版 API 字段名可能与旧资料不同。
orderState.minCommissionAndFees预估最低佣金与费用。
orderState.maxCommissionAndFees预估最高佣金与费用。
orderState.commissionAndFeesCurrency佣金与费用币种。

自建交易系统可以先实现 WhatIf,再开放模拟账户正式下单。这样用户能先看到订单影响,再决定是否提交模拟订单。

WhatIf 不能替代真实下单回调。它只能说明“如果提交这张订单,TWS 预估会产生什么影响”,不代表正式订单一定会被接受,也不代表一定成交。