🚀 AI 一键生成 qmt 策略代码
立即体验
👉 AI 生成代码 👈

QMT量化平台中检测K线最后一个分笔(Tick)的方法与技巧

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

ContextInfo有没有可以检测K线最后一个分笔的方法?

比如,30 分钟 K 线,检测最后一个分笔到来的方法

解决方案

在 QMT 平台的实时行情驱动机制中,并没有直接提供一个方法来“预知”当前到来的分笔(Tick)是否是当前 K 线的最后一个分笔。因为在实时交易中,系统无法提前知道在当前 K 线周期结束前是否还会有新的 Tick 到来(除非是收盘的最后一个 Tick)。

不过,在实际的量化策略编写中,我们通常有以下几种替代方案来实现“在 K 线走完时执行逻辑”的需求:

方案一:使用 ContextInfo.is_new_bar()(推荐)

既然无法准确捕捉当前 K 线的最后一个 Tick,我们可以在下一根 K 线的第一个 Tick 到来时进行判断。当新 K 线的第一个 Tick 到来时,意味着上一根 K 线已经完全走完。

QMT 提供了 ContextInfo.is_new_bar() 方法,当某根 K 线的第一个 Tick 数据到来时,该方法返回 True

def init(ContextInfo):
    # 设置股票池
    ContextInfo.set_universe(['000001.SZ'])

def handlebar(ContextInfo):
    # 确保只在实时行情的最后一根 K 线上运行
    if not ContextInfo.is_last_bar():
        return
        
    # 当新的一根 K 线产生时(即上一根 30 分钟 K 线刚走完)
    if ContextInfo.is_new_bar():
        print("上一根 K 线已走完,当前是新 K 线的第一个 Tick!")
        # 在这里执行你需要在 K 线走完时触发的逻辑
        # 注意:此时获取的当前 K 线数据已经是新的一根 K 线了
        # 如果需要上一根 K 线的数据,可以通过获取历史数据并取倒数第二根(索引为 -2)

方案二:利用 QMT 默认的交易机制

如果你检测最后一个 Tick 的目的是为了确认信号并下单,那么你完全不需要手动去检测。QMT 的运行机制默认就是这样设计的:

在盘中,最后一根 K 线每变动一次,handlebar 函数被执行一次。这根 K 线的最后一个 Tick 判定模型信号是否成立,如果模型信号成立,交易函数被调用,则在下一根 K 线的第一个 Tick 发出下单信号,生成下单任务。

只要你在调用下单函数(如 passorder)时,将 quickTrade 参数设置为 0(默认值),QMT 就会自动帮你处理“K 线走完才确认信号并下单”的逻辑。

方案三:通过时间戳精确判断(适用于特定时间点)

如果你必须在当前 K 线结束前的最后几秒钟内执行操作(例如为了避免跨周期滑点),你可以通过获取当前 Tick 的时间戳,并与 K 线的理论结束时间进行对比。

def init(ContextInfo):
    ContextInfo.set_universe(['000001.SZ'])

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
        
    # 获取当前 Tick 的时间戳(毫秒)
    tick_time = ContextInfo.get_tick_timetag()
    # 转换为 HHMMSS 格式的整数
    int_time = int(timetag_to_datetime(tick_time, '%H%M%S'))
    
    # 假设是 30 分钟 K 线,结束时间点可能是 10:00:00, 10:30:00, 11:00:00 等
    # 我们可以判断当前时间是否在结束前的 3 秒内(例如 09:59:57 到 09:59:59)
    if int_time in [95957, 95958, 95959, 102957, 102958, 102959, 105957, 105958, 105959, 112957, 112958, 112959, 132957, 132958, 132959, 135957, 135958, 135959, 142957, 142958, 142959, 145957, 145958, 145959]:
        print(f"当前时间 {int_time},接近 30 分钟 K 线结束!")
        # 执行相关逻辑,如使用 do_order(ContextInfo) 提前触发下单

总结:

  • 推荐使用 ContextInfo.is_new_bar() 来处理“K 线走完”的逻辑。
  • 如果是为了下单,直接依赖 QMT 默认的 quickTrade=0 机制即可。
  • 如果需要提前抢跑,可以通过解析 ContextInfo.get_tick_timetag() 的时间来实现。