🚀 AI 一键生成 ptrade 策略代码

PTrade 平台如何实时判断股票是否涨停或跌停?check_limit 函数详解

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

问题描述

如何判断一只股票现在是涨停还是跌停状态?

解决方案

在PTrade量化交易平台中,判断一只股票当前是否处于涨停或跌停状态,主要有两种方法:一种是使用专门的交易状态查询函数 check_limit(推荐在实盘交易中使用),另一种是通过获取行情快照 get_snapshot 对比最新价与涨跌停价格(通用性更强)。

以下是具体的实现方式和代码示例。

方法一:使用 check_limit 函数(推荐实盘)

这是PTrade提供的原生接口,专门用于查询股票的涨跌停状态。它不仅能判断是否涨停,还能区分是“封死涨停”还是“触板涨停”(即价格到了涨停价但还有卖单)。

接口说明:
check_limit(security)

返回值说明(int类型):

  • 2: 触板涨停(价格已达涨停价,但卖一档仍有挂单,未封死)
  • 1: 涨停(封死)
  • 0: 既不涨停也不跌停
  • -1: 跌停(封死)
  • -2: 触板跌停(价格已达跌停价,但买一档仍有挂单,未封死)

代码示例:

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 获取涨跌停状态
    # 返回的是一个字典,key是股票代码,value是状态码
    limit_status_dict = check_limit(g.security)
    
    # 容错处理,防止获取失败
    if limit_status_dict:
        status = limit_status_dict.get(g.security, 0)
        
        if status == 1:
            log.info("股票 %s 当前处于封死涨停状态" % g.security)
        elif status == 2:
            log.info("股票 %s 当前处于触板涨停状态(未封死)" % g.security)
        elif status == -1:
            log.info("股票 %s 当前处于封死跌停状态" % g.security)
        elif status == -2:
            log.info("股票 %s 当前处于触板跌停状态(未封死)" % g.security)
        else:
            log.info("股票 %s 当前状态正常" % g.security)

方法二:使用 get_snapshot 对比价格

通过获取行情的实时快照,直接比较“最新成交价”与“涨停价”或“跌停价”。这种方法逻辑直观,且可以在回测不支持 check_limit 的情况下作为替代方案(注意:get_snapshot 在部分回测模式下可能不可用,需根据具体环境选择)。

逻辑:

  • 涨停:last_px (最新价) >= up_px (涨停价)
  • 跌停:last_px (最新价) <= down_px (跌停价)

代码示例:

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:
        info = snapshot[g.security]
        
        # 获取价格数据
        last_price = info.get('last_px')
        up_limit_price = info.get('up_px')
        down_limit_price = info.get('down_px')
        
        # 确保数据有效
        if last_price and up_limit_price and down_limit_price:
            # 判断涨停
            # 注意:浮点数比较建议使用极小误差范围,但在PTrade中直接比较通常可行
            if last_price >= up_limit_price:
                log.info("股票 %s 价格达到涨停价: %s" % (g.security, last_price))
            
            # 判断跌停
            elif last_price <= down_limit_price:
                log.info("股票 %s 价格达到跌停价: %s" % (g.security, last_price))
            
            else:
                log.info("股票 %s 价格正常: %s" % (g.security, last_price))

总结

  1. 实盘交易:首选 check_limit,因为它能区分“触板”和“封死”状态,对于打板策略或避险策略非常重要。
  2. 数据精度:PTrade后台已对价格精度做了处理,但在进行价格比较时(方法二),务必确保使用的是同一只股票的快照数据。
  3. 适用范围check_limit 仅在交易模块可用。如果在研究或非tick级回测中需要判断历史涨跌停,通常使用 get_history 获取日线的 high_limitlow_limit 字段与收盘价进行对比。

Q&A

Q: check_limit 函数在回测中可以使用吗?
A: check_limit 主要设计用于交易模块(实盘或模拟盘)。在普通的回测模式下,建议通过对比价格的方式来判断,或者查阅文档确认当前回测环境是否支持该特定交易函数。

Q: 为什么 check_limit 返回的状态码有 2 和 -2?
A: 状态码 2 和 -2 代表“触板”状态。这意味着最新成交价已经达到了涨停或跌停板的价格,但在买一或卖一档位上仍有对手单,尚未形成“封单”。这对于高频交易或打板策略来说是捕捉市场强弱转换的关键信号。

Q: 如何在回测历史数据中判断某一天是否涨停?
A: 在回测历史数据时(非实时),可以使用 get_history 函数获取日线数据,其中包含 high_limit(涨停价)和 low_limit(跌停价)字段。如果当天的 close 等于 high_limit,则判定为当日收盘涨停。