问题描述
/
解决方案
结论
可以的。
在 ptrade 平台中,你完全可以通过 run_daily 函数设置一个盘前的时间点(例如 time='09:15' 或 time='09:25')来调用 get_sort_msg 函数。
技术原理解析
run_daily的时间支持:根据 ptrade API 文档,在交易场景下,run_daily的time参数可设置范围是00:00~23:59。这意味着你可以将定时任务设定在盘前的任意时刻。- 盘前运行机制:文档中明确指出,9:30 之前为盘前运行时间,交易环境支持运行在
run_daily中指定交易时间(如time='09:15')运行的函数。 get_sort_msg的可用性:get_sort_msg属于交易模块可用的函数,并没有严格限制只能在handle_data(盘中) 或after_trading_end(盘后) 触发。
盘前调用的注意事项(重要)
虽然技术上允许在盘前调用,但你需要特别注意数据的有效性和业务逻辑的合理性:
- 数据状态:如果在 9:15 之前调用,当天的集合竞价尚未开始,你获取到的板块/行业涨幅排名实际上是上一个交易日的最终排名数据。
- 集合竞价期间:如果在 9:15 ~ 9:25 集合竞价期间调用,获取到的可能是基于集合竞价撮合价格计算出的临时涨幅排名。这个数据在 9:25 之前是动态变化的,可能不够稳定。
- 返回值解析:
get_sort_msg返回的数据结构中包含preclose_px(昨日收盘价)、open_px(今日开盘价)、last_px(最新价) 等。在盘前阶段,open_px可能为 0 或者等于preclose_px,trade_status(交易状态) 可能是PRETR(盘前) 或OCALL(集合竞价)。
代码示例
以下是一个在盘前(9:25 集合竞价结束时)通过 run_daily 调用 get_sort_msg 的示例:
def initialize(context):
g.security = '000001.SZ'
set_universe(g.security)
# 设定在每天 9:25 集合竞价结束时获取板块排名
run_daily(context, get_pre_market_sort_msg, time='09:25')
def get_pre_market_sort_msg(context):
# 获取概念板块(XBHS.GN)的涨幅排名信息
sort_data = get_sort_msg(sort_type_grp='XBHS.GN', sort_field_name='px_change_rate', sort_type=1, data_count=10)
if sort_data:
log.info("盘前(9:25)概念板块涨幅排名前三:")
for i in range(min(3, len(sort_data))):
log.info(f"Top {i+1}: {sort_data[i]['prod_name']} - 涨幅: {sort_data[i]['px_change_rate']}%")
else:
log.info("盘前未能获取到有效的板块排名数据")
def handle_data(context, data):
pass
总结:你可以通过 run_daily 在盘前调用 get_sort_msg,这在编写“集合竞价抓强势板块”等策略时非常有用,但务必清楚此时获取到的数据所代表的市场状态(昨日数据或集合竞价数据)。