FIX三天日记-FIX简介

由于作者还未在真实项目中实践,以下知识均限于学习,有些知识来源网络,不保证绝对准确。 

一、FIX是什么?

是一个适用于实时证券和金融电子交易开发、不受单一实体控制的开放的数据通信标准,此协议能够被调整适用于任何一个企业的需求。

二、FIX的发展和地位

FIX(Financial Information eXchange Protocol,金融信息交换协议)是由国际FIX协会组织提供的一个开放式协议,目的是推进国际贸易电子化进程,把证券金融业务流程格式化,成为一个可用计算机语言描述的功能流程,在各种参与者之间,包括投资经理、经纪人、买方、卖方创建实时的统一交换格式的通信协议。

优点是接入新的合作方, 时间大大缩短,接入方式提明显便捷,相当于多国使用一个统一的语言交流无障碍。

缺点是据说速度慢

三、FIX基本流程

3.1 使用成员

Initiator :发起者,建立通信连路,通过发送初始Logon消息发起会话的参与方。

Acceptor :接收方 ,负责执行第一层次认证和经过传输Logon消息响应确认正式链接请求被接受

3.2 基本流程

FIX连接 由3部分组成:logon登录,message exchange消息传输,logout注销。

logon:

 

logout注销:

session(会话):

介绍:一个FIX会话定义为一个在连接双方间的的带有连续序列号的有序消息双向传输流,由一个或多个FIX Connection 组成。一个FIX会话可以有多次登录,参与方能够多次连接和断开连接。

开始和结束:参与方必须根据单个系统及时间区域需求,公共协商会话的开始和结束。重新设置接收和发送序列号为1,意味着一个新的FIX会话的开始。

过程:每一个FIX参与方必须为FIX Session维护两个序列号:接收序列号和发送序列号,二者都在创建Session时初始化为1。每一个消息被赋予一个惟一的序列号值,并在消息发送后递增。每一个收到的消息都有一个惟一的序列号,接收序列号计数器在收到每一个消息后将会被递增。

3.3 使用建议

(来自网络,未实际项目实践)

建议一个新的FIX会话在每24小时建立一次。维持24小时的连接后通过设置在Logon消息中的ResetSeqNumFlag建立一套新的序列号。重置seq, 可以由session的任何一方发起, 一般会提前协商好

四、具体协议

FIX协议的数据类型:整数int,浮点数float,单个字符char,布尔Boolean,字符串String,数据data

 

4.1 消息格式简介

FIX协议的格式存在着两种结构

  • Tag=Value 域结构, 一维的文本协议,一般大家都使用此结构
  • FIXML 结构

4.2 Tag=Value

基本格式为:[标准头]+[信息正文域]+[标准尾],每条信息都是由一系列Tag=Value对组成的。

除了一些特殊规定外,信息中的域可按照任意顺序排列。所有域在都以定界符0x01(<SOH>)表示终止。

列举常见的tag(仅供了解tag功能,具体参考官方文档)

 

4.3 结构规定

这些规定构成了消息的基石

  •  一条FIX消息的组成, 必须是<header>+<body>+<tail>, 顺序不能变,即:开始部分应是消息头,随后是正文,最后是消息尾;
  • <header>的前三个tag一定是8=FIX.X.X<SOH>9=xx<SOH>35=xx<SOH>,即:起始串(Tag =8)、消息体长度(Tag =9)、消息类型(Tag =35)
  •  <tailer>(消息尾)的最后一个tag一定是10=xxx<SOH>
  • 重复域组的顺序, 一定是先有NoXXX+repeated fields,,域出现的顺序应遵循该重复组在消息或组件中定义时的次序;
  • 在一条消息中,除重复组域外任何其他域不能重复出现。

图中信息解释:

域块:多个域的集合

重复组:由多个重复组块组成

组块:表示重复组中的重复部分,由域块组成

组件:多个域的集合,它们所代表的含义间有关联。

 

4.4 标准头结构(了解)

只列举必须字段

Tag

字段名称

字段说明

必送

注释

8

BeginString

版本号

Y

固定为FIX.4.2(不能加密,必须是消息的第1个字段)

9

BodyLength

消息体长度

Y

(不能加密,必须是消息的第2个字段),不包括8\9\10字段长度

35

MsgType

消息类型

Y

(不能加密,必须是消息的第3个字段)

49

SenderCompID

发送者ID

Y

(不能加密)

56

TargetCompID

接收者ID

Y

(不能加密)

34

MsgSeqNum

会话序号

Y

开市期间不允许重置,除非当天第一次登录

52

SendingTime

发送时间

Y

使用UTC时间格式

4.5标准尾结构(了解)

只列举必须字段

Tag

字段名称

字段说明

必送

注释

10

CheckSum

校验位

Y

整包校验码,收发检查

4.6 自定义域(了解)

FIX为给用户提供最大的灵活性,FIX协议允许用户自定义域。这些域在认同的参与者之间实现、应用,并且应注意避免冲突。

Tag数在5000 到9999保留用于用户自定义域。这些tag值用于企业联盟的信息交换。可以通过FIX网站进行注册。10000以上保留用于单一企业内部使用。不用注册。

4.7 FIXML及其它基于XML数据的传输(了解)

尽管FIX会话协议的标准头(Standard Header),标准尾部(Standard Trailer)和管理消息是基于“tag=value”语法的,但它能够支持传输FIXML及其它基于XML的数据。FIXML及其它XML数据被夹在FIX标准头与FIX标准尾部中间,并通过标准头的XmlDataLen域指定其内容长度,XmlData域包含其具体的数据。这样,FIX引擎可以通过多年使用的,可靠的,实时地异步传输机制传送FIXML及其它XML数据。当MsgType域值为’n’时,代表传输的数据为FIX未在MsgType中定义的XML数据。

4.8实例(后续补充)

 五、保证数据可靠的机制

数据传输基本存在两个核心问题:泄露和篡改。

笔者认为,主流解决方案分别就是签名(解决篡改)和加密(解决泄露),下面看下FIX的做法。

5.1保证数据完整

通过BodyLength 和CheckSum 进行检查

BodyLength(包体长度):在tag BodyLength后面所有的数据, 包括<SOH>,程序通过计算BodyLength域到CheckSum标记(“10=”)分界符的字符数,域BodyLength标示的消息长度进行比较来完成完整性效验。

ChekSum(消息校验和):完整性检查,通过计算从域“8=***” 中“8”开始,直到CheckSum前面的<SOH>,每个字符的2进制和,同CheckSum进行比较得到。然后,校验和被转换为模256的数字用于传送和比较。校验和在所有加密操作之后被计算。

比如:如果消息的校验和为274,则模256后为18(256+18 = 274)。这个值将采用|10=018|进行传输,其中“10=”是校验和域的标签。

char *GenerateCheckSum( char *buf, long bufLen ) {static char tmpBuf[ 4 ];long idx;unsigned int cks;for( idx = 0L, cks = 0; idx < bufLen; cks += (unsigned int)buf[ idx++ ] ); sprintf( tmpBuf, “%03d”, (unsigned int)( cks % 256 ) );return( tmpBuf );
}

5.2保证数据安全

为了保证信息安全,除某些需要公开识别的域以明文传输外,其他任何域都可以加密放置密文数据域 (SecureData)内,加密方法双方协议而定。(如果有些确实需要明文传输以便识别的tag, 可以再加密一份, 用于校对)

当然,这些被加密的域也可以同时保留明文的表示方式。

六、保证交互过程可靠的机制

和大多数网络传输的问题一样,需要保证:不重、不漏、时序性,为此,介绍一个重要概念

seq:每条FIX消息都有一个惟一的序列号进行标识,序列号在每个FIX Session开始时被初始化为1,并在整个Session期间递增,此序列号也是FIX实现可靠传输过程的基石。

6.1不丢包

seq

session的两端, 各自维护一个outgoing seq(每个新的msg, seq+1)和一个incoming seq(用来监控是不是丢包了)。每条FIX消息都会有一个seq, 每个FIX Session建立的时候会将seq初始化为1, 后续消息会依次累加.

通过seq, 接收方就可以知道是不是有FIX MSG丢了, 一旦发现丢失, 可以及时做出补救措施(连接管理与业务处理解耦)


HeartBeat

监控连接状态, 检查是否有msg丢失. (发送Heartbeat的周期间隔由会话发起者使用Logon消息中HeartBtInt域设置好, 双方相同,由会话发起方定义并由会话接收者通过Logon消息进行确认).

和大多数优秀的开源组件一样(如redis),在消息交互期间,FIX程序周期性产生心跳消息,该消息可以监控通信链路状态及识别接受序列号间隙。

Heartbeat心跳消息的时间间隔在每一个消息发送后复位,即发送一个消息后,在间隔给定的时间内无其它消息发送则发送一个Heartbeat心跳消息。

再强调一遍,同一个HeartBtInt被会话双方——登录的发起者和登录的接受者共同使用。

6.2不重复

6.3时序性

客户端:

还是通过seq,按照seq的从小到大, 依次处理.

如果收到了5个消息中的1,2, 4, 5, 而丢掉了第3个msg, 那么处理方式有2种.
1、接收方生成这个ResendRequest, 要求发送方将3-5这3个消息全都
重新发送一遍.
2、接收方生成这个ResendRequest, 要求发送方将第3个消息重新发
送一遍

两种方式的利弊很明显,就不分析了,记住:无论怎样,客户端收到完整的消息后, 再依次处理。

服务端:

重传请求的响应消息都包含值为‘Y’的PossDupFlag域。没有PossDupFlag域或PossDupFlag域为‘N’的消息应被看成初始传送消息。值为‘Y’的重传消息要重新计算其CheckSum值。复制消息中发生变化的域包括:CheckSum,OrigSendingTime,SendingTime,BodyLength和PossDupFlag,加密相关域(SecureDataLen和SecureData)也必须被重新构造。

两种重传情况

1)Possible Duplicates

收到接收方的ResendRequest, 或怀疑没发出(如进程重启时的msg), 设置PossDupFlag=Y, 使用原来的seq, 重新计算CheckSum将msg重新发送一次
2)Possible Resend

订单很久没响应时, 会怀疑这个单没发出去, 就会考虑重新下一单. 设置msg的PossResendFlag=Y, 使用新的seq, 但是OrderId不变, 重新下单。接收方需要识别PossResendFlag, 并通过OrderId准备识别出这个Order是不是之前已经收到过, 并正确处理。

PossResend 和 PossDupFlag 区别就是前者使用了新序列号发送老的消息,可以通过检查消息中的域来确定是否已经收到过该消息,比如 order 的 ID 等;后者是用老的序列号重发消息,可以直接检查序列号来确定是否已经收到过该消息,若已收到过了就丢弃该消息。

七、其它协议(了解)

FAST协议

为了解决FIX协议传输市场数据存在的冗余度高,带宽需求大的问题,芝加哥商品交易所(CME)在2003年向FPL(FIX Protocol Ltd)提交了一个解决方案,FPL在2004年成立了市场数据优化工做组(MDOWG),2005年MDOWG开始根据一些POC(Prove of Concept)的结果进行协议标准制定,并于2006年初完成了FAST(FIX Adapted for Streaming) V1.0,2006年12月完成了FAST V1.1。 
FAST协议核心是一个压缩算法,将按照FIX规范定义的数据通过压缩后,能够在很大程度上下降发送、接收双方的带宽。
FAST协议的优势是高压缩比,低资源消耗,算法简单高效,每秒百万级别的消息处理能力。

STEP协议

STEP(Securities trading exchange protocol,证券交易数据交换协议)是基于FIX4.4版本FIX协议制定出来的中国本地化FIX协议版本,是中国国家金融行业标准,已成为事实上的证券数据标准,其语法简单定义灵活易扩展,数据相对冗余。

Binary协议

Binary即二进制协议,定义了各类报文的字段、编解码规则等。在深交所的Binary协议中,全部的消息都有3部分组成:消息头,消息体和消息尾。消息头有8个字节,包括整数MsgType和整数BodyLen,MsgType表示消息的类型,BodyLen表示消息体的长度;消息体根据BodyLen大小进行读取;消息尾是4个字节的 checksum。

八、推荐文档

官网应用层规范icon-default.png?t=M666https://www.fixtrading.org/standards/

官网参数文档icon-default.png?t=M666https://www.fixtrading.org/online-specification/global-components/

fast协议giticon-default.png?t=M666https://github.com/kuangtu/fixfast/blob/master/References/FAST%20Specification%201%20x%201.pdf

quickfix官方giticon-default.png?t=M666https://github.com/quickfix/quickfix

csdn阅读最多的fix文章https://blog.csdn.net/eryk86/article/details/96275929icon-default.png?t=M666https://blog.csdn.net/eryk86/article/details/96275929

被抄袭较多,实现了一个简单demoicon-default.png?t=M666https://juejin.cn/post/6844903720593915911#heading-25

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FIX三天日记-quick fix简介

一、介绍 fix协议在上篇已经学习了&#xff0c;不再介绍。 QuickFIX是一款C实现的开源FIX引擎&#xff0c;同时提供Python等多种语言实现&#xff0c;具体看quickfix git地址 官网已经介绍如何编译quickfix、配置文件字段含义等等&#xff0c;我假设你可以看懂&#xff0c;用…

兔老大的系统设计(一)健康度系统

本系列用大白话&#xff0c;手把手带你实现上百个BAT公司内部真实的常用中型系统。评论抽奖送书 与培训班/营销号/忽悠人的低水平作者&#xff0c;不同的是&#xff1a; 保证听懂&#xff08;小白也可以&#xff0c;这是我的一贯风格&#xff0c;字典式小白式的输出&#xff0…

兔老大的系统设计(二)定时系统(延时队列)

之前文章&#xff1a; 兔老大的系统设计&#xff08;一&#xff09;健康度系统 一、背景 延迟队列的应用场景非常广泛&#xff0c;如客户主动操作&#xff1a; 股票定投顾客预约场景会员定时续费/缴费CSDN定时发布或系统内部操作&#xff1a; 订单成功后&#xff0c;在30分…

新鲜美团测试岗面经(带答案)

1、测试环境搭建过程 2、 验证环境部署是否成功时 跑测试用例 接口是什么样的&#xff1f;&#xff08;服务对外提供的调用接口&#xff09; 3、 数据库 表 有个字段 name字段 nameliuguoge 唯一标识id3 修改nameguogeliu update user set nameguogeliu where id3; 4、写…

如何实现Oracle数据库之间的数据同步?

我们都知道&#xff0c;在Oracle数据库的管理与开发工作中&#xff0c;总会存在着一些表数据和基础资料数据&#xff0c;这时需要有效的将这些数据库进行同步合并&#xff0c;有没有什么简单的方法可以实现Oracle数据库之间的数据同步呢&#xff1f;在此诚恺科技重庆服务器频道…

Linux简单命令收录(who,echo,date)【上】

shell严格区分输入命令的大小写&#xff0c;如who、Who和WHO是不同的&#xff0c;其中只有全小写——who是正确的Linux命令。 命令与选项和参数之间要用空格或制表符隔开。连续空格会被shell解释称单个空格。 选项&#xff1a;对命令的特殊定义&#xff0c;以“-”开始&#…

Linux简单命令收录(cal,passwd,clear)【下】

1、cal NAME cal - display a calendar 显示日历 SYNOPSIS cal [options] [[[day] month] year] cal [options] [timestamp|monthname] 用法&#xff1a; cal [选项] [[[日] 月] 年] cal [选项] <时间戳|月份名> OPTIONS -1…

操作系统中避免死锁的银行家算法【表面C++实际C语言】一学就废的菜鸡代码

文章目录银行家算法实验原理数据结构初始化输出资源分配量安全性算法银行家算法完整代码测试数据测试结果第一题第二题银行家算法 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源&#xff0c;但系统在进行资源分配之前&#xff0c;应先…

GitHub 使用指南

目录切换分支删除已有文件只删除远程仓库中的文件&#xff0c;不删除本地仓库中的文件同时删除远程仓库和本地仓库中的文件提交文件git查看本地分支连接的是哪个远程分支切换分支 查看本地和远程所有分支 git branch -a当前本地分支为绿色&#xff0c;当前所在分支前带有“*”号…

一学就废的并查集它来了

文章目录题目描述输入输出样例输入样例输出提示算法思想代码实现寻找根节点汇总连接情况完整代码关于flag的初值题目描述 某省调查城镇交通状况&#xff0c;得到现有城镇道路统计表&#xff0c;表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城…

百战c++(2)

delete 和 delete []的真正区别 delete 对应 new delete[]对应new[]对于简单类型包括简单类型数组&#xff0c;delete 与delete[]没有区别。对于自定义类型数组&#xff0c;delete 只会删除一个元素&#xff0c;delete 则会删除所有元素。 指针和数组的区别 野指针是什么 野指…

Linux实验一:常用的Linux命令

文章目录一、实验目的二、实验要求三、实验内容1、系统的使用2、命令的使用3、文件操作4、系统询问与权限口令5、其它常用命令四、实验操作1、基本命令的使用2、文件和目录操作3、创建用户帐户一、实验目的 1、熟悉Linux的桌面环境&#xff1b; 2、了解Linux所安装的软件包 3、…

Linux实验二:vi编辑器的使用

文章目录一、实验目的二、实验要求三、实验内容1、创建文件2、编辑文件一、实验目的 1、练习并掌握Linux提供的vi编辑器来编译C程序 2、学会利用gcc、gdb编译、调试C程序 3、本次实验的目的是让同学们了解如何使用vi编辑器进行创建和编辑文件 二、实验要求 1、文件编辑器vi…

百战c++(os1)

Linux中的锁 互斥锁&#xff1a;mutex&#xff0c;用于保证在任何时刻&#xff0c;都只能有一个线程访问该对象。当获取锁操作失败时&#xff0c;线程会进入睡眠&#xff0c;等待锁释放时被唤醒 读写锁&#xff1a;rwlock&#xff0c;分为读锁和写锁。处于读操作时&#xff0…

Linux实验三:Shell编程

文章目录一、实验目的二、实验要求三、实验内容1、通配符的使用2、重定向3、管道4、shell变量5、建立下面的脚本&#xff0c;运行并分析输出结果&#xff0c;并给出代码注释。6、编写脚本一、实验目的 1.为文件扩展名使用通配符 2.标准输入、标准输出和标准错误的重定向 3.使…

Linux实验四:编译和调试工具的使用

文章目录一、实验目的&#xff1a;二、实验要求三、实验内容四、实验操作1、用gcc编译程序&#xff0c;写出编译过程&#xff0c;并给出运行结果。2、调试程序&#xff0c;要求用gdb进行调试并给出修改方案。3、make的使用一、实验目的&#xff1a; 1、练习并掌握Linux提供的v…

Linux实验五:Linux环境下的C语言编程

文章目录一、实验目的&#xff1a;二、实验要求三、实验内容1、编写一段C语言程序使其完成&#xff1a;父进程创建两个子进程&#xff0c;每个进程都在屏幕上显示自己的进程ID号。2、上机调试下面的程序&#xff0c;观察运行结果&#xff0c;分析原因。3、利用两个管道进行双向…

ndarray对象的建立

文章目录ndarray&#xff08;别名array&#xff09;常用属性创建NumPy数组使用array()函数使用zeros()函数使用ones()函数使用empty()函数使用arange()函数注意ndarray&#xff08;别名array&#xff09; 常用属性 import numpy as np # Numpy工具包data np.arange(12).res…

Numpy数组的广播机制

文章目录前言数组广播广播机制的使用条件前言 Numpy数组不需要循环遍历&#xff0c;即可对每个元素执行批量的算术运算操作&#xff08;矢量化运算&#xff09;。当两个数组大小&#xff08;Numpy.shape&#xff09;不同时&#xff0c;进行算术运算会出现广播机制。 数组广播…

数组的转置和轴对称

文章目录T属性transpose()方法swapaxes()方法T属性 import numpy as np # Numpy工具包data np.arange(12).reshape(3, 4) # 创建一个3行4列的数组 print(data)# 数组的转置和轴对称 data1 data.T print(data1)print(data) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] print(dat…