FIX协议的工作原理 7 5 月, 2022 – Posted in: 套利软件
介绍
自成立以来,股票市场的交易历史发生了巨大的变化。 第一个证券交易所出现在大约400年前。 当时,交易是口头达成的,交易规则也才刚刚开始。 但世界并没有停滞不前,为了跟上时代的步伐,证券交易所采用了当时所有可能的科技工具。
因此,在19世纪中期,在与交易相距一定距离的地方的交易申请通过电报线路来连接。 然后电话代替了它。 最终,交易员的第一个交易请求通过互联网通信传输。
公平地说,在现代,通过电话进行交易有时仍会发生在一些经纪人身上。 其中的一部分是交易的唯一保证管道。 此外,从最初的交易所开始到21世纪初,直接在交易所领土上进行的交易都是口头进行的。 这样的交易场所被称为股票交易场,代表著我们在好莱坞电影中熟悉的一种奇观。
FIX协议历史记录
最古老的数字交易协议之一是FIX协议。它 代表“金融信息协议”或“金融交换协议”,这两个定义都可以找到。 FIX协议规范创建于1992年,旨在提供富达投资与所罗门兄弟之间的股票交易信息。 经纪人和投资基金希望加快交易所的交易过程。 其结果是形成了一个以电子管道传输信息的开放标准,没有任何主要组织可以控制。 如今,FIX已经成为不同国家的金融市场参与者用来连接其产品的行业标准。
最初,该通信协议仅在上述两家交易所之间使用,称为SBX(所罗门兄弟交易所),仅用于股票交易。 然后,正如故事所说,这些公司的领导人意识到他们发明的重要性,提出加入高盛和普特曼的发展。 此后,该协议被命名为当前名称。
最初,该协议只支持17种消息类型和103个标签。 这个想法非常成功,到1995年,超过70%的美国券商使用了该协议。 这是由于成本节约、成本降低和交易错误减少。 毕竟,在通过电话进行交易时,人为因素有很大的影响。 随著时间的推移,该协议已经显著扩展。 新增了对衍生品、债券和货币交易的支持。 当前的FIX规范描述了168条消息、7868个标签,并涵盖了所有类别的证券。 1998年,FIX协议及其规范的开发以及相关科技的开发被移交给了FIX协议有限公司财团。 该财团后来更名为FIX Trading Community。 该组织目前有270多家主要金融机构的成员。
FIX协议的工作原理
FIX协议通过TCP运行。 现时,FIX协议模型定义在两个级别——会话或控制级别(会话创建、数据交付工作)和应用程序级别(数据内容描述)。 控制层负责修复会话的基本参数:打开和关闭连接,恢复遗失的消息。 应用层控制数据的发送和接收:请求、执行、拒绝、市场数据和状态信息请求。 协议本身是文字,也就是说,它使用ASCII表中的字元。 它分为两种表示形式——传统的,形式为Tag=Value(Tag=Value或Key=Value),以及XML(FIXML)表示形式。 最新版本现时是5.0,但最常见的是4.2和4.4版。 不同的经纪人和交易所可以使用不同版本的协议,有时会同时使用多个版本。
Syntax Tag=Value
该消息类似于以下内容:
8=FIX.4.2 | 9=178 | 35=D | 34=1234567 | 49=TESTER | 56=PHLX | 52=20071123-05:30:00.000 | 11=ATOMNOCCC9990900 | 54=1 | 167=FUT | 55=MSFT | 38=15 | 40=2 | 44=15 | 59=0 | 10=128 |
这是一个文字字串,由垂直条分隔的部分组成。 这些部分称为栏位。 反过来,每个部分由一个由等号分隔的键值对组成。 符号右边是键,左边是值。 在FIX规范中,键被称为标签。 标签始终是正整数,本质上是指向栏位名的指针。 特定交换的文件中描述了所有栏位名及其可能的值。 其中大多数栏位都是标准栏位,可以在任何交换的BOM表中找到。 还有一些自定义栏位,它们仅在特定的交换中定义并具有意义。如果可以在通用FIX协议规范中找到标准栏位的描述,则必须在交换FIX协议规范中描述自定义栏位。 还有必填栏位、可选栏位和条件必填栏位(必填栏位取决于消息中是否存在其他栏位)。SoH(标题开头)符号用作栏位之间的分隔符号。 它实际上是不可见的,因此在本例中,它被替换为竖条。 在UNICODE编码中,此字元的代码为“\u0001”。
反过来,当消息被划分为多个栏位时,它们又定义了另外三个组件:
- 标题(消息标题)
- 正文(消息正文)
- 消息训练器(校验和)
在FIX1.1/FIX5.0中, 标头包含5个必填栏位和一个可选栏位: 8 (BeginString), 9 (BodyLength), 35 (MsgType), 49 (SenderCompID), 56 (DestComppID), 和 1128 (ApplVerID – 如果存在,则必须位于第6处). 主要有两组消息——管理消息和应用消息。 管理消息处理FIX会话的基本信息。 它们允许您启动和结束会话,以及恢复遗失的消息。 申请信息与交易相关信息的发送和接收有关,例如认股权证请求或关于认股权证当前状态和后续执行的消息。
我们将分析这条消息:
- 8=FIX.4.2 – BeginString。使用协议版本。 告诉交易员程序要应用哪些规则来解析此消息的栏位。
- 9=178 – BodyLength。消息正文长度为178位元组,包括消息头。 计算为从标签35(含)到标签10(不含)的字元数。 还考虑了SoH分离器。
- 35=D – MsgType。消息类型。 在这种情况下,D表示提出交易请求。 例如,35=V的栏位表示获得了有关该仪器的市场数据。
- 34=1234567 – MsgSeqNum。消息号码。 如果MsgSeqNum消息在发送的序列中没有1个不同,服务器将返回一个错误,并且不处理该消息。
- 49=TESTER – SenderCompID。由交易所发布的发件人ID。 这可以是用户名,如果消息是由代理发送的,则可以是代理的名称。
- 56=PHLX – TargetCompID。 要发送到的收件人ID。 也由交易所发行。
- 52=20071123-05:30:00.000 – SendingTime。发送邮件的日期和时间。
- 11=ATOMNOCCC9990900 – ClOrdID。经纪人交易系统中的应用程序编号。
- 54=1 – Side。资产购买行为
- 167=FUT – SecurityType。资产是一种未来
- 55=MSFT – Symbol。 微软的推广活动。 不同交易所的报价可能有所不同。
- 38=15 – OrderQty。 交易量为15个批次或契约。
- 40=2 – OrdType。限价购买,限价订购。
- 44=15 – Price。购买价格-15
- 59=0 – TimeInForce。 申请截止日期为工作日结束。
- 10=128 – CheckSum。消息校验和。 始终是消息中的最后一个栏位。 使用特殊公式计算,并在协议规范中进行了描述。 它是通过将消息中除校验和栏位字元外的所有字元的ASCII值相加来设定的。 将该值除以256,然后取隔间的剩余部分。 校验和必须始终为三个字符长。 所以,如果模数是22,那么在数字之前加上0——“022”。
如果您概括地描述这条消息,这是一个以15个合约的最高价格购买微软股票期货的行为,到期日为一天结束。
为了在修复中提供更大的灵活性,该协议包含所谓的用户定义栏位,即用户定义栏位。 它们用于合作金融组织之间的数据传输。 从5000到9999的标签号是为自定义栏位保留的,可以在标准的官方网站上保留。 随后使用了这些数字,因此分配了一个从20000到39999的新的间隔。
FIXML语法
语法方面的工作始于1998年,第一个版本于1999年发布。 它在语义上等同于使用标记编码的消息,但使用XML解析科技。 FIXML格式的新操作应用程序如下:
<FIXML>
<Order ClOrdID=”123456″ Side=”2″ TransactTm=”2001-09-11T09:30:47-05:00″ OrderTyp=”2″ Px=”93.25″
Acct=”26522154″>
<Instrmt Sym=”IBM” ID=”459200101″ IDSrc=”1″/>
<OrdQty Qty Qty=”1000″/>
</Order>
</FIXML>
在XML格式中,一个特定的代码块在一个所谓的标签(另一个标签,而不是协议本身使用的标签)中形成框架。 例如,有一个<FIXML>顶级顺序标签。 任何标签都会打断特定的代码或消息,并使用相同的标签将其关闭,但在左边缘内,有一个斜杠字元。 因此,上述标签将按如下管道关闭该块: </FIXML>.
接下来,在这个标签中,我们看到以下标签:
<Order ClOrdID=”123456″ Side=”2″ TransactTm=”2001-09-11T09:30:47-05:00″ OrderTyp=”2″ Px=”93.25″
Acct=”26522154″>.
在这里,我们可以看到标签名-顺序,在括弧内,还有其他信息(相同的栏位,key=value配对为语法Tag=Value).
在这种情况下:
ClOrdID=”123456″ -经纪人交易系统中的订单id
Side=”2″ -销售订单
TransactTm=”2001-09-11T09:30:47-05:00″ 交易日期和时间
OrdTyp=”2″ – 索赔类型-限额订单
Px=”93.25″ – 购买或出售资产的价格
Acct=”26522154″ – 用户账号
与前一个XML标签一样,XML标签以斜杠结束 – </Order>
开始和结束XML标签之间的内容称为标签体。 因此,Order标签是FIXML标签的主体。 在作为主体的订单标签中,还有两个标签: Instrmt和OrdQty。
下一个标签:
<Instrmt Sym=”IBM” ID=”459200101″ IDSrc=”1″/>
在这里,我们可以看到它同时闭合,在它的末端有一条斜线。 如果标记中没有任何正文,则情况就是这样,并且没有必要制作单独的框架标签。 该标签包含工具的代码、id等信息。
在<OrdQty Qty=“1000”/>标签中,我们可以看到有关交易量的信息,它也是没有正文的结束标签。
FIXML通常用于后台和清算应用程序,而不是用于交易。
FIX会话层
前面的示例描述了应用程序层。 该规范定义了负责用户端和交换之间会话级别的特殊栏位类型:
- 35=A – 登入。 用于在连接时向交换系统验证用户身份。 首先发送此消息,并向数据会话的开始发送交换讯号。 成功提交后会收到回复消息。 如果连接失败,将返回一个错误。
- 35=5 – 注销。 此消息用于与服务器解除授权,并关闭与交易所的交易会话。
- 35=0 – 心跳。 心率或脉搏。 此消息从连接的双方互相发送,表示双方都已准备好接收和发送消息。 心跳频率在第一条登入消息中设定。
- 35=1 – 测试请求。 此消息是一条测试消息,当交易对手在设定的时间段内未发送心跳消息时发送。 如果此消息仍未应答,会话将关闭。
- 35=2 – 重新发送请求。 此消息是在遗失任何信息时重新发送消息的请求。
- 35=3 – 拒绝。 如果上一条信息格式错误或无法执行,则由交易对手发送。
- 35=4 – 序列重置,或重置消息发送序列。 它可以有两种形式。
– 123=”Y” – 有一个具有指定值的GapFillFlag标记。 训示在再次发送管理消息时忽略这些消息的请求。
– 用于将MsgSeqNum计数器归零
实现FAST作为修复API的增强功能
大量FIX数据在处理过程中会出现重大延迟,这使得交易员不太可能制定有效的交易策略。 在意识到这一问题后不久,就采取了纠正这种情况的第一步。 FAST协议的目标是允许传输大量数据,避免获取信息的延迟。 FAST(FIX Adapted for STreaming,翻译为适用于流媒体的FIX)是由FIX Protocol Ltd.开发的科技标准,专门用于优化网络呈现。 它本质上是FIX协议的二进位格式,允许以紧凑的形式传输有关交易和市场环境的大量信息。 这使得它可以在需要低传输延迟的高速交易系统中使用。 Fast由位于帕萨迪纳的加利福尼亚理工学院开发。 现时是FAST 1.2的最新版本。 最常见的应用程序是直接连接到交易所,绕过经纪人的交易系统。 FAST协议是标准化的市场信息分发协议,在世界上最为流行。 此前,所有互联网流量都基于上世纪70年代开发的传输控制协议(TCP)系统。 TCP是一种通讯端连接,需要确认数据包传递。 它将大文件和消息分解为1500位元组的数据包,每个数据包包含数据包的源地址和目标地址。发送方等待确认发送的数据包已成功送达,然后才发送下一个数据包。 如果传送失败或传送讯号没有在指定的超时时间内到达,数据包将再次发送,但发送速率较低。 它可以持续很久,速度呈指数下降,直到传递成功的讯号出现。 很明显,即使是很小的线路问题也会严重影响数据速率,因为每次发送失败都会损失宝贵的毫秒。 因此,FAST引入了一种解决方案——系统不断监控数据包和接收到的消息,以便立即检测线路上的问题,并将下一次发送设定为稳定的速率,尽管这样速率略有降低。这种方法在大多数情况下无需重新发送数据包,因为它不需要花费时间来检测效能是否缓慢。 在某些交换机中,连接界面通过两种类型的连接实现:UDP和TCP。 在UDP通讯端上发送所有数据毫无意义,因为这样的连接不需要确认传递,数据包就会消失,任何一方都不会知道。 因此,大多数数据通过UDP通讯端传输,只有未传输的数据集通过TCP传输。 在快速发展的市场中,与重传相关的延迟通常是不受欢迎的,这会导致错过机会或糟糕的交易。
FAST 的工作原理
正如我们已经知道的,FIX协议是一系列栏位,这些栏位依次由key=value对组成。 除了字串格式本质上是冗余的这一事实之外,您可能会注意到每条消息都有重复的元素,例如栏位名和“=”字元。 FAST通过使用描述整个消息结构的范本来消除冗余。 这种方法称为隐式标记。 由于传输数据中的固定标记只是“隐含的”,因此Tag=Value的语法变化如下:
- 范本描述了一组带有运算子的结构化栏位;
- 消息中的栏位序列与范本中的标记序列匹配;
- 消息中只发送更改数据。
每个标记值都有固定的位元组长度。 知道特定栏位的长度以及栏位在消息中的放置顺序,就不难识别消息中这些栏位的值。 因此,范本只允许直接传输数据本身,而无需传输冗余字元。 这种编码被称为简单二进位编码,或SBE。 因此,消息编码和解码的延迟比字元协议低得多,因为不需要将数据转换为电脑可以使用的格式。由于相应栏位在消息中处于固定位置,因此访问所需值要容易得多。 您只需要知道它相对于消息开头的偏移量,以及它的值的长度。 与标签和FIXML不同,SBE消息不是自我描述的。 只有具有最小标头的数据才会通过网络发送,以标识控制消息的范本。 描述消息结构的中继数据(范本)在主通信通道之外交换。 在收到必要的范本后,交易服务器知道在该连接会话的框架内以何种格式向用户端发送数据。 因此,在传输数据之前,系统在未来如何与它们通信的问题上以某种管道达成一致。 消息模式通常以XML格式发送。 它可以包含任意数量的消息范本。 范本描述了组成消息的栏位。 此外,该模式还提供了一个简单和复杂的数据类型清单,可以在任意数量的栏位中重新使用。
针对FIX协议的不同语言的开放实现
Java – QuickFIX/J – http://www.quickfixj.org/
.NET/C# – QuickFIX/N – http://quickfixn.org/
免费在线FIX消息解析器- FIX解析器 – https://fix.aprics.net/
开放式语言实现
For C – FPL的参攷实现 – www.fixprotocol.org/fastdownload
For C# – FPL的参攷实现 – www.fixprotocol.org/fastdownload
Java л д code – OpenFAST – www.openfast.org
www.sourceforge.net/projects/openfastdotnet/ Д я
For C++ – QuickFAST – www.quickfast.org
For Golang – goFAST – www.github.com/co11ter/goFAST
其他协议FIX编码
FIX社区还开发了FIX协议和其他数据序列化协议之间的标准映射,例如:
- JSON
- Google(协议缓冲区)
|ASN.1
FIX/FAST协议应用领域
通常情况下,缩写词是两个单词同时出现的。 用于从贸易交易所获取各种金融信息:金融工具表(价格、数量等)、报价、所有交易、指数,以及有关所有非个人应用程序的信息。 获得的数据集可能因交换而不同。主要的FIX/FAST是:
- 私人交易商进行交易
- 程序师可以基于这项科技创建产品。 比如 – 不同交换机的连接器,交易系统,数据收集系统和统计数据。
- 交易所之间的信息交流
- 获取各种信息机构的最新数据
最常见的用途是高频交易者通过直接市场准入(DMA)获得超过其他市场参与者的优势。 该协议可由证券交易所、银行和外汇经纪人纳入交易生态系统。 根据众所周知的数据,加密货币交易所不使用这种技术。 从历史上看,这些交易所大多使用WebSocket连接来获取市场信息,使用HTTP rest API连接来进行交易操作,从而直接连接到交易员的交易服务器。 如果WebSocket科技在速度上仍然与TCP连接相当,那么HTTP rest API会损失很多。