`klines` 可以写在循环外,是因为 `api.get_kline_serial()` 返回的是一个会被 TqSdk 持续更新的 DataFrame 引用。只要后面不断调用 `api.wait_update()`,这个 `klines` 对象里的数据会原地刷新。
但 `short_avg = ma(klines[“close”], SHORT)`、`long_avg = ma(…)` 这类指标计算结果不是实时引用,而是“当时根据 klines 算出来的一份结果”。如果把它们也放在循环外,只会算一次,后续 `klines` 更新了,已经算好的 `short_avg/long_avg` 不会自动重新计算。
所以常见写法是:先在循环外调用一次 `api.get_kline_serial(…)` 订阅并拿到 `klines`;然后在 `while True` 里持续 `api.wait_update()`;当 `api.is_changing(klines.iloc[-1], “datetime”)` 为真时,再用当前的 `klines[“close”]` 重新计算 `short_avg` 和 `long_avg`。
简单说:`klines` 是订阅到的实时数据容器,放外面创建一次;均线是基于当前数据的计算结果,需要在数据变化后重新计算。

有其他问题欢迎加入官方Q群748265037一起交流