ptrade能在竞价时段内检测一字开盘每个tick封单吗
问题描述
解决方案
可以实现,但需要注意接口的使用限制和行情权限。
在 ptrade 中,直接使用 tick_data 事件函数是无法在集合竞价时段(9:15-9:25)获取数据的,因为官方文档明确指出 tick_data 的执行时间为 9:30 -- 14:59。
为了在集合竞价时段内检测一字开盘的封单量,你需要采用 run_interval 定时任务 + get_snapshot 行情快照 的组合方案。同时,获取详细的委托队列和笔数需要券商开通 Level-2 行情权限。
实现思路
- 定时触发:在
initialize中使用run_interval设置每 3 秒执行一次的定时任务。 - 获取快照:在定时任务函数中调用
get_snapshot获取实时盘口数据。 - 状态过滤:通过快照数据中的
trade_status字段判断当前是否处于集合竞价阶段(OCALL代表开始集合竞价)。 - 涨停判断与封单提取:对比
last_px(最新价)与up_px(涨停价),如果相等,则读取bid_grp(委买档位)中买一档的委托量(即封单量)。
Python 源码示例
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 设置每3秒运行一次的定时任务,用于高频检测
run_interval(context, check_auction_limit_up, seconds=3)
def check_auction_limit_up(context):
# 获取当前时间,实际策略中可加入时间判断,仅在 09:15:00 - 09:25:00 之间执行核心逻辑
snapshot = get_snapshot(g.security)
if snapshot and g.security in snapshot:
data = snapshot[g.security]
trade_status = data.get('trade_status')
# OCALL 表示开始集合竞价
if trade_status == 'OCALL':
up_px = data.get('up_px', 0)
last_px = data.get('last_px', 0)
# 判断是否达到涨停价(一字涨停)
if last_px > 0 and last_px == up_px:
bid_grp = data.get('bid_grp', {})
if 1 in bid_grp:
# bid_grp 结构: {1: [价格, 委托量, 委托笔数, 委托队列{}]}
# 注意:委托笔数和委托队列需要 L2 行情支持
bid_price = bid_grp[1][0]
bid_vol = bid_grp[1][1]
log.info(f"【集合竞价】{g.security} 触及涨停!当前买一价: {bid_price}, 封单量: {bid_vol}")
def handle_data(context, data):
pass
注意事项
- Level-2 行情依赖:如果没有 L2 行情,
get_snapshot返回的bid_grp依然会有基本的买一价和买一量,但无法获取委托笔数和前50笔的详细委托队列。 - 盘前数据为空:在 9:15 之前的
PRETR(盘前)阶段,get_snapshot返回的大部分数据(如成交量、当前价格等)均为 0,策略中需做好异常值过滤(如last_px > 0)。 - 频率限制:
run_interval最小支持 3 秒运行一次,这已经能满足绝大多数竞价阶段的 tick 级监控需求。