原文

当我开始研究FIX协议的时候,我想在因特网上寻找一些很好的教程可以作为FIX协议规范的补充,当时没有什么内容,所以当我开始写博客的时候,我想把自己在FIX协议方面的经验以清晰简洁的教程格式发布出来。因为我也喜欢问答式的知识分享,所以我写了一些关于FIX协议面试问题的博客,你可能会感兴趣。

在今天的FIX教程中,我们将了解FIX协议会话级消息。正如你们可能知道的,所有的FIX消息可以大致分为两类,

  • 管理消息也称为会话级消息
  • 应用消息,其中包括交易、交易前和交易后消息。

理解FIX会话如何工作是非常重要的,因为除非你知道FIX序列号的基本原理、FIX会话如何连接、发送方FIX 引擎和接收方FIX引擎之间的消息序列是什么,否则您将无法快速识别与FIX协议相关的任何问题。FIX规范非常清楚FIX引擎应该在各种FIX会话连接/断开场景中做什么。

FIX Session vs Admin Messages

根据FIX协议,首先发送方FIX引擎和接收方FIX引擎通过TCP/IP协议在指定的IP地址和端口上通过租用的线路、Radianz链接、虚拟专用网(VPN)或互联网相互连接。一旦TCP套接字连接建立,发送方应用程序发送Logon(FIX标记35=A MsgType=A)与约定的SenderCompID(FIX标记49)和TargetCompID(FIX标记56)。

接收方FIX引擎接收这个消息并基于SenderCompID(FIX标记49)和TargetCompID(FIX标记56)验证发送方FIX引擎, 如果客户端身份验证成功, 接收方FIX引擎回复登录(FIX标记35=A)消息, 成功建立连接, 然后FIX引擎将通过心跳消息(FIX标记35=0)在指定的心跳间隔保持连接活跃。

如果接收方FIX引擎无法验证客户端,它将发送一个登出消息(FIX标记35=5),连接将被终止,尽管套接字连接仍然存在。如果接收到序列号低于预期的FIX消息,接收方FIX引擎也可以发送登出消息(FIX标记35=5)拒绝连接。

现在让我们详细地看看每个会话级别或Admin消息。您总是可以参考FIX协议规范文档,建议也参考该文档来获得每个消息的完整描述。FIX规范中指定的一些重要的会话级别或管理消息如下:

Heartbeat

FIX (financial information exchange) Protocol中,心跳消息用MsgType=0表示。FIX Session Initiator和FIX Session Acceptor都在心跳间隔定义的时间间隔(通常为30或60秒)内互相发送心跳消息以保持FIX会话处于活动状态。如果您在FIX Engine日志文件中看到Heartbeat消息(FIX标记35=0),则意味着您的FIX会话已启动并已连接。

Logon

登录消息由FIX标记35=A表示,它用于从FIX 发起者(客户端)发送登录消息。根据FIX协议,一旦FIX Initiator和FIX Acceptor之间的TCP连接建立,FIX Initiator发送登录消息(tag 35=A),该消息包含事先商定的SenderCompID (tag 49)和TargetCompID (tag 56),还有FIX Acceptor期望的序列号 (FIX tag 34)。

当FIX acceptor接收到Logon请求(MsgType=A)时,它根据FIX Message和Sequence No中指定的CompID对FIX会话进行身份验证,并根据身份验证的结果用Logout (tag 35=5)消息或Logon(tag 35=A)消息回复。

Resend

Resend Request (FIX tag 35=2或MsgType=2)用于请求在传输过程中或由于错误序列号而丢失的消息的重新传输或重放。它通常由正在接收消息的FIX Engine发送,以启动消息的重新传输。如果检测到序列号间隙,或者接收应用程序的FIX Engine丢失了消息,或者作为初始化过程的一部分使序列号同步,FIX Engine将使用Resend Request(标记35=2)。
Resend Request (FIX标记35=2或MsgType=2)可以用于请求单个FIX消息、一系列FIX消息或特定FIX消息之后的所有FIX消息。

值得注意的是,发送FIX Engine可能会在重新发送消息时考虑消息类型;例如,如果一个新订单处于重发序列中,并且从最初发送到现在已经经过了很长一段时间,发送方FIX Engine可能不希望重新发送该订单,因为市场动态、价格等可能已经改变,这可能会导致陈旧的订单被拒绝,这是由订单管理系统(OMS)完成的。(Sequence Reset (FIX tag 35=4或MsgType=4)也称为Gap Fill,用于跳过发送方FIX Engine不想重发的FIX消息。)

接收到的FIX Engine必须按顺序处理消息,例如,如果FIX消息号11被错过,12-13被接收,应用程序应该忽略12和13,并请求重新发送11-13,或11 -0(0表示无穷)。强烈建议使用第二种方法从非序列条件中恢复,因为当FIX engine的两端同时试图恢复序列号间隙时,它允许在存在某些竞态条件时更快地恢复。

Test Request

测试请求用FIX标记35=1或MsgType=1表示。FIX Engine使用测试请求消息来强制要求对方的FIX Engine发送心跳。测试请求(FIX标记35=1)消息检查序列号或验证通信线路状态。相对的FIX引擎用包含TestReqID (FIX标记112)的心跳(FIX标记35=0)响应测试请求消息(FIX标记35=1)。

TestReqID (FIX标记112)验证对方FIX Engine正在生成心跳(FIX标记35=0),是否作为测试请求的回应(FIX标记35=1),而不是正常的超时。相反的FIX引擎在生成的Heartbeat (FIX标记35=0)中包含TestReqID (FIX标记112)。任何字符串都可以用作TestReqID (FIX标记112)(一些FIX引擎通常使用时间戳字符串)。

Session Level Reject

会话级别拒绝消息用FIX标记35=3或MsgType=3表示。会话级别Reject由FIX引擎在收到FIX消息但由于会话级别规则违反(如FIX Protocol规范文档中所指定)而不能正确处理时使用。例如,FIX Engine将使用会话级别Reject,或者它接收到一个包含无效基本数据(例如MsgType 35 =$)的FIX消息,该消息成功通过了反加密、Checksum (FIX tag 10)和BodyLength (FIX tag 9)检查。作为一条规则,只要有可能,FIX消息就应该转发到交易应用程序以获得业务级别的拒绝。

被拒绝的消息应该被记录到日志文件中,传入的序列号必须由FIX Engine递增。

值得注意的是,接收FIX Engine时应该忽略任何不正确、无法解析或数据完整性检查失败的FIX消息。对下一个有效的FIX消息的处理将导致序列号不匹配的检测,并且将生成一个重发请求(FIX标记35=2或MsgType=2)并传递给对方的FIX Engine。

Reject (FIX标记3)消息的生成和接收表明了一个严重的错误,可能是发送或接收FIX Engine中的错误逻辑导致的。如果发送的FIX引擎选择重新发送被拒绝的消息,它应该被分配一个新的序列号(FIX标记34),并使用PossResend (FIX标记97)=Y发送。建议在FIX标签Text (fix tag 58)中描述拒绝的原因,然后接收FIX引擎或开发人员可以使用它来识别会话级别拒绝的实际原因(例如,Limit Order中没有Price标签)。

下面是一些可以使用会话级拒绝(FIX Tag 3或MsgType=3)的场景。

CompID问题: FIX Initiator或FIX Acceptor发送不正确的SenderCompID(标签49)和TargetCompID(标签56)。

无效的MsgType: FIX Initiator 或FIX Acceptor发送的MsgType不是特定FIX版本(如FIX4.2)中指定的

值的数据格式不正确: 如果FIX标记是时间戳类型,但FIX引擎却发送其他数据类型

必须的标签缺失: FIX Initiator或FIX Acceptor都没有在特定的FIX消息中发送必须的FIX 标签,例如,在OrdType =2NewOrderSingle (MsgType=D)消息中丢失Price (FIX tag 44),即Limit Order。

无效的标签: FIX Initiator或FIX Acceptor发送的标签不是特定FIX版本在FIX规范中指定的,例如FIX4.2

没有为该消息类型定义标记: FIX initiator或FIX Acceptor正在发送某一标记不是在FIX 规范中为该特定消息类型指定的标记,例如在登出消息中发送TestReqID。

未定义的标签: 如果某一发送者FIX引擎正在发送自定义标签,而接收引擎没有配置或支持该标签。

没有指定值的标签: 例如35=,该特定的FIX标签没有值。这不是一个有效的FIX消息,因此接收FIX引擎将拒绝它。

Sequence Reset

序列重置也称为间隙填充(Gap Fill)消息,由FIX标记35=4或FIX MsgType 35=4表示。它用于响应重发请求(FIX tag 35=2或MsgType=2),通过发送FIX引擎来重置对方FIX引擎上收到的序列号。Sequence Reset message (FIX tag 35=4)在两种不同的模式下操作,一种是GapFillFlag (FIX tag 123)是’Y’,也称为Sequence Reset - GapFill; 另一种模式是GapFillFlag (FIX tag 123)是’N’或不存在,也称为Sequence Reset - Reset mode。按照FIX协议规范,“Sequence Reset (FIX tag 35=4)-Reset”模式仅用于从无法通过“Gap Fill”模式恢复的灾难情况中恢复。

Sequence Reset或GapFill消息(fix tag 35=4)可以在以下情况下有用:

  1. 在处理重发请求(FIX tag 35=2或MsgType=2)时,发送FIX引擎可能选择不发送消息(例如一个过时的订单)。序列重置 Gap Fill (tag 35=4)可以用来填充该消息的位置。
  2. 在处理Resend Request (FIX tag 35=2或MsgType=2)发送时,如果所有消息都是管理级或会话级消息,那么FIX Engine可能选择不发送消息,因为在这种情况下,重新发送它们是没有意义的。Sequence Reset (FIX tag 35=4) - Gap Fill用于填充消息或序列间隙。

Logout

在FIX协议规范中,注销消息由FIX标记35=5或MsgType=5表示,它用于终止或关闭任何FIX会话。如果接收方FIX引擎无法验证客户端,它将发送一个登出消息(FIX标记35=5),连接将被终止,尽管套接字连接仍然存在。

如果接收到序列号低于预期的修复消息,接收方FIX引擎也可以发送登出消息(修复标记35=5)。注销消息(标记35=5)用于终止FIX会话。没有交换登出消息(tag 35=5)的会话终止或断开连接被视为异常情况。

在实际终止或关闭会话之前,交换登出消息(fix tag 35=5)允许FIX引擎发送方执行任何可能需要或必要的Sequence Reset (fix tag 35=4)或Gap fill操作。登出发起者还应该等待对方的FIX引擎响应确认登出消息(FIX标记35=5),如果远程FIX engine在指定的时间内没有响应,它可以终止会话。

FIX协议教程1-什么是FIX会话和管理消息相关推荐

  1. 交易系统开发(十)——FIX协议

    一.FIX协议简介 1.FIX协议简介 FIX(Financial Information eXchange Protocol,金融信息交换协议)是由国际FIX协会组织提供的一个开放式协议,目的是推动 ...

  2. fix协议封装 java_FIX协议-接入总结

    FIX协议-接入总结 它是由国际FIX协会组织提供的一个开放式协议,目的是推动国际贸易电子化的进程,在各类参与者之间,包括投资经理.经纪人,买方.卖方建立起实时的电子化通讯协议.Fix协议的目标是把各 ...

  3. FIX协议介绍与QuickFIX使用入门(上)

    定义 FIX协议是由国际FIX协会组织提供的一个开放式协议,目的是推动国际贸易电子化的进程,在各类参与者之间,包括投资经理.经纪人,买方.卖方建立起实时的电子化通讯协议. FIX协议的目标是把各类证券 ...

  4. fix协议的服务器,FIX 协议开发(3):QuickFIX/J 实战经验小结

    本系列导航 代码结构 这里主要讲一下我们的思路,具体的代码不方便贴上来. 首先需要实现 Application,主要是其中的 fromApp(),需要 crack 不同类型的 Message.处理这些 ...

  5. fix协议的服务器,Fix8

    软件简介 Fix8 是 C++ FIX 协议框架,帮你快速开发 FIX 客户端和服务器端,可静态编译 FIX XML 模式以及快速建立基于这个 XML 的应用. FIX 是行业驱动的消息传输标准,全程 ...

  6. SIP协议简介(二)之会话建立的详细过程(INVITE)

    SIP是基于一个类似HTTP协议的请求应答的通讯模式.每一个通讯都包含对某个功能的请求,并且起码需要一个应答.在这个应答中,通信双方的Alice的软电话发送一个含有通信双方的Bob的SIP URI抵制 ...

  7. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...

  8. JAE京东云引擎Git上传管理代码教程和京东云数据库导入导出管理

    文章目录 Git管理准备工作 Git工具上传代码 发布代码装程序 mywebsql管理 京东云引擎小结 JAE京东云引擎是京东推出的支持Java.Ruby.Python.PHP.Node.js多语言. ...

  9. WebService大讲堂之Axis2(6):跨服务会话(Session)管理

    在<WebService大讲堂之Axis2(5):会话(Session)管理>一文中介绍了如何使用Axis2来管理同一个服务的会话,但对于一个复杂的系统,不可能只有一个WebService ...

  10. 了解TCP协议,IP协议、ICMP协议和ARP协议(TCP报文,TCP的分成管理,TCP与UDP,TCP的三次握手四次挥手原理)

    文章目录 了解TCP/IP协议 TCP报文格式 TCP/IP 的分层管理 TCP与UDP TCP的三次握手与四次挥手 为什么要三次握手? 为什么要四次挥手? IP数据包格式 ICMP协议 ICMP协议 ...

最新文章

  1. 自然语言处理深度学习篇-BiLSTM文本挖掘实践 命名实体识别
  2. 批量按照文件大小排序并修改文件名
  3. C言语选择排序算法及代码
  4. JsCV Core v0.2发布 Javascript图像处理系列目录
  5. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解
  6. android 手动 打包,android 手动打包apk
  7. Win7开发系列: Win7 UAC帮助类
  8. 顶级隐写术,破坏一切解释器
  9. 解放人与设备距离,5G时代的远程操控该如何完成
  10. SpringBoot配置文件敏感信息加密,springboot配置文件数据库密码加密jasypt
  11. opencv3.2.0形态学滤波之开运算、闭运算
  12. 电脑Bois中usb模式启动热键
  13. Java判断字符串是否是数值
  14. C语言通过数组指针获取长度
  15. 解决向github提交代码不用输入帐号密码
  16. Create Material by BDC and BAPI
  17. win7 或 win10系统开机启动项设置
  18. Mac上好用的视频播放器有哪些?
  19. kinect体感绿幕抠像,AR虚拟互动拍照,体感抠像拍照
  20. 艺赛旗(RPA)UEBA、RPA 客户端设置部门

热门文章

  1. 9月第1周基金排行榜 | TokenInsight
  2. 上古卷轴5捏脸php导入,上古卷轴5捏脸预设导入 上古卷轴5捏脸预设怎么导入
  3. 私有云服务器同步盘的定义及优势详解!
  4. 第三篇--编译CM系统
  5. android 系统重新安装程序,Android应用程序更新时的安装与卸载(调用系统方法)...
  6. 微软快捷键截图_所有最好的Microsoft Excel键盘快捷键
  7. SHAP解释模型(二)
  8. javascript当中onblur和onfocus用法
  9. 【原创】2019.10.24模拟赛 嘟嘟噜/天才绅士少女助手克里斯蒂娜/凤凰院凶真
  10. Unity 多人联机游戏(一)