3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!您遇到的情况在 QMT 平台中是完全正常的。这主要是因为对 QMT 的行情驱动机制以及这两个函数的具体定义存在一些理解上的偏差。下面为您详细梳理。
handlebar?根据 QMT 的底层运行机制,handlebar(ContextInfo) 是一个行情事件驱动函数:
handlebar。handlebar 就会被调用一次。因此,在盘中实时运行中,handlebar 确实是每个 Tick 都会触发一次,这是为了让策略能够实时监控盘口变化,而不是等到 K 线走完才反应。
is_last_bar() 的理解last_bar。is_last_bar() 的意思是**“当前运行的这根 K 线,是否是图表上的最新一根(最后一根)K 线”**。
True。is_last_bar() 都会返回 True。is_new_bar() 的理解new_bar。is_new_bar() 会返回 True。在这根 K 线后续到来的所有 Tick 中,它都会返回 False。通常,我们在实盘策略中,为了避免在历史 K 线上重复发单,并且控制在盘中只在特定时机(如新 K 线产生时)执行逻辑,会这样组合使用:
def handlebar(ContextInfo):
# 1. 确保当前是盘中最新的一根 K 线(过滤掉历史 K 线的计算)
if not ContextInfo.is_last_bar():
return
# 2. 确保当前是这根新 K 线的第一个 Tick
if ContextInfo.is_new_bar():
print(f"新 K 线产生了!当前时间:{ContextInfo.get_bar_timetag(ContextInfo.barpos)}")
# 在这里编写您的交易逻辑、指标计算等
# 这样一根 K 线只会执行一次
def handlebar(ContextInfo):
# 过滤历史 K 线
if not ContextInfo.is_last_bar():
return
# 获取最新 Tick 数据
tick_data = ContextInfo.get_full_tick([ContextInfo.stockcode])
if ContextInfo.stockcode in tick_data:
last_price = tick_data[ContextInfo.stockcode]['lastPrice']
# 每个 Tick 都会判断价格是否突破
if last_price > 10.00:
print("价格突破,执行下单!")
# 注意:这里需要配合全局变量控制,防止同一个 Tick 或同一根 K 线内重复下单
handlebar 盘中逐 Tick 触发是 QMT 的底层设计,为了保证实时性。is_last_bar() 判断的是**“是否处于最新的一根 K 线”**,盘中始终为 True。is_new_bar() 判断的是**“是否是当前 K 线的第一个 Tick”**,每根 K 线只有一次为 True。passorder 机制就是:在当前 K 线最后一个 Tick 信号成立时,在下一根 K 线的第一个 Tick 发出委托。如果您想在当前 K 线未走完就下单,需要设置 passorder 的 quickTrade=1 或 quickTrade=2 参数。