while True 主循环空转耗 CPU:天勤 is_changing 对象级与字段级对照
前言国内期货量化程序常见结构是whileTrue:api.wait_update()# 这里写策略wait_update是天勤TqSdk等待期货行情与交易回报并更新内存数据的函数。循环本身不应删除——期货 tick 在交易时段持续到来程序要一直“听着”。读者若发现 CPU 很高、日志很多但成交并没增加往往是# 这里写策略写得过宽把“任意行情跳动”都当成“要重算策略”。天勤提供api.is_changing(对象, 字段名)判断这一帧数据更新是否包含某字段变化。本文用对照表说明对象级与字段级差别并联系期货 K 线里的datetime由get_kline_serial返回的表中的时间列非本地计时。一、期货场景里“一帧”指什么每次wait_update()返回 True或有数据更新表示天勤合并了一批业务 diff可能是螺纹钢最新价变了可能是某张委托 status 变了也可能是 5 分钟 K 线表里当前根的 high/low 变了。一帧不是“一秒”而是一次包合并后的更新周期活跃合约上一秒可以有多帧。策略要问的是我关心的那类变化是否发生在这一帧is_changing回答的就是这个。二、对照表写法何时为 True直观对 5 分钟 K 线策略的影响is_changing(kl)表内任一列变极易每帧进入CPU 高is_changing(kl.iloc[-1], datetime)当前根时间标签变大约每 5 分钟进一次is_changing(quote)quote 任字段变tick 级极高频is_changing(quote, last_price)最新价变tick 级is_changing(pos)持仓任字段变成交回报时is_changing(pos, pos_long)多头手数变低频适合记日志三、改写示例改前/改后/含义改前每一帧都可能跑完整均线策略——在期货日盘活跃品种上相当于每秒上百次运算。whileTrue:api.wait_update()ifapi.is_changing(kl):run_strategy()改后仅当 K 线表声明“新一根 bar 开始”最后一行datetime变才跑——datetime由行情/K 线服务写入标志当前根的时间身份发生变化。whileTrue:api.wait_update()ifapi.is_changing(kl.iloc[-1],datetime):run_strategy_on_close()# 内部用 iloc[-2]run_strategy_on_close里应用iloc[-2]的收盘价做突破或均线判断与“对象级过滤”配套。四、调试触发次数是否合理在run_strategy入口计数交易时段跑 10 分钟若 5 分钟策略触发上百次说明过滤仍太宽若触发次数约为分钟数/5则合理。五、与 wait_update(deadline) 的关系deadline用于“长时间无包时返回”解决心跳与挂起检测不能替代字段过滤降 CPU。降 CPU 靠减少进入策略的次数。总结while True 空转耗 CPU在国内期货程序化里多半是is_changing用了对象级过滤。应改为字段级K 线策略盯kl.iloc[-1]的datetime盘口策略盯quote的指定字段持仓日志盯pos_long/pos_short。datetime来自天勤 K 线表不是本地 sleep弄清这一点才能写对“新 bar”触发。把每一帧当作一次决策机会是期货 tick 环境里最贵的写法。FAQ1不设字段何时有用极少调试时可临时观察。2多合约每个 symbol 的 kl 分别判断 datetime。3回测适用吗适用历史回放同样产生多帧。4list 字段is_changing(quote, [last_price,ask_price1])任一变即为 True。风险提示本文讨论性能不构成投资建议。