3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 实盘交易中,遇到 get_full_tick 返回滞后数据(如 11:01 获取到 10:50 的价格)导致错误止损,确实非常令人痛心。这种情况通常与本地行情缓存未及时更新或未显式订阅行情有关。
get_full_tick 会返回不准确(滞后)的数据?get_full_tick 函数的底层逻辑是直接读取 QMT 客户端本地缓存的最新分笔数据。如果出现数据滞后,通常有以下几个原因:
handlebar 默认由主图品种的 tick 驱动,如果主图品种有 tick 而目标股票没有 tick 更新,此时调用 get_full_tick 拿到的就是目标股票上一次的旧数据。为了避免这种“卖飞”的悲剧再次发生,建议对策略的数据获取方式进行以下优化:
在使用 get_full_tick 之前,确保已经使用 subscribe_quote 对目标股票进行了行情订阅。这样可以强制客户端保持该股票数据的实时更新。
def init(ContextInfo):
# 显式订阅目标股票的 tick 行情
ContextInfo.subscribe_quote('002984.SZ', period='tick', dividend_type='none', callback=on_quote)
def on_quote(datas):
# 可以在回调中处理实时数据,或者仅用于保持数据活跃
pass
def handlebar(ContextInfo):
# 此时再调用 get_full_tick,数据滞后的概率会大幅降低
tick_data = ContextInfo.get_full_tick(['002984.SZ'])
if '002984.SZ' in tick_data:
last_price = tick_data['002984.SZ']['lastPrice']
print(f"最新价格: {last_price}")
get_market_data_ex 替代相比于 get_full_tick,get_market_data_ex 提供了内置的订阅开关 subscribe=True,在获取数据的同时会自动处理订阅逻辑,数据可靠性更高。
def handlebar(ContextInfo):
# 使用 get_market_data_ex 获取最新 1 分钟或 tick 数据,并开启 subscribe=True
data = ContextInfo.get_market_data_ex(
fields=['close'],
stock_code=['002984.SZ'],
period='1m', # 或者 'tick'
count=1,
subscribe=True # 关键参数:强制订阅最新数据
)
if '002984.SZ' in data and not data['002984.SZ'].empty:
last_price = data['002984.SZ']['close'].iloc[-1]
print(f"最新价格: {last_price}")
在执行止损、止盈等关键交易动作前,增加对数据时间戳的校验。如果发现数据的时间戳与当前系统时间相差过大(例如超过 10 秒),则拒绝执行交易,等待下一个有效 tick。
import time
def handlebar(ContextInfo):
# 获取当前系统时间戳(毫秒)
current_time = int(time.time() * 1000)
# 获取主图最新 tick 的时间戳作为参考
tick_timetag = ContextInfo.get_tick_timetag()
# 如果主图 tick 时间与当前时间脱节过大,说明整体行情可能卡顿,暂停交易
if abs(current_time - tick_timetag) > 10000: # 10秒
print("行情可能延迟,暂停关键交易动作")
return
# 继续执行获取价格和止损逻辑...
实盘中绝对不能完全信任未经订阅的本地缓存数据。对于需要精确触发止损的策略,务必使用 subscribe_quote 或 get_market_data_ex(subscribe=True) 来确保数据的实时性,并在代码中加入时间戳校验的防错逻辑,以保护本金安全。