问题描述
解决方案
在 PTrade 策略中,获取股票当前的最新价格、涨跌停价以及盘口挂单(买一卖一)信息,主要使用 get_snapshot(security) 函数。
该函数返回一个字典,包含了指定标的的实时行情快照数据。
代码实现
以下是一个完整的策略示例,展示了如何在 handle_data 或 tick_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]
# 1. 获取最新价
current_price = stock_data.get('last_px')
# 2. 获取涨跌停价
up_limit = stock_data.get('up_px') # 涨停价
down_limit = stock_data.get('down_px') # 跌停价
# 3. 获取买一、卖一挂单信息
# bid_grp 和 offer_grp 是字典,key为档位(1-5或1-10),value为列表 [价格, 数量, 笔数]
bid_grp = stock_data.get('bid_grp')
offer_grp = stock_data.get('offer_grp')
# 提取买一 (key为1)
bid_1_price = 0.0
bid_1_volume = 0
if bid_grp and 1 in bid_grp:
bid_1_info = bid_grp[1]
bid_1_price = bid_1_info[0] # 价格
bid_1_volume = bid_1_info[1] # 数量
# 提取卖一 (key为1)
ask_1_price = 0.0
ask_1_volume = 0
if offer_grp and 1 in offer_grp:
ask_1_info = offer_grp[1]
ask_1_price = ask_1_info[0] # 价格
ask_1_volume = ask_1_info[1] # 数量
# 打印日志查看结果
log.info("股票: %s" % g.security)
log.info("最新价: %s" % current_price)
log.info("涨停价: %s, 跌停价: %s" % (up_limit, down_limit))
log.info("买一价: %s, 买一量: %s" % (bid_1_price, bid_1_volume))
log.info("卖一价: %s, 卖一量: %s" % (ask_1_price, ask_1_volume))
关键字段说明
get_snapshot 返回的数据字典中,关键字段如下:
last_px: 最新成交价(float)。up_px: 涨停价格(float)。down_px: 跌停价格(float)。bid_grp: 委买档位信息。- 格式为字典:
{1: [价格, 数量, 笔数], 2: [...], ...} - 获取买一价:
bid_grp[1][0] - 获取买一量:
bid_grp[1][1]
- 格式为字典:
offer_grp: 委卖档位信息。- 格式同上。
- 获取卖一价:
offer_grp[1][0] - 获取卖一量:
offer_grp[1][1]
注意事项
- 适用环境:
get_snapshot函数主要用于 交易(实盘/仿真) 模块。在普通的回测模式(日线/分钟线)下,通常无法获取实时的盘口挂单(买一卖一)数据,回测中一般只能获取 OHLC(开高低收)数据。 - 盘前数据:在
before_trading_start阶段调用此函数,大部分数据(如成交量、换手率等)可能为 0,因为市场尚未开盘。 - 数据保护:在访问
bid_grp或offer_grp时,建议先判断字典是否为空以及 key 是否存在,以防止在某些极端行情(如跌停板可能没有买单)下报错。