3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 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: 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']:)。