shinnytech / tqsdk-python

天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易

Home Page:https://doc.shinnytech.com/tqsdk/latest

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

实盘获取K线时,会获取到未完结的K线。

UtorYeung opened this issue · comments

需求:
在实盘策略运行时,只获取已完结的1分钟K线,避免由于未完结的1分钟数据的盘中变动导致信号闪烁的问题。


问题1:
获取1分钟数据时,会出现最后一条是未完结的1分钟K线。

e.g.
10:05:16时,通过api.get_kline_serial(symbol, 60)获取数据:
2023-08-08 10:03:00 3981.2189 ... 3993.4 235
2023-08-08 10:04:00 3980.7730 ... 3991.4 236
2023-08-08 10:05:00 3980.7730 ... 3990.2 237

最后一条数据为10:05-10:06的1分钟线,但此时(10:05:16)该1分钟线尚未完结,所以此数据不应该出现数据列。


问题2:
对于问题1的处理,官方方案貌似是用api.is_changing(quote.iloc[-1], "datetime"),通过判断最后一条数据的datetime是否有变化来判断是否生成新的1分钟线。
但这种做法会衍生出新的问题,那就是在11:30:00、15:00:00的时候,api.is_changing(quote.iloc[-1], "datetime")不会推送11:29-11:30、 14:59-15:00的1分钟线,因为此时datetime没有变化。

11:30:00
2023-08-08 11:27:00 3981.2189 ... 3993.4 235
2023-08-08 11:28:00 3980.7730 ... 3991.4 236
2023-08-08 11:29:00 3980.7730 ... 3990.2 237

15:00:00
2023-08-08 14:57:00 3981.2189 ... 3993.4 235
2023-08-08 14:58:00 3980.7730 ... 3991.4 236
2023-08-08 14:59:00 3980.7730 ... 3990.2 237


问题3:
如果不用官方方案api.is_changing()来判断,而通过datetime.now()-quote.iloc[-1, "datetime"]>=timedelta(seconds=60)来判断,
则会出现“本地服务器校时标准与天勤服务器校时标准不一致”、“网络延迟”等原因导致timedelta误差变动的问题。


建议:
在get_kline_serial增加is_finished的bool字段,显示当前K线是否已完结。
通过api.is_changing(quote.iloc[-1], "is_finished")来判断上一条K线是否结束,从而自动更新。