🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 平台如何使用 is_trade() 实现回测与实盘代码完美兼容?(附 Python 源码)

ptrade | 发布时间: 2026/8/8
以下内容由 EasyQuant 生成。

问题描述

ptrade API 详解:如何使用 is_trade 实现回测实盘代码兼容
如何用同一个 ptrade 策略代码,在回测时打印‘回测’,在实盘时执行特定的‘实盘’逻辑?

解决方案

ptrade API 详解:使用 is_trade() 实现回测与实盘代码完美兼容

在量化交易中,我们经常面临一个痛点:回测代码和实盘代码不统一。有些 API(如获取实时行情快照 get_snapshot、获取 L2 逐笔数据等)只能在实盘/模拟盘环境中使用,如果在回测中直接调用会导致策略报错中断。为了解决这个问题,ptrade 提供了 is_trade() 函数。


一、is_trade() 函数介绍

1. 接口说明

is_trade() 用于提供业务代码执行场景的判断依据,明确标识当前策略运行在回测环境还是实盘/模拟盘环境。通过它,我们可以将两套逻辑写在同一个策略文件中,实现“一套代码,双端运行”。

2. 返回值

  • True (bool):当前代码在实盘/模拟盘交易中运行。
  • False (bool):当前代码在回测中运行。

二、为什么要使用 is_trade()?

  1. 规避回测报错:实盘专用的函数(如 get_snapshotget_gear_pricecheck_limit 等)在回测中调用会报错。使用 is_trade() 进行分支判断,可以确保回测顺利通过。
  2. 差异化风控与通知:在实盘中,我们可能需要发送微信通知(send_qywx)或邮件提醒(send_email),而在回测中则不需要这些操作。
  3. 简化代码维护:无需维护“回测版”和“实盘版”两套代码,降低版本管理出错的概率。

三、完整兼容性策略源码示例

以下代码展示了如何使用 is_trade()。在回测时,策略会打印“当前运行场景:回测”并使用历史数据;在实盘时,策略会打印“当前运行场景:实盘”,并调用实盘专用的 get_snapshot 获取最新行情进行下单。

def initialize(context):
    # 初始化策略,设置操作的股票池
    g.security = '600570.SS'  # 恒生电子
    set_universe(g.security)

def handle_data(context, data):
    # 1. 使用 is_trade() 判断当前运行环境
    if is_trade():
        # ------------------ 实盘/模拟盘特有逻辑 ------------------
        log.info("当前运行场景:实盘")
        
        # 获取实盘专用的行情快照(回测调用此接口会报错,因此必须放在 is_trade() 分支内)
        snapshot = get_snapshot(g.security)
        if snapshot and g.security in snapshot:
            current_price = snapshot[g.security].get('last_px', 0)
            log.info("【实盘最新价】: %s" % current_price)
            
            # 执行实盘下单逻辑
            if current_price > 0:
                order(g.security, 100)
    else:
        # ------------------ 回测特有逻辑 ------------------
        log.info("当前运行场景:回测")
        
        # 回测中使用 data 对象获取当前周期的收盘价
        current_price = data[g.security]['close']
        log.info("【回测当前价】: %s" % current_price)
        
        # 执行回测下单逻辑
        order(g.security, 100)

四、开发注意事项

  • 初始化阶段限制is_trade() 可以在 handle_databefore_trading_startafter_trading_end 等盘中、盘前、盘后事件中自由调用。
  • 代码整洁性:建议将实盘特有的复杂逻辑封装成独立函数,在 if is_trade(): 分支中进行调用,使主循环 handle_data 结构更加清晰。