问题描述
解决方案
在 QMT 策略中,可以通过判断 ContextInfo.barpos(当前 K 线索引)的值来实现前 N 根 K 线不交易。
ContextInfo.barpos 是一个从 0 开始递增的整数,代表当前 K 线在历史数据中的位置。
实现逻辑
- 在
init函数中定义一个变量(例如ContextInfo.skip_count),用于设置需要跳过的 K 线数量。 - 在
handlebar函数的最开始,判断ContextInfo.barpos是否小于ContextInfo.skip_count。 - 如果条件成立,直接
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(...)
代码解析
ContextInfo.skip_count = 20: 在初始化时定义参数,方便后续修改。ContextInfo.barpos: 这是 QMT 的内置属性。策略运行时,第一根 K 线的barpos为 0,第二根为 1,以此类推。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 线数量进行判断。