94 浏览
0

如上案例,为什么 short_avg 等这类指标一定要写在 api.wait_update 下面 ?如果和 klines 写在一起,数值就无法更新;
而为什么 klines 就可以直接写在外面?

chaos 已回答的问题 10小时 前
0

`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` 是订阅到的实时数据容器,放外面创建一次;均线是基于当前数据的计算结果,需要在数据变化后重新计算。

chaos 发表新评论 10小时 前

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

您正在查看1个答案中的1个,单击此处查看所有答案。