🚀 AI 一键生成 qmt 策略代码

QMT 编程指南:如何在策略中获取当前运行周期 (Period)?

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

问题描述

怎么在策略里判断当前是日线还是分钟线?

解决方案

在 QMT 策略中,可以通过读取 ContextInfo 对象的 period 属性来判断当前策略运行的周期。

核心方法

使用 ContextInfo.period 获取当前周期字符串。

返回值说明:

  • 日线:返回 '1d'
  • 分钟线:返回 '1m' (1分钟), '3m' (3分钟), '5m' (5分钟), '15m' (15分钟), '30m' (3分钟) 等
  • 其他'1h' (小时线), '1w' (周线), '1mon' (月线) 等

代码示例

以下代码展示了如何在 inithandlebar 中判断当前是日线还是分钟线,并执行不同的逻辑。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 获取当前周期
    period = ContextInfo.period
    print("当前策略运行周期为: " + period)
    
    # 在初始化时判断
    if period == '1d':
        ContextInfo.is_daily = True
        print(">>> 检测到日线周期,执行日线初始化逻辑")
    elif period.endswith('m'):
        ContextInfo.is_daily = False
        print(">>> 检测到分钟周期,执行分钟线初始化逻辑")
    else:
        ContextInfo.is_daily = False
        print(">>> 其他周期: " + period)

def handlebar(ContextInfo):
    # 获取当前周期
    period = ContextInfo.period
    
    # 判断逻辑
    if period == '1d':
        # 日线策略逻辑
        if ContextInfo.is_new_bar():
            print(f"[{period}] 日线逻辑运行中...")
            # 这里写日线交易逻辑
            
    elif period in ['1m', '3m', '5m', '15m', '30m']:
        # 分钟线策略逻辑
        if ContextInfo.is_new_bar():
            print(f"[{period}] 分钟线逻辑运行中...")
            # 这里写分钟线交易逻辑
            
    # 通用逻辑:判断是否包含 'm' 字符来概括所有分钟周期
    if 'm' in period and period != '1mon': # 排除 1mon (月线)
        pass # 分钟级别通用处理

Q&A

Q: ContextInfo.period 的值是哪里设置的?
A: 这个值取决于你在运行策略时设置的“默认周期”。如果是回测,是在“回测参数”中设置的主图周期;如果是实盘或模拟盘,取决于你在界面上选择的运行周期或图表周期。

Q: 能否在代码中动态修改 ContextInfo.period
A: 不能。ContextInfo.period 是一个只读属性,它反映的是策略启动时的环境配置。如果需要获取不同周期的数据(例如在日线策略中获取分钟数据),应该使用 ContextInfo.get_market_data_ex 并指定 period 参数,而不是修改全局周期。

Q: 如何区分 1 分钟线和 1 月线?
A: 1 分钟线返回的是 '1m',而月线返回的是 '1mon'。在编写判断逻辑时(特别是使用 endswith('m') 这种模糊匹配时),需要注意区分 '1mon' 这种情况。建议使用精确匹配(如 if period == '1m':)或列表匹配(如 if period in ['1m', '5m']:)。