🚀 AI 一键生成 qmt 策略代码

QMT 策略开发:如何在代码中区分回测环境与实盘环境?

qmt | 发布时间: 2025/12/30
以下内容由 EasyQuant 生成。

问题描述

如何在策略代码里判断当前是回测还是实盘?

解决方案

在 QMT 的 Python 策略代码中,可以通过 ContextInfo 对象的 do_back_test 属性来判断当前策略是处于回测模式还是实盘/模拟运行模式

核心方法

使用 ContextInfo.do_back_test 布尔值属性:

  • True:表示当前处于回测模式(利用历史数据进行回测)。
  • False:表示当前处于实盘模拟交易模式(利用实时行情驱动)。

代码示例

以下是一个完整的策略示例,展示了如何在 init 初始化函数和 handlebar 行情驱动函数中进行判断:

# -*- coding: gbk -*-

def init(ContextInfo):
    """
    初始化函数
    """
    # 判断当前运行模式
    if ContextInfo.do_back_test:
        print("【系统提示】当前处于:回测模式")
        # 在回测模式下,可以设置特定的参数,例如资金、费率等
        ContextInfo.capital = 1000000  # 设置回测初始资金
        ContextInfo.set_slippage(1, 0.01) # 设置回测滑点
    else:
        print("【系统提示】当前处于:实盘/模拟运行模式")
        # 在实盘模式下,通常需要绑定资金账号
        # ContextInfo.set_account('您的资金账号') 

def handlebar(ContextInfo):
    """
    K线/行情驱动函数
    """
    # 也可以在盘中逻辑里判断,例如只在实盘打印某些日志
    if not ContextInfo.do_back_test:
        # 仅在实盘模式下打印当前Bar的时间,避免回测日志过多
        index = ContextInfo.barpos
        timetag = ContextInfo.get_bar_timetag(index)
        print(f"实盘运行中,当前时间戳: {timetag}")
        
    # 策略核心逻辑...
    return

详细说明

  1. 属性性质ContextInfo.do_back_test 是一个只读属性,由系统在策略启动时自动赋值,用户无法在代码中修改它。
  2. 应用场景
    • 参数隔离:回测时使用一套激进的参数,实盘时使用保守参数。
    • 账号设置:回测时使用虚拟资金(ContextInfo.capital),实盘时绑定真实资金账号(ContextInfo.set_account)。
    • 日志控制:回测速度很快,产生大量日志可能导致界面卡顿,可以通过此标志限制回测时的 print 输出频率。
    • 数据获取:某些特定的数据接口可能仅在实盘有效(如实时推送),或者回测时需要预取历史数据,可以通过此标志区分处理逻辑。

Q&A

Q: ContextInfo.do_back_test 为 False 时,一定是在用真金白银交易吗?
A: 不一定。False 仅代表策略是在“运行模式”(Run Mode)下,即基于实时行情驱动。这包括了“模拟交易”和“实盘交易”。要区分模拟和实盘,通常取决于您在 QMT 界面上选择的账号类型以及是否勾选了“实盘”选项,代码层面通常统一处理为实时运行。

Q: 能否在 handlebar 之外的函数中使用这个属性?
A: 可以。只要能访问到 ContextInfo 对象的地方都可以使用。例如在自定义的函数中,只要将 ContextInfo 作为参数传递进去即可读取该属性。

Q: 回测模式下 ContextInfo.do_back_test 会在运行过程中改变吗?
A: 不会。在一次策略生命周期内,该属性的值是固定的。