3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade中,获取当日涨跌停价格的方法取决于您当前的运行环境(回测还是实盘交易)。
为了获取“最准确”的数据:
get_snapshot,直接获取交易所推送的实时快照数据,包含精准的 up_px (涨停价) 和 down_px (跌停价)。get_history 获取日线级别的 high_limit (涨停价) 和 low_limit (跌停价)。以下是详细的代码实现方案,包含了一个兼容两种模式的通用函数。
def initialize(context):
# 设置股票池,以恒生电子为例
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 调用获取涨跌停价格的函数
up_limit, down_limit = get_current_limit_price(g.security)
if up_limit and down_limit:
log.info("股票: %s, 今日涨停价: %s, 今日跌停价: %s" % (g.security, up_limit, down_limit))
else:
log.info("未能获取到 %s 的涨跌停价格" % g.security)
def get_current_limit_price(security):
"""
兼容回测和实盘的获取涨跌停价格函数
返回: (涨停价, 跌停价)
"""
# 1. 实盘交易模式 (最准确,实时快照)
if is_trade():
# 获取实时快照
snapshot = get_snapshot(security)
if snapshot and security in snapshot:
info = snapshot[security]
# up_px: 涨停价, down_px: 跌停价
return info.get('up_px'), info.get('down_px')
# 2. 回测模式 (使用历史日线数据)
else:
# 注意:涨跌停价格通常只存在于日线('1d')数据中
# 获取当天的日线数据,包含 high_limit 和 low_limit
hist = get_history(1, '1d', ['high_limit', 'low_limit'], security, fq=None, include=True)
if hist is not None and len(hist) > 0:
# 获取最后一行数据(即当天)
limit_up = hist['high_limit'][-1]
limit_down = hist['low_limit'][-1]
return limit_up, limit_down
return None, None
get_snapshot)在实盘中,get_snapshot(security) 返回的是交易所的实时行情快照。这是最准确的数据源,因为它直接反映了柜台/交易所当前的状态。
up_px: 涨停价格 (float)down_px: 跌停价格 (float)get_history)回测不支持 get_snapshot,必须通过历史行情接口获取。
get_history(count, frequency='1d', field=['high_limit', 'low_limit'], ...)'1d' (日线)。分钟级别的历史数据通常不包含涨跌停字段。high_limit: 涨停价low_limit: 跌停价include=True 以包含当前回测日的数据。Q: 为什么在回测中不能用 get_snapshot?
A: get_snapshot 是设计用于获取实时行情的接口,回测环境是基于历史数据的模拟,系统底层不支持在回测中调用此接口。
Q: 创业板和科创板的涨跌幅限制会自动处理吗?
A: 是的。无论是 get_snapshot 还是 get_history,返回的都是交易所计算好的具体价格数值(如20%涨跌幅后的价格),您不需要自己去乘以1.1或1.2,直接使用返回的价格即可,这样能避免精度计算误差。
Q: get_price 可以用来获取涨跌停价吗?
A: 可以。get_price 与 get_history 类似,在日线频率下也支持 high_limit 和 low_limit 字段。但在策略编写中,get_history 通常用于获取截止到当前时刻的数据,使用起来更符合策略逻辑。