🚀 AI 一键生成 qmt 策略代码

QMT 策略技巧:如何实现策略预热(跳过前 N 根 K 线)?

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

问题描述

怎么让策略在前 N 根 K 线不交易?

解决方案

在 QMT 策略中,可以通过判断 ContextInfo.barpos(当前 K 线索引)的值来实现前 N 根 K 线不交易。

ContextInfo.barpos 是一个从 0 开始递增的整数,代表当前 K 线在历史数据中的位置。

实现逻辑

  1. init 函数中定义一个变量(例如 ContextInfo.skip_count),用于设置需要跳过的 K 线数量。
  2. handlebar 函数的最开始,判断 ContextInfo.barpos 是否小于 ContextInfo.skip_count
  3. 如果条件成立,直接 return,不执行后续的交易逻辑。

完整代码示例

以下是一个完整的策略示例,设定为跳过前 20 根 K 线:

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置需要跳过的 K 线数量,例如 20 根
    ContextInfo.skip_count = 20
    
    # 设置股票池(示例)
    ContextInfo.set_universe(['600000.SH'])
    
    print("策略初始化完成,将跳过前 {} 根 K 线".format(ContextInfo.skip_count))

def handlebar(ContextInfo):
    # 获取当前 K 线索引
    current_bar_index = ContextInfo.barpos
    
    # 判断是否在前 N 根 K 线范围内
    if current_bar_index < ContextInfo.skip_count:
        # 如果是,打印日志并直接返回,不执行后续交易逻辑
        print(f"当前 K 线索引: {current_bar_index},处于跳过阶段,不交易。")
        return

    # ----------------------------------------------------------------
    # 下方为正式交易逻辑,只有当 barpos >= skip_count 时才会执行
    # ----------------------------------------------------------------
    
    # 获取当前主图代码
    stock_code = ContextInfo.stockcode
    
    # 示例:简单的打印,代表交易逻辑开始运行
    print(f"当前 K 线索引: {current_bar_index},已过观察期,开始执行交易逻辑...")
    
    # 获取最新价
    last_price = ContextInfo.get_market_data(['close'], stock_code=[stock_code], count=1, period='1d')
    
    # 这里可以编写具体的买卖信号逻辑
    # 例如:passorder(...)

代码解析

  1. ContextInfo.skip_count = 20: 在初始化时定义参数,方便后续修改。
  2. ContextInfo.barpos: 这是 QMT 的内置属性。策略运行时,第一根 K 线的 barpos 为 0,第二根为 1,以此类推。
  3. if current_bar_index < ContextInfo.skip_count::
    • barpos 为 0 到 19 时(共 20 根),条件成立,执行 return,函数结束。
    • barpos 为 20 时,条件不成立,程序继续向下执行,进入正式交易逻辑。

常见问题 (Q&A)

Q: 为什么要跳过前 N 根 K 线?
A: 通常用于计算某些需要历史数据的指标(如 MA60 需要前 60 根数据才能计算出第一个有效值)。如果在数据不足时进行计算或交易,可能会导致报错或产生错误的信号。

Q: ContextInfo.barpos 是从 0 开始还是从 1 开始?
A: ContextInfo.barpos 是从 0 开始计数的。

Q: 这个逻辑在回测和实盘中都有效吗?
A: 是的,该逻辑在回测和实盘(包括模拟盘)中均有效。在实盘中,如果历史 K 线数量足够多,barpos 通常会很大,不会触发跳过逻辑;如果是刚启动且数据加载较少,则会根据加载的 K 线数量进行判断。