QuickFix Java 讲解(二)搭建框架、解决依赖

本系列力求手把手教你怎样利用 QuickFix Java 搭建自己的 FIX 协议收法平台,以及其中的注意事项。

所有源码的地址(免费):

https://github.com/zongzhec/QuickFixPractise

 

本节我们主要讨论如何在配置QuickFIX的收发方。

2. 前期准备

2.1. 通信的双方及其理解

上一节我们说过,FIX是一种协议,或者说一种“暗号”。想体验这种“暗号”的作用,咱们至少得要准备通信的双方:一个发送消息,一个接受并处理消息。

通常来说,发送方我们称为 Initiator,接收方称为 Acceptor。当然了,你也可以这么称呼:发送方为客户端(Client),接收方为服务器端(Server)。

看到这里,你可能会问:通信是双向的,为什么会有“发送”和“接收”这一说?

——这里我们的立足点是新建的订单。一个订单在交易员那里生成了,则会由交易机器发送给中央系统进行交易。一个中央系统会对应很多的交易机器。

因此,我们要新建两个项目,一个模拟发送方(客户端),一个模拟接收方(服务器端)。

2.2. 项目的依赖

简单起见,我们只依赖于quickfix,暂时不引入其他依赖。

dependencies {
    compile group: 'org.quickfixj', name: 'quickfixj-all', version: '2.2.0'
}

 

3. 配置文件

配置文件,简化来讲,有两个:一个是程序调用的properties,另一个是传输时候的字典,相当于“密码本”。

两个文件都放在src/main/resources下面即可。

3.1. quickfix.properties

先看一下文件内容:

#quickfix-server.properties
[default]
# 这些字段接的改成你的设置
FileStorePath=fileStore
SocketConnectHost=XXX.XXX.XXX.XXX
SocketConnectPort=XXXXX
TargetCompID=QUICKFIX_ACCEPTOR

# 以下字段可以不改
ConnectionType=initiator
HeartBtInt=30
ReconnectInterval=10
FileLogPath=log
UseDataDictionary=N
DataDictionary=src/main/resources/FIX44.modified.xml
ContinueInitializationOnError=Y
BeginString=FIX.4.4
StartTime=00:00:00
EndTime=23:00:00
ResetOnLogon=Y
ResetSeqNumFlag=Y
MaxMessagesInResendRequest=1

[session]
SenderCompID=QUICKFIX_INITIATOR1

[session]
SenderCompID=QUICKFIX_INITIATOR2

首先能看到,配置被分为3大类:开头的[default],然后是两个[session]。

session的意思是,你作为发送方时,不一定发给一个人。或者你作为接收方时,不一定只接收一个人的信息。每个session下面配了不同的SenderCompID,意思就是可能会有很多Sender给我发消息,因此我要根据不同的SenderComID来区别不同的发送方。这个名字可以随便起,只要保证收发双方一致。

其他公用的部分可以放在[default]里面,其中:

  • FileStorePath是存储消息和事件的文件夹,确保一定要有写的权限;
  • SocketConnectHost和SocketConnectPort 是你Accepter的IP地址和端口;
  • TargetCompID 是你发的消息由谁来接收(和SenderCompID对应);
  • ConnectionType是你扮演的角色,有initiator和acceptor两种;
  • HeartBtInt是心跳间隔。

3.2. FIX44.modified.xml

在实际业务中,我们会对字典进行一定修改,比如让某些字段从“必须有”到“可以有”,增减某些消息里面的某些字段,甚至定义自己的新消息。在这个时候,我们就可以在原有FIX44.xml的基础上维护我们自己的“密码本”,取个名字:FIX44.modified.xml。

你可以点击这里查看本教程的FIX44.modified.xml:https://github.com/zongzhec/QuickFixPractise/blob/master/FixAcceptor/src/main/resources/FIX44.modified.xml

在这里我们能看到如下架构(以MarketDataRequestReject为例):

        <message name="MarketDataRequestReject" msgtype="Y" msgcat="app">
            <field name="MDReqID" required="N"/>
            <field name="MDReqRejReason" required="N"/>
            <group name="NoAltMDSource" required="N">
                <field name="AltMDSourceID" required="N"/>
            </group>
            <field name="Text" required="N"/>
            <field name="EncodedTextLen" required="N"/>
            <field name="EncodedText" required="N"/>
        </message>

每一个消息都在message的标签内:

  • name="MarketDataRequestReject" 表示名字;
  • msgtype="Y" 表示他的类别,在传输的时候会表现为“35=Y”;
  • msgcat="app" 表示他是App层的传输。另外一个是Admin;
  • field name="MDReqID" required="N" 表示这个消息有个字段叫MDReqID,并且在传输的时候不是必须的。如果一个字段定义为required="Y"但是实际没有传,那么这条消息就会被自动拒收,并返回“35=3”的消息高速对方;
  • group name="NoAltMDSource" 表示里面有个重复组,即一个消息中可能多次出现同一个字段(比如我在查询行情的时候可能查询多个产品的行情),那么这可以“重复”的字段就必须定义在重复组里。

 

下一节我们讲怎么搭建Initiator端。

 

 

 

 

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值