问题描述
在周末使用ptrade进行测试,但是不打印日志,这个时候要怎么进行测试呢?
解决方案
在周末或节假日使用 ptrade 进行策略测试时,经常会遇到不打印日志的情况。这主要是因为 ptrade 的事件驱动机制在非交易日的行为与交易日不同。以下是导致该问题的原因及相应的测试与调试方法:
为什么周末测试不打印日志?
handle_data不执行:根据 ptrade 的底层逻辑,handle_data函数不会在非交易日触发。因此,如果你把打印日志的代码写在handle_data中,周末运行时是不会有任何输出的。- 节假日参数配置:在交易模块中,
before_trading_start函数的执行受配置参数影响。如果设置了holiday_not_do_before="1",则节假日也不会执行盘前函数。
周末如何进行策略测试和调试?
要在周末进行代码逻辑的测试和日志打印,可以采用以下几种替代方案:
方法一:在 initialize 中进行一次性测试
initialize 函数在策略启动时必定会执行一次,不受交易日限制。你可以将需要测试的逻辑(如获取历史数据、财务数据、股票基础信息等)放在这里进行打印。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 在初始化中直接测试并打印日志
log.info("周末测试:策略初始化启动")
stock_info = get_stock_info(g.security)
log.info(f"获取股票信息:{stock_info}")
方法二:确保 before_trading_start 在节假日执行
默认情况下,before_trading_start 在节假日是执行的(holiday_not_do_before="0")。你可以将测试代码放在该函数中。如果之前修改过参数,请确保将其改回默认值。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 确保节假日执行盘前函数(0为执行,1为不执行)
set_parameters(holiday_not_do_before="0")
def before_trading_start(context, data):
log.info("周末测试:盘前函数触发")
# 在这里编写你的测试逻辑
history_data = get_history(5, '1d', 'close', g.security)
log.info(f"历史数据:\n{history_data}")
方法三:使用 run_interval 定时触发(仅限交易模块)
如果你需要在周末模拟盘中持续运行的逻辑,可以使用 run_interval 函数。它会按照设定的时间间隔(秒)周期性运行,不受交易日限制。
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 每10秒执行一次测试函数
run_interval(context, weekend_test_func, seconds=10)
def weekend_test_func(context):
log.info("周末测试:定时任务触发")
# 注意:周末获取实时行情(如 get_snapshot)可能返回周五的收盘数据或空数据
snapshot = get_snapshot(g.security)
log.info(f"行情快照:{snapshot}")
def handle_data(context, data):
pass # 周末不会执行
周末测试的注意事项
- 行情数据滞后:周末获取的实时行情(如
get_snapshot、get_gear_price)通常是上一个交易日(周五)的收盘数据。 - 委托下单无效:周末调用
order等交易接口报单到柜台,通常会被直接拒单或处于“待报”状态,无法真实成交。 - 回测模式:如果你只是想验证策略逻辑,强烈建议使用回测模式而不是模拟交易模式。在回测模式下,你可以指定任意历史时间段,系统会模拟当时的交易日环境,
handle_data会正常触发,日志也会正常打印。