CTP tick数据合成K线的问题

发布时间 2023-08-20 09:32:02作者: C羽言

各个交易所的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线形态不一样的情况。