问题描述
/
解决方案
为什么会出现“交易不支持 set_limit_mode 函数”的警告?
在 ptrade 量化平台中,策略代码通常可以在回测环境和实盘交易环境中运行。然而,这两个环境的底层机制存在本质区别:
- 回测环境:是一个模拟的撮合引擎,需要开发者设定滑点、手续费、成交比例、撮合模式等参数,以尽可能逼近真实市场。
- 交易环境:直接将委托单报送至券商柜台,由真实的交易所进行撮合。因此,任何关于“模拟撮合规则”的设置在实盘中都是无效且不被支持的。
set_limit_mode(设置成交数量限制模式)正是这样一个仅在回测模块可用的函数。当您将包含此函数的策略直接放入交易模块运行时,ptrade 引擎会忽略该函数并抛出 WARNING-交易不支持set_limit_mode函数 的警告信息。
还有哪些类似的“仅回测可用”函数?
除了 set_limit_mode,以下设置函数也仅在回测模块可用,在交易模块中调用同样会触发类似的警告:
set_commission():设置佣金费率(实盘手续费由券商账户实际费率决定)。set_fixed_slippage():设置固定滑点。set_slippage():设置滑点比例。set_volume_ratio():设置成交比例。set_yesterday_position():设置初始底仓(实盘底仓直接读取账户真实持仓)。
如何优雅地解决这个问题?
虽然这些警告信息通常不会导致策略直接崩溃(引擎会自动忽略它们),但为了保持代码的严谨性,避免日志中充斥着无用的警告,建议对代码进行适配。
最佳实践:使用 is_trade() 函数进行环境隔离
ptrade 提供了 is_trade() 函数,用于判断当前代码是运行在交易环境还是回测环境。返回 True 表示在交易中,返回 False 表示在回测中。
您可以使用 if not is_trade(): 将仅限回测使用的函数包裹起来,这样同一套代码就可以完美兼容回测和实盘,无需来回修改。
代码示例
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 使用 is_trade() 判断运行环境
if not is_trade():
# 以下代码仅在回测环境中执行,实盘交易中会被跳过,从而避免 WARNING
log.info("当前运行场景:回测,正在初始化回测参数...")
# 设置佣金费率
set_commission(commission_ratio=0.0003, min_commission=5.0)
# 设置滑点
set_slippage(slippage=0.002)
# 设置成交数量限制模式
set_limit_mode('LIMIT')
# 设置成交比例
set_volume_ratio(0.25)
else:
log.info("当前运行场景:实盘交易,跳过回测参数设置。")
def handle_data(context, data):
# 策略交易逻辑
pass
通过这种方式,您的策略在回测时能够正确应用模拟参数,而在实盘交易时则会自动跳过这些不支持的函数,彻底消除 WARNING 警告信息,提升策略的健壮性。