问题描述
/
解决方案
问题解答
出现 after_trading_end() takes 1 positional argument but 2 were given 这个报错,是因为你的函数写错了,而不是版本不匹配。
错误原因分析
在 PTrade 量化引擎中,盘后处理函数 after_trading_end 被引擎调用时,默认会传入两个参数:
context:上下文对象,包含账户及持仓信息。data:保留字段(虽然暂无数据,但引擎调用时会传这个参数)。
如果你在策略代码中将函数定义为只接收一个参数(例如:def after_trading_end(context):),当引擎尝试传入两个参数时,Python 就会抛出 takes 1 positional argument but 2 were given 的错误。
正确的写法
你需要在函数定义中补上 data 参数,即使你在函数体内不使用它。正确的代码格式如下:
def after_trading_end(context, data):
# 在这里编写你的盘后处理逻辑
# 例如:打印当天的持仓信息或保存数据
log.info("盘后处理执行完毕")
pass
扩展说明
根据 PTrade API 文档,策略中几个核心事件函数的标准签名如下,建议检查你的代码中其他函数是否也存在类似问题:
- 初始化函数(必选):
def initialize(context):(注意:这个只有1个参数) - 盘前函数(可选):
def before_trading_start(context, data): - 盘中函数(必选):
def handle_data(context, data): - 盘后函数(可选):
def after_trading_end(context, data): - Tick数据函数(可选):
def tick_data(context, data):
只要将 after_trading_end 的参数修改为 (context, data),该报错即可解决。