Python 期货策略怎么判断一根新 K 线已经生成
2026/6/5 1:45:56 网站建设 项目流程

前言

用 Python 写 K 线策略时,最容易踩的坑是:把还在跳动的当前根当成已收盘,一根 bar 里信号闪好几次。判断“新 K 线来了”要同时理解DataFrame 里哪一行是正在形成的 bar,以及哪一帧该做决策

天勤get_kline_serial返回的 K 线与is_changing配合,是团队里很常用的写法。下面说明iloc[-1]iloc[-2]的含义、如何用datetime变化触发、以及和指标计算怎么对齐。

一、K 线 DataFrame 里两行最关键

索引含义是否还在变
iloc[-1]当前这根,随行情更新是,high/low/close 都会变
iloc[-2]上一根,在下一根未出现前已定格否(对已走完的那根)

因此:趋势类信号若定义在收盘价上,应在iloc[-2]上判断;触发计算的时机是“新一根开始出现”,即iloc[-1]datetime相对上一帧发生变化。

二、官方对 is_changing 的 K 线说明

TqApi.is_changing文档写明:当生成新 K 线时,其所有字段都算作有更新,此时对klines.iloc[-1]is_changing一定返回 True。

实战里更稳的是盯最后一根的datetime字段:

fromtqsdkimportTqApi,TqAuth,TqSim,tafunc api=TqApi(TqSim(),auth=TqAuth("账户","密码"))kl=api.get_kline_serial("SHFE.rb2510",300,data_length=200)whileTrue:api.wait_update()ifnotapi.is_changing(kl.iloc[-1],"datetime"):continue# 走到这里:新 K 线刚生成,上一根刚收盘ma20=tafunc.ma(kl.close,20)close_done=kl.close.iloc[-2]ma_done=ma20.iloc[-2]

datetime变化为真时,iloc[-2]就是刚收盘的那根,适合做一次决策。

三、和“用 [-1] 算信号”的区别

有人图省事用iloc[-1]的 close,盘中会随着 tick 变,均线金叉可以闪十几次。回测若与实盘规则不一致(回测帧里 [-1] 有时等价于已完成 bar),曲线会好看很多、实盘却完全不对。

团队规范建议写死:本策略所有入场在[-2]判定,回测/模拟/实盘同一套代码。回测速度上统一[-2]也减少争论。

四、指标 nan 与 data_length

新 K 线触发时,若ma20.iloc[-2]仍是 nan,说明data_length不够或合约上市不久,应continue

importmathifmath.isnan(ma20.iloc[-2]):continue

get_kline_serial订阅后若再订阅同合约更短长度,服务器可能不重复推历史,内存 chart 与预期不符;遇到 K 线长度异常,检查订阅顺序(API 内部对 serial 更新有说明)。

五、多周期策略怎么判断

例如 5 分钟出信号、30 分钟过滤:

  • 各周期各订一条get_kline_serial
  • 分别is_changing(kl5.iloc[-1], "datetime")kl30
  • 大周期未更新时不要用旧的大周期[-2]冒充新状态

可在大周期datetime变化时,把当时大周期[-2]的指标缓存到变量,供小周期触发时读取。

六、tick 策略的边界

若策略必须在 tick 级反应,就不应再用 K 线datetime作为主触发,而要另写降频(如is_changing(quote, "last_price")加最小间隔)。K 线与 tick 混用时,必须规定以谁为准,否则同一策略两套节奏。

总结

判断新 K 线:在每次wait_update后用api.is_changing(kl.iloc[-1], "datetime")为真作为 bar 推进信号;决策数据用iloc[-2]表示刚收盘那根。避免用 [-1] 的 close 做收盘型突破,防止盘中反复下单和回测实盘偏差。

注意data_length、nan 跳过、多周期分别判断 datetime。tick 级策略另写触发规则,不要与 K 线收盘规则混用。

FAQ

1)回测里 datetime 变化频率和实盘一样吗?

回测按历史推送,触发逻辑相同即可;不要在回测里单独改成 [-1] 而实盘用 [-2]。

2)主连 KQ.m 判断方式相同吗?

仍是 serial 的 datetime 变化;换月时要单独处理合约切换,与 bar 判断正交。

3)夜盘跳空第一根算不算新 K 线?

算,只要 datetime 字段更新;策略里可加交易日过滤避免休市误触发。

4)能否用 K 线根数自增判断?

不推荐自己计数;以 API 更新的 datetime 为准更稳。

风险提示

本文讨论技术实现,不构成投资建议。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询