shinnytech / tqsdk-python

天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易
https://doc.shinnytech.com/tqsdk/latest
Apache License 2.0
3.57k stars 648 forks source link

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

Open UtorYeung opened 1 year ago

UtorYeung commented 1 year ago

需求: 在实盘策略运行时,只获取已完结的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线是否结束,从而自动更新。