3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化平台中,启动策略后发现交易不运行(例如 handle_data 不触发、没有委托下单)是初学者常遇到的问题。这通常与交易时间、运行周期设置、代码异常或参数配置有关。以下是详细的排查指南:
ptrade 的事件驱动引擎严格依赖于交易时间:
handle_data 是不会触发的(除非在回测中且有历史数据,但实盘/模拟盘绝对不触发)。handle_data 在股票交易场景下的执行时间为 9:30 -- 14:59。如果在盘前(如 9:15)或盘后查看,策略自然不会有盘中动作。策略保存或启动时,需要选择运行频率(日线、分钟、tick):
handle_data。tick_data 或 run_interval 函数,handle_data 无法处理 tick 级别的盘中高频逻辑。如果代码中存在语法错误、数据获取失败(如返回 None 后直接调用其属性)或除以零等错误,策略会直接终止运行。
排查方法:
Error 或 Exception 信息。try...except 块,防止策略因偶发数据缺失而崩溃。def handle_data(context, data):
try:
# 尝试执行的交易逻辑
if '600570.SS' in data:
current_price = data['600570.SS']['close']
log.info(f"当前价格: {current_price}")
except Exception as e:
log.error(f"策略运行出现异常: {e}")
如果你的股票池没有正确设置,或者设置的股票代码格式错误(如缺少 .SS 或 .SZ 尾缀),handle_data 中的 data 字典可能为空,导致后续逻辑被跳过。
initialize 中正确调用了 set_universe。def initialize(context):
g.security = '600570.SS' # 确保带有正确的市场尾缀
set_universe(g.security)
如果你在 initialize 中使用了 set_parameters,请检查是否设置了阻止策略运行的参数:
not_restart_trade="1":如果交易时间段服务器重启,设置为 1 将不执行重新拉起本交易。holiday_not_do_before="1":节假日不执行 before_trading_start。如果你使用了 run_daily,请检查设定的时间是否已经过去,或者格式是否正确:
def initialize(context):
# 确保时间格式正确,如 '09:31'
run_daily(context, my_func, time='09:31')
💡 终极调试建议:
在 initialize、before_trading_start 和 handle_data 的第一行加上 log.info("函数已触发")。通过观察日志中打印了哪些信息,就能快速定位策略是在哪一步“卡住”的。