下单注意事项
下单接口最容易出问题的地方不是 Python 语法,而是交易规则。程序在调用 placeOrder() 前,应先做一轮本地校验,再把结果交给 TWS。
| 检查项 | 为什么重要 |
|---|---|
| 合约详情已确认 | 避免交易错标的,尤其是期权、期货、外汇和同名股票。 |
nextValidId() 已收到 | 避免订单 ID 错乱。 |
| 价格符合最小跳动 | 避免被 TWS 拒绝。 |
| 数量为正且在上限内 | 避免误下大单。 |
| 账户和产品权限明确 | 没有权限的产品会被拒绝。 |
| 订单类型适合产品 | 不是所有产品都支持所有订单类型。 |
已监听 error() | 风控拒绝、撤单提示、权限错误都从这里返回。 |
已监听 openOrder() / orderStatus() | placeOrder() 只是发送请求,结果要看回调。 |
推荐的开发顺序
Section titled “推荐的开发顺序”reqContractDetails()确认合约。reqMarketRule()检查价格增量。whatIf=True预览订单影响。- 提交模拟账户限价单。
- 监听
openOrder()和orderStatus()。 cancelOrder()撤销测试挂单。
这个顺序比直接提交市价单更适合新手,也更适合模拟账户测试工具。
TWS 可能因为价格远离参考价、数量过大、产品权限不足、交易时段不匹配等原因拒绝订单。WhatIf 预览中,TWS 可能返回“限价距离参考价过远时可能被拒绝”的警告。
这类提示不是接口坏了,而是交易系统在保护账户和市场。程序应该把提示展示给用户,而不是默认隐藏。
回调必须保存
Section titled “回调必须保存”| 回调 | 应保存的内容 |
|---|---|
openOrder() | 合约、订单对象、订单状态、风险提示。 |
orderStatus() | 状态、已成交数量、剩余数量、平均成交价、permId。 |
execDetails() | 成交 ID、成交价格、成交数量、成交时间。 |
commissionAndFeesReport() | 佣金、费用、币种、已实现盈亏。 |
error() | 错误码、提示文本、对应 reqId 或 orderId。 |
常见安全边界
Section titled “常见安全边界”- 用户界面不要默认市价单。
- 数量输入要有上限。
- 限价要检查价格增量和明显异常偏离。
- 真实账户下单前应有二次确认。
- 程序重启后先恢复活动订单,再允许继续下单。
- 多策略共用账户时,用
orderRef标记订单来源。