ptrade 回测取得某只当日盘中最高价每分钟执行怎么写
/
问题描述
解决方案
在 ptrade 平台进行分钟级别的回测时,handle_data 函数会每分钟执行一次。要获取某只股票当日盘中到目前为止的最高价,最有效的方法是利用全局变量 g 在每天开盘前进行重置,并在每分钟的 handle_data 中不断比较和更新最高价。
以下是完整的策略代码示例:
def initialize(context):
# 设置我们要操作的股票池
g.security = '600570.SS'
set_universe(g.security)
# 初始化当日最高价变量
g.daily_high = 0.0
def before_trading_start(context, data):
# 每天盘前运行,重置当日最高价为0
g.daily_high = 0.0
log.info('新交易日开始,重置当日最高价。')
def handle_data(context, data):
# 获取当前分钟K线的最高价
# data[security] 返回的是 SecurityUnitData 对象,包含 high 属性
current_minute_high = data[g.security].high
# 如果当前分钟的最高价大于记录的当日最高价,则更新
if current_minute_high > g.daily_high:
g.daily_high = current_minute_high
# 打印日志查看结果
log.info('当前时间: %s, 当前分钟最高价: %.2f, 截止目前的当日最高价: %.2f' %
(context.blotter.current_dt, current_minute_high, g.daily_high))
# 在这里可以编写你的交易逻辑,例如:
# if data[g.security].close < g.daily_high * 0.95:
# order_target(g.security, 0)
代码原理解析:
initialize函数:策略初始化时,设定目标股票并初始化全局变量g.daily_high。before_trading_start函数:该函数在每个交易日开盘前(回测中通常为 8:30)执行一次。在这里将g.daily_high重置为 0,确保每天的最高价都是独立计算的。handle_data函数:在分钟级回测中,该函数每分钟触发一次。data[g.security]包含了当前这一分钟的行情数据(SecurityUnitData对象),通过.high属性获取当前分钟的最高价。将其与g.daily_high进行比较,如果更大则覆盖更新。这样g.daily_high始终保存着当天开盘到当前分钟的最高价。
这种方法避免了每分钟都去调用 get_history 获取大量历史数据,极大地提高了回测的运行效率。