🚀 AI 一键生成 ptrade 策略代码

PTrade API 实战:如何实现盘后固定价交易?(after_trading_order)

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

问题描述

我想在收盘后以收盘价买入一些股票,应该怎么操作?

解决方案

在PTrade中,如果您希望在收盘后以收盘价买入股票(通常指科创板和创业板的盘后固定价格交易),可以使用 after_trading_order 函数。

核心逻辑

  1. 交易时间:盘后固定价格交易时间通常为 15:05 至 15:30。因此,我们需要使用 run_daily 将交易函数安排在 15:00 之后执行(例如 15:15)。
  2. 获取收盘价:在 15:00 收盘后,通过 get_snapshot 获取当天的最新价(即收盘价)。
  3. 下单接口:使用 after_trading_order(security, amount, entrust_price) 进行委托。注意,价格必须严格等于收盘价,否则委托无效。

策略代码实现

以下是一个完整的策略示例,展示了如何在盘后阶段以收盘价买入指定股票。

def initialize(context):
    """
    初始化函数
    """
    # 设置要操作的股票,这里以一只科创板股票为例
    # 注意:盘后固定价格交易主要适用于科创板(688)和创业板(300)
    g.security = '688001.SS'
    set_universe(g.security)
    
    # 设置定时任务,在交易日的 15:15 执行盘后交易逻辑
    # 盘后固定价格交易时段一般为 15:05-15:30
    run_daily(context, after_hours_trade, time='15:15')

def after_hours_trade(context):
    """
    盘后交易执行函数
    """
    stock = g.security
    
    # 获取实时行情快照
    # 注意:get_snapshot 仅在交易模块可用,回测模式下可能不支持或行为不同
    snapshot = get_snapshot(stock)
    
    if snapshot and stock in snapshot:
        # 获取最新价,在15:00之后,last_px 即为当日收盘价
        close_price = snapshot[stock].get('last_px')
        
        # 确保价格有效
        if close_price and close_price > 0:
            # 打印日志
            log.info("当前股票 %s 收盘价为: %s,准备进行盘后固定价申报" % (stock, close_price))
            
            # 下单买入 200 股
            # 参数说明:股票代码,数量(正数买入),委托价格(必须是收盘价)
            order_id = after_trading_order(stock, 200, float(close_price))
            
            if order_id:
                log.info("盘后委托成功,订单ID: %s" % order_id)
            else:
                log.info("盘后委托失败")
        else:
            log.info("获取收盘价失败或价格无效")
    else:
        log.info("获取行情快照失败")

def handle_data(context, data):
    """
    盘中运行函数,此处留空,因为我们只在盘后操作
    """
    pass

关键点说明

  1. 适用范围
    • after_trading_order 主要用于科创板创业板的盘后固定价格交易。
    • 主板股票通常没有这种机制(除非是大宗交易,但大宗交易API不同)。
  2. 价格精度
    • 传入的 entrust_price 必须是浮点数(float),且必须等于当天的收盘价。
  3. 运行环境
    • 此功能主要用于实盘仿真交易环境。
    • 在回测模式下,get_snapshot 可能无法获取数据(回测通常使用 data[security]['close']),且盘后撮合逻辑取决于回测引擎的配置。
  4. 撤单
    • 如果需要撤销盘后固定价委托,请使用 after_trading_cancel_order 函数。

Q&A

Q: 为什么我在回测中调用 get_snapshot 报错或返回空?
A: get_snapshot 是获取实时L1/L2行情的接口,通常仅在**交易(实盘/仿真)**模块可用。在回测中,您应该使用 data[security]['close']get_history 来获取价格数据。

Q: 主板股票(600xxx, 000xxx)可以使用这个策略吗?
A: 通常不可以。沪深主板目前没有像科创板/创业板那样的“盘后固定价格交易”时段(15:05-15:30)。主板在15:00收盘后即停止竞价交易。如果您需要在收盘时成交,建议在 14:57 左右使用 order_targetorder 配合市价单或限价单参与尾盘集合竞价

Q: after_trading_order 的成交原则是什么?
A: 盘后固定价格交易遵循“时间优先”的原则。即按照申报时间先后顺序进行撮合,成交价格固定为当日收盘价。如果当日该股票没有成交(如全天停牌)或收盘价无法确定,则无法进行盘后固定价格交易。