🚀 AI 一键生成 ptrade 策略代码

PTrade 高级行情:如何获取并解析买一档委托队列 (bid_grp)?

ptrade | 发布时间: 2025/12/21
以下内容由 EasyQuant 生成。

问题描述

如何获取行情快照中买一档的详细委托队列数据?

解决方案

在PTrade中,获取行情快照中买一档(Bid 1)的详细委托队列数据,需要使用 get_snapshot 函数。

核心步骤

  1. 调用 get_snapshot(security) 获取行情快照。
  2. 访问返回字典中的 bid_grp(委买档位)字段。
  3. 访问 bid_grp 中的键 1(代表买一档)。
  4. 买一档的数据是一个列表,格式为 [价格, 委托量, 委托笔数, 委托队列字典]委托队列位于列表的第4个位置(索引为3)

注意事项

  • Level-2 权限:委托队列数据仅在开通了 Level-2 行情的环境下才会有数据推送。如果是普通行情,该位置可能为空或不存在。
  • 数据结构:委托队列是一个字典(dict),Key通常为档位或序号,Value为该笔委托的数量。

代码实现

以下是一个完整的策略示例,展示如何在 handle_data 中提取买一档的委托队列:

def initialize(context):
    # 设置一只股票,例如恒生电子
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 获取行情快照
    snapshot = get_snapshot(g.security)
    
    # 判空处理,确保获取到了数据
    if snapshot and g.security in snapshot:
        stock_data = snapshot[g.security]
        
        # 获取委买档位信息
        # bid_grp 结构: {1: [价格, 量, 笔数, {队列}], 2: [...], ...}
        if 'bid_grp' in stock_data:
            bid_grp = stock_data['bid_grp']
            
            # 获取买一档信息 (Key为整数1)
            if 1 in bid_grp:
                bid_1_info = bid_grp[1]
                
                # 打印买一价格和总量
                log.info("买一价格: %s, 买一总量: %s" % (bid_1_info[0], bid_1_info[1]))
                
                # 检查是否存在委托队列数据 (索引3)
                # 注意:仅L2行情支持,且列表长度需大于3
                if len(bid_1_info) > 3:
                    bid_queue = bid_1_info[3]
                    log.info("买一委托队列详情: %s" % bid_queue)
                    
                    # 遍历队列示例(如果需要处理具体每一笔)
                    # for idx, volume in bid_queue.items():
                    #     log.info("队列序号: %s, 委托量: %s" % (idx, volume))
                else:
                    log.info("未获取到买一委托队列(可能无L2权限或当前无队列数据)")

数据结构解析

根据API文档,bid_grp 中买一档(Key=1)的数据结构如下:

[
    41.88,  # 索引0: 价格 (float)
    1200,   # 索引1: 委托总量 (int)
    0,      # 索引2: 委托笔数 (int)
    {       # 索引3: 委托队列 (dict) - 仅L2支持
        1: 200, 
        2: 500, 
        3: 500
    }
]

Q&A

Q: 为什么我获取到的买一档列表长度只有3,没有第4个元素?
A: 这通常是因为您的账号没有开通 Level-2 行情权限。普通行情快照只包含价格、总量和笔数(部分普通行情笔数也可能为0),不包含详细的逐笔委托队列。

Q: 如何获取卖一档的委托队列?
A: 方法类似,只需将代码中的 bid_grp 替换为 offer_grp(委卖档位),然后同样访问键 1(卖一档)的第4个元素(索引3)。

Q: 回测模式下能获取到委托队列吗?
A: 通常情况下,回测模式使用的是历史K线或Tick数据,get_snapshot 在回测中可能不支持或仅返回模拟的快照数据。委托队列这种高频细节数据通常仅在 交易(实盘/仿真) 模式下且对接了L2行情源时才可用。

Q: 委托队列字典里的 Key 代表什么?
A: 委托队列字典(如 {1: 33200, 2: 104800})中的 Key 通常代表该价位上委托单的排队顺序(序号),Value 代表该笔委托的股数。