问题描述
启动量化交易策略后,交易不运行!
解决方案
在 ptrade 量化平台中,启动策略后发现交易不运行(例如 handle_data 不触发、没有委托下单)是初学者常遇到的问题。这通常与交易时间、运行周期设置、代码异常或参数配置有关。以下是详细的排查指南:
1. 检查是否在有效交易时间内
ptrade 的事件驱动引擎严格依赖于交易时间:
- 非交易日:在周末或法定节假日,
handle_data是不会触发的(除非在回测中且有历史数据,但实盘/模拟盘绝对不触发)。 - 盘中时间:
handle_data在股票交易场景下的执行时间为 9:30 -- 14:59。如果在盘前(如 9:15)或盘后查看,策略自然不会有盘中动作。
2. 检查策略运行周期(频率)设置
策略保存或启动时,需要选择运行频率(日线、分钟、tick):
- 日线级别:每天只运行一次。实盘交易中,默认运行时间通常为尾盘(如 14:50,具体由券商配置)。如果你在早上启动了一个日线策略,它要等到尾盘才会执行
handle_data。 - 分钟级别:每分钟运行一次(每根分钟K线结束时)。
- Tick级别:需要使用
tick_data或run_interval函数,handle_data无法处理 tick 级别的盘中高频逻辑。
3. 检查代码是否发生异常(报错终止)
如果代码中存在语法错误、数据获取失败(如返回 None 后直接调用其属性)或除以零等错误,策略会直接终止运行。
排查方法:
- 查看日志:仔细检查 ptrade 平台右侧或底部的运行日志,寻找红色的
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}")
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')
💡 终极调试建议:
在 initialize、before_trading_start 和 handle_data 的第一行加上 log.info("函数已触发")。通过观察日志中打印了哪些信息,就能快速定位策略是在哪一步“卡住”的。