🚀 AI 一键生成 ptrade 策略代码
立即体验
👉 AI 生成代码 👈

ptrade 平台如何实现在集合竞价时段检测一字涨停封单量?

ptrade | 发布时间: 2026/6/1
以下内容由 EasyQuant 生成。

问题描述

ptrade能在竞价时段内检测一字开盘每个tick封单吗

解决方案

可以实现,但需要注意接口的使用限制和行情权限。

在 ptrade 中,直接使用 tick_data 事件函数是无法在集合竞价时段(9:15-9:25)获取数据的,因为官方文档明确指出 tick_data 的执行时间为 9:30 -- 14:59

为了在集合竞价时段内检测一字开盘的封单量,你需要采用 run_interval 定时任务 + get_snapshot 行情快照 的组合方案。同时,获取详细的委托队列和笔数需要券商开通 Level-2 行情权限

实现思路

  1. 定时触发:在 initialize 中使用 run_interval 设置每 3 秒执行一次的定时任务。
  2. 获取快照:在定时任务函数中调用 get_snapshot 获取实时盘口数据。
  3. 状态过滤:通过快照数据中的 trade_status 字段判断当前是否处于集合竞价阶段(OCALL 代表开始集合竞价)。
  4. 涨停判断与封单提取:对比 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

注意事项

  1. Level-2 行情依赖:如果没有 L2 行情,get_snapshot 返回的 bid_grp 依然会有基本的买一价和买一量,但无法获取委托笔数和前50笔的详细委托队列。
  2. 盘前数据为空:在 9:15 之前的 PRETR(盘前)阶段,get_snapshot 返回的大部分数据(如成交量、当前价格等)均为 0,策略中需做好异常值过滤(如 last_px > 0)。
  3. 频率限制run_interval 最小支持 3 秒运行一次,这已经能满足绝大多数竞价阶段的 tick 级监控需求。