问题描述
解决方案
在 QMT 策略中,可以通过读取 ContextInfo 对象的 period 属性来判断当前策略运行的周期。
核心方法
使用 ContextInfo.period 获取当前周期字符串。
返回值说明:
- 日线:返回
'1d' - 分钟线:返回
'1m'(1分钟),'3m'(3分钟),'5m'(5分钟),'15m'(15分钟),'30m'(3分钟) 等 - 其他:
'1h'(小时线),'1w'(周线),'1mon'(月线) 等
代码示例
以下代码展示了如何在 init 和 handlebar 中判断当前是日线还是分钟线,并执行不同的逻辑。
# -*- 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']:)。