期货策略 tick 与 K 线一起用:订阅顺序与触发规则怎么定
前言
国内期货行情有两层常用粒度:一是 tick(每笔或每次盘口更新,在 quote 的last_price、买卖价量上体现);二是 K 线(按 1 分钟、5 分钟等把价格合成 OHLC,表里有datetime列标记每根 bar 的时间)。有的策略“大方向看 5 分钟 K 线,入场看 tick 突破”;有的“K 线收盘定方向,下单看对价盘口”。若两套节奏没有写进文档,就会出现:K 线还没收盘 tick 已开仓、或 K 线已信号 tick 过滤又把单挡住,两套逻辑互相打架。
下面说明在同一策略里同时用 tick 与 K 线时,先订什么、谁触发谁、主循环怎么组织,基于天勤 TqSdk 的get_quote与get_kline_serial,并给出可落地的分层触发示例。
一、先理解两个数据从哪来
quote=api.get_quote("SHFE.rb2510")# tick/盘口级,字段随 wait_update 更新kl=api.get_kline_serial("SHFE.rb2510",300,data_length=200)# 300秒=5分钟K线- quote:
last_price、bid_price1、ask_price1等在交易时段随成交和挂单变化。 - kl:每一行一根 K 线;
datetime由行情服务写入,当新 5 分钟 bar 生成时,最后一行datetime会变(配合is_changing判断)。
两者都依赖api.wait_update()才会更新;没有 wait_update,任何一层都是旧数据。
二、订阅顺序:先 quote 再 K 线或反之?
天勤里订阅顺序通常不强制,但建议在策略启动时一次性订齐本策略需要的 quote 与 kl,并至少一次wait_update()等到有效datetime和非 nan 的last_price,再进入主循环。避免在循环里反复新建订阅。
多合约时:每个 symbol 各一对quote+kl,不要共用一个 quote 变量。
三、推荐:分层触发,明确主从
原则:K 线层定“是否允许交易方向”,tick 层定“是否在这一刻下单”。
示例流程(5 分钟趋势 + tick 对价过滤):
- 仅当
is_changing(kl.iloc[-1], "datetime")时,用iloc[-2]更新方向缓存allow_long/allow_short。 - 每个循环
wait_update后,若方向不允许,直接 continue,不读 tick 下单逻辑。 - 若方向允许,再用
is_changing(quote, "last_price")或盘口价差判断,满足才set_target_volume。
bias={"long":False,"short":False}whileTrue:api.wait_update()ifapi.is_changing(kl.iloc[-1],"datetime"):# 用 [-2] 更新 5 分钟趋势 biasc,m=kl.close.iloc[-2],tafunc.ma(kl.close,20).iloc[-2]bias["long"]=c>m bias["short"]=c<mifnot(bias["long"]orbias["short"]):continueifapi.is_changing(quote,"last_price"):spread=quote.ask_price1-quote.bid_price1ifspread>2*quote.price_tick:continue# 点差过大不下ifbias["long"]:task.set_target_volume(1)切忌:用每个 tick 重算 5 分钟均线(应用上一节的 datetime 触发);切忌:K 线未更新方向却每个 tick 开平仓。
四、tick 级策略若也要参考 K 线
若主逻辑是 tick,K 线只作过滤(例如“只在 5 分钟均线多头时做 tick 突破”),仍应 K 线 datetime 变时更新缓存,tick 触发时只读缓存,不要每 tick 重算整段 K 线指标。
五、执行层注意
TargetPosTask在wait_update里发单;tick 触发频繁时,避免每个 tick 都set_target_volume改目标(会频繁撤单)。可设“本 5 分钟 bar 只 set 一次”或“目标不变不重复 set”。
总结
tick 和 K 线并用本身没有问题,问题通常出在两套节奏缺少明确主从关系,最后导致重复触发或错过该做与不该做的时机。把 K 线放在“方向/过滤”层,用 datetime 变更来更新缓存;把 tick 放在“进入/执行”层,用 quote 字段做当前时点的细节判断,并在同一个 wait_update 主循环里串起来。这样一来,策略的行为会从“看起来很忙”变成“有节奏、可复盘”:你能解释为什么某分钟触发、为什么某 tick 没触发,也能在回放与实盘对照时快速定位差异来自哪里。
FAQ
1)dur_sec=0 是 tick 吗?
实时用 quote;历史 tick 下载见 DataDownloader 的 dur_sec=0(专业版能力)。
2)能否只订 K 线不订 quote?
执行要价格时仍建议订 quote,尤其用 ACTIVE 对价下单。
3)多周期 K 线 + tick?
每个周期独立 datetime 缓存,再统一 tick 入场,见多周期专题。
4)回测 tick+K 线?
逻辑可一致,回测帧密度与实盘不同,需模拟验证。
风险提示
本文讨论程序结构,不构成投资建议。
