12. 模拟实盘中的风控与 Broker 适配(双路径)

本教程通过两条完整路径,带你在模拟实盘中验证 S1.3 的关键行为:

  • 路径 A:asset_type='E' + simulator

  • 路径 B:asset_type='FD' + simulator

目标是“跑通 + 观测 + 验证”,而不是只看概念。

12.1. 0. 教程目标

  • 跑通两条路径(E 与 FD)

  • 人工触发一次拒单并定位原因

  • 观察分批成交状态从 partial-filledfilled 的可见行为

12.2. 1. 前置准备

  • 已有可运行的 Operator

  • 本地数据可支持运行频率

  • 已配置 live 账户参数

建议先准备一个“可稳定触发拒单”的规则配置(例如较小的单笔数量上限),便于复现实验。

12.3. 2. 路径 A:E + simulator

步骤 1:设置配置

import qteasy as qt

qt.configure(
    mode=0,
    asset_type='E',
    live_trade_broker_type='simulator',
    live_price_acquire_channel='eastmoney',
    live_price_acquire_freq='15MIN',
)

步骤 2:启动运行

qt.run(op)

步骤 3:提交一笔测试订单并观察反馈

  • 关注是否出现提交成功提示

  • 关注是否出现风控拒单提示(英文)

  • 记录一次订单 ID(后续对照日志)

12.4. 3. 路径 B:FD + simulator

步骤 1:切换资产类型配置

import qteasy as qt

qt.configure(
    mode=0,
    asset_type='FD',
    live_trade_broker_type='simulator',
    live_price_acquire_channel='eastmoney',
    live_price_acquire_freq='15MIN',
)

步骤 2:重复启动与下单

qt.run(op)

步骤 3:验证行为一致性

  • FD 路径应可进入 live 运行链路

  • 拒单/提交/日志的观察方式与 E 路径一致

  • 同一类订单在两条路径下应有一致的反馈语义

12.5. 4. 人工触发一次风控拒单

建议临时设置严格规则(如单笔数量上限),提交超限订单。
你应看到类似英文提示:

Order rejected by risk rule [MAX_ORDER_QTY]: order quantity exceeds limit

并可在 risk_log 中检索到对应记录。

建议至少验证两次:

  1. 一次被拒(确认拒因可见)

  2. 一次放行(确认策略可继续运行)

12.6. 5. 观察订单状态变化

重点观察是否出现:

  • submitted -> partial-filled -> filled

在分批成交场景中,最终状态应与累计成交量一致。

如果你看到了 partial-filled 长时间不变,请回到排错页按“状态理解偏差”剧本核对日志。

12.7. 6. 教程验收清单

  • E 路径可运行

  • FD 路径可运行

  • 可触发并识别风控拒单

  • 可在日志中定位拒单原因

  • 可观察并理解分批成交状态变化

  • 至少完成一次“拒单 -> 调整参数 -> 放行”闭环验证

12.8. 7. 下一步

  • 深入机制:live_trading/3-risk-and-order-lifecycle

  • 扩展 Broker:live_trading/4-broker-adapter-and-integration

  • 排错手册:live_trading/5-artifacts-and-troubleshooting

12.9. 8. 结果判定标准

当你完成本教程后,应能独立回答以下问题:

  • 当前订单是被风控拒绝,还是已提交但未成交?

  • 为什么某笔订单会停留在 partial-filled

  • 需要去哪个日志文件先看、再看什么字段?

若以上三题都能独立回答,说明你已经具备 live 场景下的基本排错能力。