CTP tick数据合成K线的问题
文化财经K线规则观察
数据结构为:交易日、tick更新时间、合约代码、交易所代码、最新价、成交量、持仓量、今收盘、实际日期和tick时间的合并、实际日期和时间。
20230831,22:59:59,au2310,SHFE,462.16,37804,86216.0,1.7976931348623157e+308,2023-08-30 22:59:59,2023-08-30 22:59:59
20230831,22:59:59,au2310,SHFE,462.16,37804,86216.0,1.7976931348623157e+308,2023-08-30 22:59:59,2023-08-30 23:00:00
20230831,23:00:00,au2310,SHFE,462.16,37804,86216.0,1.7976931348623157e+308,2023-08-30 23:00:00,2023-08-30 23:00:00
20230831,23:00:00,au2310,SHFE,462.18,37810,86217.0,1.7976931348623157e+308,2023-08-30 23:00:00,2023-08-30 23:00:01
20230831,23:00:01,au2310,SHFE,462.16,37813,86216.0,1.7976931348623157e+308,2023-08-30 23:00:01,2023-08-30 23:00:01
20230831,23:00:01,au2310,SHFE,462.16,37814,86216.0,1.7976931348623157e+308,2023-08-30 23:00:01,2023-08-30 23:00:02
20230831,23:00:59,au2310,SHFE,462.16,37919,86228.0,1.7976931348623157e+308,2023-08-30 23:00:59,2023-08-30 23:00:59
20230831,23:01:00,au2310,SHFE,462.16,37919,86228.0,1.7976931348623157e+308,2023-08-30 23:01:00,2023-08-30 23:01:00
20230831,23:01:00,au2310,SHFE,462.16,37919,86228.0,1.7976931348623157e+308,2023-08-30 23:01:00,2023-08-30 23:01:01
20230831,23:01:01,au2310,SHFE,462.16,37919,86228.0,1.7976931348623157e+308,2023-08-30 23:01:01,2023-08-30 23:01:02
20230831,23:01:02,au2310,SHFE,462.16,37919,86228.0,1.7976931348623157e+308,2023-08-30 23:01:02,2023-08-30 23:01:02
20230831,23:01:02,au2310,SHFE,462.16,37919,86228.0,1.7976931348623157e+308,2023-08-30 23:01:02,2023-08-30 23:01:03
20230831,23:01:03,au2310,SHFE,462.14,37920,86228.0,1.7976931348623157e+308,2023-08-30 23:01:03,2023-08-30 23:01:03
20230831,23:01:03,au2310,SHFE,462.16,37921,86229.0,1.7976931348623157e+308,2023-08-30 23:01:03,2023-08-30 23:01:04
tick数据23点的第1笔价格 462.16,文华财经23点开始的K线,开盘价是 462.18,如果tick的01秒更新,上个数据正好是462.18。
tick的23:01第1笔462.16,文华财经462.14,这已经是tick的03秒的数据了。文华财经和通达信的数据有不一样的时候,但这里是一样的,哪里出了问题?
问题应该出在成交量上,23点后第一次成交量变化时价格为462.18。同样23:01的成交量变化时价格为462.14
CTP推送的tick数据是500毫秒一次的快照,所以无论是否有成交他都会推送,有成交量才能表明真实的tick,逻辑上没问题。
AP310属于郑交所
8:55开始集合竞价,8:59:00确认集合竞价,成交量出现。
文华财经开盘价是8928,所以集合竞价的结束就是开盘价,而不是9:00的第1笔tick
20230831,08:58:59,AP310,CZCE,8928.0,0,97754.0,0.0,2023-08-31 08:58:59,2023-08-31 08:58:59
20230831,08:59:00,AP310,CZCE,8928.0,679,97192.0,0.0,2023-08-31 08:59:00,2023-08-31 08:59:00
20230831,09:00:00,AP310,CZCE,8930.0,729,97194.0,0.0,2023-08-31 09:00:00,2023-08-31 09:00:00
tick的最后更新时间是14:59:59秒,今收盘无效值是0.0,出现有效值说明当天已经收盘,系统时间是15点后推送的今收盘。
7:30后和19:30后的数据,tick时间和系统时间差距很大,都是无效值。
20230905,14:59:59,AP310,CZCE,8793.0,38482,46677.0,0.0,2023-09-05 14:59:59,2023-09-05 14:59:59
20230905,14:59:59,AP310,CZCE,8793.0,38489,46671.0,0.0,2023-09-05 14:59:59,2023-09-05 15:00:00
20230905,14:59:59,AP310,CZCE,8793.0,38489,46671.0,8793.0,2023-09-05 14:59:59,2023-09-05 15:00:05
20230905,19:08:37,AP310,CZCE,8793.0,0,46671.0,0.0,2023-09-05 19:08:37,2023-09-05 19:41:34
20230906,19:08:37,AP310,CZCE,8793.0,0,46671.0,0.0,2023-09-06 19:08:37,2023-09-06 07:38:05
20230906,08:55:00,AP310,CZCE,8793.0,0,46671.0,0.0,2023-09-06 08:55:00,2023-09-06 08:55:00
rb2310属于上期所
20230831,20:59:00,rb2310,SHFE,3716.0,13904,1036877.0,1.7976931348623157e+308,2023-08-30 20:59:00,2023-08-30 20:59:01
20230831,21:00:00,rb2310,SHFE,3717.0,14719,1037067.0,1.7976931348623157e+308,2023-08-30 21:00:00,2023-08-30 21:00:01
20230831,21:00:01,rb2310,SHFE,3721.0,16266,1036485.0,1.7976931348623157e+308,2023-08-30 21:00:01,2023-08-30 21:00:01
20230905,14:59:59,rb2310,SHFE,3738.0,529186,626608.0,1.7976931348623157e+308,2023-09-05 14:59:59,2023-09-05 15:00:00
20230905,15:00:00,rb2310,SHFE,3739.0,529189,626605.0,1.7976931348623157e+308,2023-09-05 15:00:00,2023-09-05 15:00:01
20230905,15:00:00,rb2310,SHFE,3739.0,529189,626605.0,3739.0,2023-09-05 15:00:00,2023-09-05 15:00:02
20230905,15:21:20,rb2310,SHFE,3739.0,529201,626601.0,3739.0,2023-09-05 15:21:20,2023-09-05 15:21:21
20230906,22:59:59,rb2310,SHFE,3749.0,139556,611718.0,1.7976931348623157e+308,2023-09-05 22:59:59,2023-09-05 23:00:00
20230906,23:00:00,rb2310,SHFE,3749.0,139598,611688.0,1.7976931348623157e+308,2023-09-05 23:00:00,2023-09-05 23:00:00
20230906,23:00:00,rb2310,SHFE,3749.0000000000005,139598,611688.0,1.7976931348623157e+308,2023-09-06 23:00:00,2023-09-06 07:38:07
20230906,08:59:00,rb2310,SHFE,3748.0,139672,611640.0,1.7976931348623157e+308,2023-09-06 08:59:00,2023-09-06 08:59:01
20230906,09:00:00,rb2310,SHFE,3748.0,139675,611639.0,1.7976931348623157e+308,2023-09-06 09:00:00,2023-09-06 09:00:01
K线生成思路:
新的1分钟,并且成交量变化,则生成新K线。如果成交量没变化,即使是新的1分钟,也算在上个K线里。
由于当日收盘后不再出现成交量变化,所以碰到今收盘字段是有效值时,说明该K线已经完成了。
各个交易所的tick数据
上海期货交易所(SHFE):以rb2310为例
日盘收盘15:00:00的tick是有效数据,今收盘ClosePrice和结算价SettlementPrice也在15:00:00推送。中间休息前的收盘10:15:00是有效数据,夜盘收盘23:00:00是有效数据。这些时间的整点不属于新K线,而是上1分钟的K线。
怎么知道是有效数据?观察成交量和持仓量,然后跟文华财经的数据去对比就知道了。比如10:15只有1笔,不能算作新K线,而是合并到10:14:00到10:14:59的K线,10:30是新的K线。
注意:今收盘ClosePrice和结算价SettlementPrice,只在15:00:00推送,其他时间都是无效值,CTP统一用1.7976931348623157e+308,即double的上限值表示。郑交所无效值,用0表示。
中间的休息时间10:15到10:30,11:30到13:30 没有推送数据,正常。15点之后,18点之后,都有无效数据推送。23点到次日8:59休息时间,没有推送数据,正常。其中日盘8:59和夜盘20:59是集合竞价数据,正常。
上海能源交易所(INE):以sc2309为例
夜盘到次日凌晨2:30:00,也是有效数据,合成K线最后1分钟记得加进去。其他规则同上。
价格有时会收到很多小数位,比如sc2309在2023-08-18 09:04:00,合成1分钟K线后开盘价是656.6999999999999,文化财经显示656.6。所以不能用四舍五入,要先知道该品种的单位是:元角分的哪个,然后进行截断。
大连商品交易所(DCE):以jd2309为例
14:59:59结束 ,15:00:00推送今收盘ClosePrice,15:01后推送结算价SettlementPrice
中间的休息时间10:15到10:30,11:30到13:30 没有推送数据,正常。18点后有无效数据。
郑州商品交易所(CZCE):以SF310为例
14:59:59结束 ,今收盘ClosePrice和结算价SettlementPrice也在14:59:59推送。中间休息前的收盘到10:14:59结束,下个tick10:30:00开始,,中午收盘11:29:59结束,下个tick13:30:00开始。
19点后有无效数据。早上8:55:00到8:59之前(不含8:59)推送无效数据。
注意:测试发现 `ActionDay`字段有时收到乱码,是只有SF310这样,还是郑州商品交易所都这样,尚未测试。安全起见,要用实际日期就自己用datetime组建。
有效数据的测试
rb2310 23-8-11
tick 持仓量
- 14:57:59 持仓量 1820357
- 14:58:59 持仓量 1818801
- 14:59:59 持仓量 1813686
- 15:00 持仓量 1813650 注意,15点有2个tick,第2个tick显示今收盘和本次结算价
文化财经 持仓量
- 14:57-14:58 持仓量 1820357
- 14:58-14:59 持仓量 1818801
- 14:59-15:00 持仓量 1813650
这里14:57:59持仓量正好是文华财经14:58的持仓量,而14:58:01的持仓量就不同了,所以不能用新的1秒作为新K线。
按照新K线的规则,15点属于新的1分钟,这里的数据就没算进去,显然是有问题的。所以需要把这2个K线合并。
sc2309,23-8-11
14:59:59和15:00:00,获取到的最新价不同,15:00:00的最新价就是当日收盘价,所以最后那1笔肯定是有效数据。
K线合成要面临的问题
判断是不是一个新K线,最常用的方法是:判断 K线的分钟线是否等于 tick的分钟线,等于就在在同1分钟,不等于就是新的1分钟。
行情连续时没问题,比如1分钟K线 14:57-14:58, tick从14:57:00 到 14:57:59,出现14:58:00是新的K线。
碰到收盘时间有问题,比如:rb2310,14:59:59并不是行情的结束,15点就判断为新K线显然不合理,要把15点那比tick加入到14:59-15:00这个K线里。同样的10:15:00和23:00:00都是这种情况。
郑交所:SF310 23-8-18,当日最后1笔tick是14:59:59,后面就没数据了,就是说没有新K线出现,那这1分钟属于未完成的K线,就不会把14:59:00到14:59:59这1分钟K线推送出去。
同样的上午休盘10:14:59,上午收盘11:29:29,这些其实都是完成了的1分钟K线,应该推送出去。
方案1:
首先否定59秒作为K线结束,因为你不知道该秒推送了几笔tick。
对于休盘整点的情况,可以把tick的更新时间修改成上1分钟,这样15:00推送来的tick,就是14:59,相当于原先K线没走完,自然把15:00推送的数据算进去了。
时间修改后,K线的收盘时间跟郑交所一样,最后1分钟的K线就是14:59,现在问题是没有新的tick推送,如何确定这个14:59已经走完?这里用到今收盘ClosePrice字段,只要不是无效值,说明当天行情结束了,应该推送K线。
方案2:
自己写一个死循环,根据服务器时间来判断是否是新的K线,然后排除掉非交易时间段。
这样做的好处是计算K线非常省事,出现新的1分钟建立空列表,上个K线就从上个列表组建,列表第1个元素就是开盘,最后1个元素就是收盘,列表中的最高和最低就是K线高低点。不过1分钟里tick都在list里,合约一多,比较占内存。
文华财经等软件的K线问题
sc2309,1分钟K线 23-8-18 14:57~14:58,文化的开盘价657.3。
而CTP推送的tick,开盘价应该是657.4,下面是该时间段连续的3笔。
14:56:54 657.4
14:57:05 657.4
14:57:05 657.3
猜测文华财经并不是按tick推送过来时间来计算新的1分钟,而是根据自身服务器的时间来计算。
这样就能解释,为什么大多数时候,文化财经和通达信的数据都是相同的,但偶尔也会出现K线形态不一样的情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具