问题描述
/
解决方案
在 ptrade 量化交易平台中,使用 run_interval 接口设置定时周期任务时,如果遇到“参数类型不匹配”的报错,通常是因为自定义函数的参数列表定义不正确。
问题原因
根据 ptrade API 文档,run_interval 的 func 参数要求传入一个自定义函数,该函数必须且只能以 context 作为唯一参数(类型为 Callable[[Context], None])。
很多开发者会习惯性地像定义 handle_data(context, data) 或 before_trading_start(context, data) 一样,给自定义函数加上了 data 参数,或者完全没有参数,这就会导致引擎在回调该函数时传入参数数量不匹配,从而引发报错。
正确的定义方法
自定义函数应该只接收 context 一个参数。正确格式如下:
def my_custom_func(context):
# 在这里编写你的周期处理逻辑
pass
完整代码示例
以下是一个使用 run_interval 的标准策略结构示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 正确调用 run_interval,每 10 秒执行一次 interval_handle 函数
run_interval(context, interval_handle, seconds=10)
# 正确定义 func:只接收 context 参数
def interval_handle(context):
# 获取实时行情快照
snapshot = get_snapshot(g.security)
if snapshot:
log.info("当前最新价: %s" % snapshot[g.security]['last_px'])
def handle_data(context, data):
pass
常见错误写法(请避免)
错误写法 1:多加了 data 参数
# 错误:run_interval 的回调函数不需要 data 参数
def interval_handle(context, data):
pass
错误写法 2:没有参数
# 错误:缺少 context 参数
def interval_handle():
pass
注意事项
- 调用位置:
run_interval只能在initialize函数中调用。 - 时间间隔限制:
seconds参数设置的最小时间间隔为 3 秒,如果设置小于 3 秒,系统会默认按 3 秒执行。 - 多线程并发:如果多次设定
run_interval,它们会以多线程并行运行,请务必小心处理不同线程之间全局变量(如g对象)的读写冲突问题。