策略运行时报错“函数只能在初始化阶段调用”,如何解决?
/
问题描述
解决方案
在 ptrade 量化平台中,遇到**“函数只能在初始化阶段调用”的报错,通常是因为您将仅限在 initialize 函数中使用的 API**,错误地写在了 handle_data、before_trading_start 或其他自定义函数中。
1. 常见只能在 initialize 中调用的函数
根据 ptrade API 文档,以下函数必须且只能在 initialize(context) 中调用:
- 定时任务类:
run_daily()、run_interval() - 环境设置类:
set_universe()(设置股票池)、set_benchmark()(设置基准)、set_parameters()(设置策略配置参数) - 回测专属设置类:
set_commission()(设置佣金)、set_slippage()(设置滑点)、set_fixed_slippage()、set_volume_ratio()、set_limit_mode()、set_yesterday_position()
2. 错误示例与正确示例对比
❌ 错误示例(会导致报错):
def initialize(context):
g.security = '600570.SS'
def handle_data(context, data):
# 错误:set_universe 不能在 handle_data 中调用
set_universe(g.security)
# 错误:run_daily 不能在 handle_data 中调用
run_daily(context, my_func, time='14:30')
✅ 正确示例(修复报错):
def initialize(context):
g.security = '600570.SS'
# 正确:在 initialize 中调用
set_universe(g.security)
# 正确:在 initialize 中设置定时任务
run_daily(context, my_func, time='14:30')
def my_func(context):
log.info("执行定时任务")
def handle_data(context, data):
# 盘中处理逻辑
pass
3. 解决步骤
- 查看报错日志:定位报错提示的具体代码行号。
- 检查 API 归属:查看该行调用的函数是否属于上述“初始化专属”的 API。
- 移动代码:将该行代码剪切并粘贴到
def initialize(context):函数的代码块内部。 - 注意变量作用域:如果移动代码后涉及到变量传递,请确保使用全局变量
g.xxx来在initialize和其他函数之间共享数据。