目前沪深交易所都有Binary和STEP两种行情接口,本篇是我尝试对接沪市VDE的Binary接口。因为不太直观,Binary接口对于初学者来说还是有点难度的,但对于掌握了Binary通讯的大佬来说其实非常简单。网上相关的资料不能说非常少,只能说是极度少,幸运的是我找到了下面这篇博文,他讲的是对接深交所行情网关,我在他这个基础上改吧改吧居然就弄通了。
完整代码附在文末。
Binary接口
什么是Binary接口?我理解就是以byte来通信的接口。
常见的通信接口,比如telnet,我们建立socket连接后,读写都是通过“流”的形式,比如InputStream和OutputStream。但是我们在读到流以后直接就将流转为String来解析,发送也是直接将String通过接口发出去,这样比较简单,通信就好像两个人对话一样,我们只需要处理String即可,但问题是这样非常“浪费”。
浪费主要体现在对数字的传输,比如我们要传输一个10位的数字“1234567890”,如果是字符串格式,每一个数字占用一个char,也就是这个字符串占用char,一个char占用8位,那么传输这个10位数字字符串使用80个位。如果我们现在传输的不是字符串而是Int整数,我们知道一个Int32整数最大值是2147483647和429496729占用32个位。如果传输Int而不是直接传输String,我们可以省下60%的流量。而行情数据中数字就是最大的传输量,通过Binary来传输行情数据可以有效的节省流量并提升传输效率。
但行情数据中又不只是数字,还有字符串的类型,这咋办呢。很简单,我们将要传输的数据以“字段”来进行定义和规范,转为byte后拼接起来即可。比如下面这个接口:
MsgType这个字段我们规定好就是char,那么它占用4x8=32个位。
SendingTime这个字段我们规定好是uint6那么它占用64个位。
同理MsgSeqNum占用64个位,BodyLength占用32个位。
如果是二进制的格式就像下面这样,传输的时候只需要首位相连拼在一起,然后发出去即可。接收方则按前面约定的格式将二进制流按指定位数截断,接着再转化成需要的格式进行处理。
不过我们一般不会直接在二进制做处理,而使用byte来处理比较合适,但byte与Int、String的转换需要注意,特别是Int还分IntInt1Int3Int6
另外浮点数怎么转换呢?通用的办法是将所有浮点数都转为整数,并约定好整数位和小数位。比如uint64,N1其含义是字段占用为64位的无符号整数,传输的数值是13位的,其中最后5位是小数位,比如我们传输123456789012其中整数位是1234567小数位是9012结果是12345679012
登录
登录消息
我们先看接口:
简单来说,一个登录消息包含了头、尾、体三个部分,每个部分又由若干字段组成,需要注意的是checksum是对除checksum字段外所有字段的校验和,另外关于校验和的计算也有一些要注意的后面说。
其中str2Byte、int2Byte因为涉及字段的位数,所以都是需要自己写的,byteMerger是将两个byte数组拼接在一起,最终MsgBody是包含了头、尾、体三个部分的数据,只需要发给VDE就能登录了。
Socket连接
Socket连接比较简单了,其中IP是你VDE所在服务器IP,端口是在VDE配置文件中配的。ReadThread是处理Binary行情流的。
行情解析
先解析head
这段代码就是从socket接口中读取最大102400字节的数据,存到buffer中。这里我做了一些简化处理,后面详细说明。
根据接口,我们将buffer中指定位的内容存放到一个个特定大小的byte数组中,也就是MsgType、SendingTime、MsgSeqNum、BodyLength这些数组。
这段代码是根据接口将byte数组转化为string、int、long类型,其中int64我是用long来代替的。
校验和
把读到的校验和与我们自己计算的校验和做个比较,必须校验通过才能进行下一步的解析。
关于校验和的计算,注意文档示例代码中是uint所以不是简单将byte转int就可以了,计算校验和过程中存在数值的溢出丢弃。
根据不同类型解析内容
这里我只做了MsgType=S00M102两种情况,对应logon消息和快照消息。
流的问题
代码中,我使用了比较大的缓存来读流数据,因为处理过程中发现了一个问题:
“流行情不是逐条传输的”
也就是每次你收到的行情,不一定是完整的
++一条完整的
++多条完整的
++一条完整的
++意思是流行情传输时像一条不停向你流动的河,在任意时间你从buffer中截取的数据可能有多有少,也可能只有一半,所以从socket获取到数据后,你先要把数据拼接起来,再找到有效的head和checksum,这两个之间的数据才是完整的数据。这个过程比较复杂,作为示例我就不搞了,你们加油。
总结
本篇我们做了个简单的上交所流行情Binary接口示例,注意只是能简单跑起来的示例,其中存在很多隐患和问题,出了毛病别找我。
完整的代码下载:
要5积分,不给你们白嫖了。
文章为作者独立观点,不代表股票交易接口观点