模拟账户限制
Paper Account(模拟账户)是 TWS API 开发阶段最重要的安全缓冲。它适合验证连接、合约、行情请求、订单字段和回调流程,但不能等同于真实交易环境。
模拟账户适合做什么
Section titled “模拟账户适合做什么”| 用途 | 是否适合 |
|---|---|
| 验证 TWS API 连接 | 适合 |
测试 nextValidId、currentTime | 适合 |
| 查询合约详情 | 适合 |
| 学习账户和持仓回调 | 适合 |
| 测试历史行情请求 | 适合,但仍受权限和数据限制影响 |
| 测试订单字段和状态回调 | 适合 |
| 验证真实成交质量 | 不适合 |
| 验证真实滑点和流动性 | 不适合 |
如果只是学习接口,模拟账户应该是默认选择。它可以让你大胆测试 whatIf=True、小数量限价单、撤单、订单状态和错误回调,而不影响真实资金。
和真实账户的差异
Section titled “和真实账户的差异”模拟账户和真实账户可能在以下方面不同:
- 成交逻辑。
- 可交易产品。
- 行情权限。
- 订单风控提示。
- 资金、保证金和购买力计算。
- 交易所规则和真实市场状态。
所以,在 Paper Account 中跑通代码,只能说明“程序流程基本正确”,不能说明真实账户一定能按同样方式成交。
行情权限仍然可能受限
Section titled “行情权限仍然可能受限”很多新手会误以为模拟账户一定包含完整行情。实际不是这样。模拟账户也可能遇到:
| 现象 | 说明 |
|---|---|
| 只能拿到延迟行情 | 账户没有对应交易所实时行情订阅。 |
| 逐笔数据报权限错误 | 逐笔数据通常比普通 L1 行情要求更高。 |
| 某些历史数据为空 | 产品、交易所、数据类型或时间范围不支持。 |
| 期权 Greeks 不完整 | 期权行情和模型数据可能需要对应权限和有效市场数据。 |
文档示例如果遇到真实权限错误,会保留错误码和说明。这样用户复制代码后遇到相同错误,能判断是权限问题,而不是示例代码一定写错。
开发阶段的推荐顺序
Section titled “开发阶段的推荐顺序”建议按下面顺序推进:
- 用 Paper Account 验证
connect()、nextValidId和currentTime。 - 用 Paper Account 查询
ContractDetails,确认合约唯一。 - 用 Paper Account 请求历史行情和延迟行情。
- 用
whatIf=True做订单影响预览。 - 在 Paper Account 中提交小数量模拟订单。
- 如果未来进入真实账户,重新检查权限、风控、价格和数量。
订单示例应默认使用 Paper Account,并优先使用 whatIf=True。
从模拟到账户真实交易的最低要求
Section titled “从模拟到账户真实交易的最低要求”如果未来要把同一套逻辑迁移到真实账户,至少重新确认:
| 检查项 | 原因 |
|---|---|
| 合约是否唯一 | 避免同一代码匹配到错误交易所、币种或到期日。 |
| 订单数量限制 | 防止代码 bug 放大成真实仓位。 |
| 限价保护 | 避免市价单或错误价格造成不可控成交。 |
| 订单状态处理 | 必须保存 openOrder()、orderStatus()、execDetails() 和 error()。 |
| 撤单和异常恢复 | 断线、拒单、部分成交时要有明确处理。 |
| 日志和审计 | 真实账户必须能追踪每次请求和回调。 |
| 误解 | 正确理解 |
|---|---|
| 模拟账户能成交,真实账户也一定能成交 | 不一定,真实市场有流动性、滑点和风控差异。 |
| 模拟账户没有风险,所以可以随便写下单代码 | 错。坏习惯迁移到真实账户会很危险。 |
| 模拟账户行情一定完整 | 不一定,行情权限和数据类型仍可能受限制。 |
| Paper Account 不需要关注订单 ID | 错。nextValidId 和订单 ID 序列仍然要正确处理。 |