跳转至

Live 函数式策略上手手册

本文聚焦 LiveRunner 的函数式策略入口,帮助你在 paperbroker_live 两种模式下快速搭建最小闭环。

1. 适用场景

  • 想保留 on_bar(ctx, bar) 风格,不继承 Strategy 类。
  • 需要快速把回测中的函数式策略迁移到实时/仿真运行。
  • 需要在 broker_live 下直接使用 submit_order(...)

2. 两种运行模式

2.1 paper(撮合模拟)

推荐先用 paper 检查事件链路是否正常:

2.2 broker_live(网关真实下单)

确认网关连通后切换到 broker_live:

3. 函数式入口模板

def initialize(ctx):
    ctx.sent = False

def on_bar(ctx, bar):
    if not ctx.sent and hasattr(ctx, "submit_order"):
        ctx.submit_order(
            symbol=bar.symbol,
            side="Buy",
            quantity=1.0,
            client_order_id="demo-1",
            order_type="Market",
        )
        ctx.sent = True

runner = LiveRunner(
    strategy_cls=on_bar,
    initialize=initialize,
    on_order=on_order,
    on_trade=on_trade,
    on_timer=on_timer,
    context={"strategy_name": "demo"},
    instruments=instruments,
    broker="ctp",
    trading_mode="broker_live",
)
runner.run(duration="30s", show_progress=False)

4. 常见排查

  • submit_order 尚未注入
  • 原因:网关尚未完成交易侧绑定。
  • 处理:在 on_barhasattr(ctx, "submit_order") 判定后再下单。
  • duplicate active client_order_id
  • 原因:重复提交活跃 client id。
  • 处理:每次下单生成新的 client_order_id
  • 有行情但无成交回调
  • 原因:交易网关未连通、风控拒单、最小变动价位/手数不合规。
  • 处理:优先检查 on_order 状态与拒单原因。

5. 建议上线流程

  • 第一步:先跑 paper 模式,确认回调顺序与策略状态变更。
  • 第二步:切换 broker_live,先用最小下单量做连通性验证。
  • 第三步:稳定后再增加复杂逻辑(定时器、风控、分批下单)。