🚀 AI 一键生成 ptrade 策略代码

ptrade 启动量化交易策略后不运行的排查与解决方法

ptrade | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

量化交易不运行!

启动量化交易策略后,交易不运行!

解决方案

在 ptrade 量化平台中,启动策略后发现交易不运行(例如 handle_data 不触发、没有委托下单)是初学者常遇到的问题。这通常与交易时间、运行周期设置、代码异常或参数配置有关。以下是详细的排查指南:

1. 检查是否在有效交易时间内

ptrade 的事件驱动引擎严格依赖于交易时间:

  • 非交易日:在周末或法定节假日,handle_data 是不会触发的(除非在回测中且有历史数据,但实盘/模拟盘绝对不触发)。
  • 盘中时间handle_data 在股票交易场景下的执行时间为 9:30 -- 14:59。如果在盘前(如 9:15)或盘后查看,策略自然不会有盘中动作。

2. 检查策略运行周期(频率)设置

策略保存或启动时,需要选择运行频率(日线、分钟、tick):

  • 日线级别:每天只运行一次。实盘交易中,默认运行时间通常为尾盘(如 14:50,具体由券商配置)。如果你在早上启动了一个日线策略,它要等到尾盘才会执行 handle_data
  • 分钟级别:每分钟运行一次(每根分钟K线结束时)。
  • Tick级别:需要使用 tick_datarun_interval 函数,handle_data 无法处理 tick 级别的盘中高频逻辑。

3. 检查代码是否发生异常(报错终止)

如果代码中存在语法错误、数据获取失败(如返回 None 后直接调用其属性)或除以零等错误,策略会直接终止运行。
排查方法

  • 查看日志:仔细检查 ptrade 平台右侧或底部的运行日志,寻找红色的 ErrorException 信息。
  • 增加异常处理:在关键逻辑处添加 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}")

4. 检查股票池(Universe)是否为空

如果你的股票池没有正确设置,或者设置的股票代码格式错误(如缺少 .SS.SZ 尾缀),handle_data 中的 data 字典可能为空,导致后续逻辑被跳过。

  • 确保在 initialize 中正确调用了 set_universe
def initialize(context):
    g.security = '600570.SS' # 确保带有正确的市场尾缀
    set_universe(g.security)

5. 检查特殊参数配置(如服务器重启拉起)

如果你在 initialize 中使用了 set_parameters,请检查是否设置了阻止策略运行的参数:

  • not_restart_trade="1":如果交易时间段服务器重启,设置为 1 将不执行重新拉起本交易。
  • holiday_not_do_before="1":节假日不执行 before_trading_start

6. 检查定时任务(run_daily / run_interval)的时间设置

如果你使用了 run_daily,请检查设定的时间是否已经过去,或者格式是否正确:

def initialize(context):
    # 确保时间格式正确,如 '09:31'
    run_daily(context, my_func, time='09:31') 

💡 终极调试建议
initializebefore_trading_starthandle_data 的第一行加上 log.info("函数已触发")。通过观察日志中打印了哪些信息,就能快速定位策略是在哪一步“卡住”的。