QuickFix/J 源代码研究(三)
guibin.beijing@gmail.com
(三). 客户化FIX解析
基础知识:以下文章内容描述的前提是已经根据自己的业务规则,生成了符合要求的数据字典,并且使用QuickFix/J自带的 ant 的 jar target生成了客户化的协议解析代码。生成协议解析代码的流程和细节,请参考文章QuickFix/J 源代码研究(二)。
1. 在QuickFix/J的设计中,为了解除message factory和相应的协议的解析代码的耦合关系,quickfix.DefaultMessageFactory会在runtime时使用reflection动态发现解析协议的代码。因此,如果你有自定义的数据字典,并且已经根据该字典生成了解析该协议的代码,请别忘记在DefaultMessageFactory中加入相应协议的消息工厂
discoverFactory(beginString, factoryClassName)。
2. DefaultMessageFactory有两个主要功能,一个是创建Message(根据beginString和msgType),另一个是创建Group(根据beginString、msgType和correspondingFieldID)。相应的,根据数据字典生成的解析协议的代码中,当然有MessageFactory了,而且这个MessageFactory当然会创建Message和Group。
3. DefaultMessageFactory创建Message时,首先根据beginString查找相应版本的消息工厂,找到了则create相应的Message,否则new一个默认的quickfix.Message。
4. MessageCracker的用法。当自动生成解析协议的代码之后,肯定会生成对应版本的MessageCracker。仔细阅读这个新生成的MessageCracker,你会发现其中有很多的onMessage方法内部没有实现,并且加入了默认的throw new UnsupportedMessageType();语句。在实际使用中,用户需要创建自己的Application,并且extends quickfix.MessageCracker implements quickfix.Application。由于Override,这些throw new UnsupportedMessageType自然会被屏蔽。
如果用户需要取到Message中的内容,做相应的业务逻辑,首先在用户的Application.fromApp中crack(message, sessionId),crack类似message cracker的工厂,它根据message header选择相应的message cracker,然后回调相应的onMessage。onMessage正好在用户Application中Override实现。
5.
客户化协议的客户端Initiator实现总结
a) 创建处理类,extends MessageCracker implements quickfix.Application implements quickfix.ApplicationExtended
b) 在fromApp中添加crack(message, sessionId);
c) 对需要处理的消息实现相应的onMessage
d) 创建SocketInitiator实例,填入客户化的application,messageStoreFactory,settings,logFactory,messageFactory。
e) start initiator。
6. 如果想把收到的每个消息单独存成一个文件备份,比如dbf之类的,该如何实现?
a) 方案1. 实现自己的MessageStore。QuickFix/J中提供了现成的FileStore,可以将所有的消息存入同一个文件中。
b) 方案2. 在Application的fromApp接口中,获取相应的Message,提取所需要素,存盘。
两个方案的比较:方案2减少了一次从String到Message的解析,效率应该更高。因为MessageStore的输入是StringMessage,需要再次解析才能得到Message。
7. FIX标准协议中规定了消息(Message)应该都至少有一个字段(Field),如果在客户化自己的FIX协议解析时,发现某些Message没有字段,则需要解除QuickFix/J中对这个条件的限制,具体在quickfix.Dictionary。
private void load(Document document, String msgtype, Node node) throws ConfigError {
...
// if (fieldNodes.getLength() == 0) {
// throw new ConfigError("No fields found: msgType=" + msgtype);
// }
...
}
8. 在QuickFix/J的实现中,关于不同版本的协议都有这样一个假设,就是如果Fix版本号小于等于"FIX.4.4"则是一种逻辑,大于FIX4.4是一种逻辑。那么就需要注意在客户化时你定义的协议版本(即FIX的beginString)是多少,是不是从字符串比较的角度看小于等于"FIX.4.4"。如果不是,则需要在诸多的地方更改QuickFix/J的逻辑。比如在quickfix.DataDictionary.load中:
private void load(InputStream inputStream) throws ConfigError {
...
if (beginString.startsWith(FIXT_PREFIX) || beginString.compareTo(FixVersions.FIX50) < 0) {
...
...
}
9. QuickFix/J在实现中,默认消息(Message)头(Header)中使用的时间都是UtcTimeStamp,如果在客户化中不使用UTC时间,而使用本地时间的化,
a) 添加本地时间的数据类型,比如LocalTimeStampField,可以仿照quickfix.UtcTimeStampField。其他还需要添加跟本地时间相关的LocalDateOnlyField,LocalTimeOnlyField,LocalTimeStampConverter,LocalDateOnlyConverter,LocalTimeOnlyConverter
b) 在使用TimeStamp的地方,添加版本判断,根据版本看是使用本地时间还是UTC时间。需要修改地方大概有:Session.doTargetTooHigh,Session.generateSequenceReset,Session.initializeResendFields,Session.validatePossDup,Session.verify。
10. QuickFix/J在实现中,心跳设置(HeartBtInt)由客户端(Initiator)决定,而STEP协议则规定心跳由服务器端(Acceptor),这需要修改DefaultSessionFactory.create(sessionID, settings)中关于角色和HeartBtInt的设置。并且还需要修改Session.nextLogon(message)中登陆之后读取HeartBtInt并设置到state中的逻辑。
Guibin
2010-12-30
分享到:
相关推荐
8. **社区支持**:作为开源项目,QuickFIX/J拥有活跃的社区,提供了丰富的文档、示例代码和问题解答,有助于开发者快速上手和解决问题。 9. **安全特性**:支持SSL/TLS加密,确保交易数据在传输过程中的安全性。 ...
QuickFIX/j是QuickFIX家族的一员,是一个开源、跨平台的Java实现,旨在简化FIX消息的处理。本教程将通过一个简单的Java示例介绍如何使用QuickFIX/j来理解和应用FIX协议。 首先,我们需要理解FIX协议的基础。FIX协议...
本文将深入探讨C# QuickFix的使用、例子和源代码分析。 首先,FIX协议是金融机构之间通信的标准,用于传输订单、报价、交易确认等各种金融信息。QuickFixN库使得C#开发者能够轻松地解析、创建和发送这些FIX消息,...
QuickFIX /转到 网站: : 邮件列表: Go中实现的开源库 入门和文档 安装 要安装QuickFIX / Go,请使用go get : $ go get github.com/quickfixgo/quickfix 保持最新 要更新QuickFIX / Go到最新版本,请使用go ...
QuickFIX / J 这是官方的QuickFIX / J项目存储库。介绍QuickFIX / J是用于FIX协议(FIX版本4.0-5.0SP2 / FIXT1.1)的全功能消息传递引擎。 它是流行的C ++ QuickFIX引擎的100%Java开源实现。 金融信息交换(FIX)...
QuickFIX / J是流行的QuickFIX开源FIX协议引擎的100%Java实现。 QuickFIX / J功能包括对FIX协议版本4.0至4.4和5.0 / FIXT1.1(www.fixprotocol.org)的支持。 请注意,SourceForge SVN存储库是只读的。 当前仓库...
1. 源代码文件:展示了 QuickFix 的内部实现,包括消息解析、网络通信和事件处理等功能。 2. 示例代码:提供了使用 QuickFix 进行FIX消息交互的基本示例,可以帮助初学者快速上手。 3. 配置文件:通常为 `.ini` 或 `...
QuickFIX/J 2.2.0 是一个针对金融行业的开源消息引擎,专门处理基于FIX(Financial Information eXchange)协议的数据交换。FIX协议是全球金融市场广泛采用的标准,用于在金融机构之间传输交易和市场数据。QuickFIX/...
QuickFix,全称为"Financial Information eXchange"(金融信息交换),是一个开源的、跨平台的C++库,专门用于处理FIX(金融信息交换协议)消息。FIX协议是金融行业中广泛使用的标准通信协议,用于在金融机构之间...
*数据收集选项,包括每日历史数据,日内数据和实时数据* MATLAB 中的模型构建和原型设计* 回测和校准模型*与现有的库和软件进行交互以执行交易(X_Trader,QuickFIX / J,消息队列) 建议您观看网络研讨会以了解...
典型的基于quickfix业务的二进制文件适用于经典Linux服务器。 安装quickfix库 仔细检查您的版本是否最新,足以在内部支持SSL并将其。 最简单的检查Quickfix库 受启发,一个应该测试我们以前的quickfix安装。 从根本...
在"quickfix"这个压缩包文件中,可能包含了QuickFix的源代码、文档、示例项目以及配置文件等资源。通过这些资源,开发者可以学习QuickFix的工作原理,理解其API使用方法,并将QuickFix应用到实际的交易系统中。对于...
`.whl`文件是Python的Wheel格式,是一种预编译的Python包,可以直接通过pip安装,无需编译源代码,这简化了安装过程。 使用QuickFix Python库,开发者可以方便地集成FIX通信功能到他们的应用程序中,无论是创建订单...
quickfix, 在Go中,修复协议库 quickfix 网站:http://www.quickfixgo.org邮件列表:GoogleGo中实现的开源修复协议库入门和文档用户手册API文档安装要安装 quickfix/围棋,请使用 go g
在"quickfix-1.13.3.rar"文件中,我们可以找到Quick Fix框架的1.13.3版本源代码或库。这可能包含了用于集成到你项目的API,以及用于调试和配置的文档。开发者可以通过这个库来构建自己的FIX应用程序,如订单管理系统...
【联想Quick Fix快速修复工具详解】 联想Quick Fix是一款专为联想电脑用户设计的故障诊断和修复工具,旨在帮助用户快速解决计算机中遇到的各种问题。它集合了多种实用功能,包括系统优化、硬件检测、驱动更新等,...
FIXimulator是一款基于Java开发的FIX(Financial Information eXchange)交易模拟器,它利用了开源的QuickFIX/J库,这是FIX协议的一个强大的Java实现。FIX协议是一种广泛用于金融市场的通信协议,用于在金融机构之间...
开发quickfix所需要的dll引用 官方的DLL