跳转到内容

下单注意事项

下单接口最容易出问题的地方不是 Python 语法,而是交易规则。程序在调用 placeOrder() 前,应先做一轮本地校验,再把结果交给 TWS。

检查项为什么重要
合约详情已确认避免交易错标的,尤其是期权、期货、外汇和同名股票。
nextValidId() 已收到避免订单 ID 错乱。
价格符合最小跳动避免被 TWS 拒绝。
数量为正且在上限内避免误下大单。
账户和产品权限明确没有权限的产品会被拒绝。
订单类型适合产品不是所有产品都支持所有订单类型。
已监听 error()风控拒绝、撤单提示、权限错误都从这里返回。
已监听 openOrder() / orderStatus()placeOrder() 只是发送请求,结果要看回调。
  1. reqContractDetails() 确认合约。
  2. reqMarketRule() 检查价格增量。
  3. whatIf=True 预览订单影响。
  4. 提交模拟账户限价单。
  5. 监听 openOrder()orderStatus()
  6. cancelOrder() 撤销测试挂单。

这个顺序比直接提交市价单更适合新手,也更适合模拟账户测试工具。

TWS 可能因为价格远离参考价、数量过大、产品权限不足、交易时段不匹配等原因拒绝订单。WhatIf 预览中,TWS 可能返回“限价距离参考价过远时可能被拒绝”的警告。

这类提示不是接口坏了,而是交易系统在保护账户和市场。程序应该把提示展示给用户,而不是默认隐藏。

回调应保存的内容
openOrder()合约、订单对象、订单状态、风险提示。
orderStatus()状态、已成交数量、剩余数量、平均成交价、permId
execDetails()成交 ID、成交价格、成交数量、成交时间。
commissionAndFeesReport()佣金、费用、币种、已实现盈亏。
error()错误码、提示文本、对应 reqIdorderId
  • 用户界面不要默认市价单。
  • 数量输入要有上限。
  • 限价要检查价格增量和明显异常偏离。
  • 真实账户下单前应有二次确认。
  • 程序重启后先恢复活动订单,再允许继续下单。
  • 多策略共用账户时,用 orderRef 标记订单来源。