Skip to content

PTrade 交易不支持 set_commission / set_slippage / set_limit_mode

模拟盘或实盘一启动,日志开头常连着三条 WARNING:

text
WARNING - 交易不支持set_commission函数
WARNING - 交易不支持set_slippage函数
WARNING - 交易不支持set_limit_mode函数

这是机制提示,不是策略写崩了。策略一般还能继续跑;佣金、滑点、成交量限制在交易环境里由柜台/券商规则决定,不听这几个回测函数。

结论

函数回测交易(模拟 / 实盘)
set_commission可用不支持(打 WARNING,调用被忽略)
set_slippage / set_fixed_slippage可用不支持
set_limit_mode可用不支持

手册目录里也标了「回测」:见 设置函数 一节的表格(set_commission(回测) 等)。

为什么回测代码一贴交易就报警

很多人把回测模板整段贴进交易:

python
def initialize(context):
    set_universe([...])
    set_benchmark('000300.SS')
    set_commission(commission_ratio=0.0003, min_commission=5)  # 回测用
    set_slippage(slippage=0.001)                              # 回测用
    set_limit_mode('LIMIT')                                   # 回测用

回测里这三项用来模拟成本、滑点、成交量上限。
交易里:真实费率走账户;滑点和能否成交走盘口与柜台;set_limit_mode 的「无限量成交」只在回测有意义。所以引擎会打 WARNING 并跳过,而不是按你设的参数改实盘规则。

同类还有只在回测生效的,例如 set_volume_ratioset_yesterday_position。交易里调用也会提示或不生效。

怎么处理

可以不管:只要后面逻辑、下单正常,这三条 WARNING 可当作噪音。

想日志干净:交易用策略里不要调它们;回测与交易拆两份,或包一层:

python
def initialize(context):
    set_universe(['002882.SZ', '601218.SS'])
    set_benchmark('000300.SS')
    if not is_trade():
        set_commission(commission_ratio=0.0003, min_commission=5)
        set_slippage(slippage=0.001)
        set_limit_mode('LIMIT')

is_trade() 为真表示当前是交易场景。见 is_trade

不要误判的

  • 这三条不等于「策略没启动」。后面若有持仓打印、盯板日志,说明主流程在跑。
  • 不会因此自动改成你设的佣金率去实盘扣费。
  • 若真正下单失败,去看拒单原因,常见另有:9:30 下单失败.SS / .SH、快照限制 get_snapshot 约 3 秒

相关:initialize / handle_data · API 查询 · 聚宽转 PTrade