quickfix应用开发指南

Discussion in 'FIX Protocol' started by tom_sh, Nov 24, 2010.

  1. 本贴与CTS FIX系统技术资料配合,主要介绍FIX客户端(交易)应用的开发要点和经验。目前网上缺乏入门级的资料,在本贴完成之前,大家可以先参考 http://staff.prosoftwarefactory.com.ar/blogs/julian/?p=11

    开发FIX应用一般基于一个符合FIX标准的底层库(engine)来做。这个库有商业化的、有开源的、也有完全是自己写的,我都见过。相对而言,商业化的库管理功能更丰富,开源的库参考资源更多,而自己写的可能性能会好一些。本贴仅讨论使用开源的QUICKFIX的应用开发。有关quickfix的资料和下载请参见www.quickfixengine.org。

    FIX协议规范由FIX组织维护(www.fixprotocol.org),建议开发从fix4.2入手,网站上有手册下载,也有fixmate提供快速查询。

    1)应用模式
    FIX有两种应用模式:initiator和acceptor。initiator是TCP连接的发起方,acceptor是侦听方。initiator和acceptor类似但不等同于客户端与服务端的概念。标准的FIX应用(如CTS FIX网关)可以同时支持两种模式,也就是说既可以发起连接,也可以接受连接请求。我们通常意义上的服务端一般是部署在经纪商(卖方)一侧的,仅接受投资者(买方)发起连接。但在FIX应用中,这个经纪商服务端应用可以反过来向投资者端发起连接,也就是采用initiator模式。这点要特别注意。
    所以开发一个FIX应用,要先考虑采用哪种模式(最理想的是两种都支持),然后选择对应的QUICKFIX类来编码。对于initiator/acceptor,quickfix分别有sockeinitiator, threadedsocketinitiator, socketacceptor, threadedsocketacceptor可供选择。最简单的应用方案是使用threadedsockeinitiator做一个交易客户端。
    2)配置
    工程配置方面请参考 http://www.quickfixengine.org/quickfix/doc/html/project.html
    环境参数配置方面请参考 http://www.quickfixengine.org/quickfix/doc/html/configuration.html
    上面环境配置可以使用一个配置文件,作为主应用的构造函数(即Application类,见下段)的入口参数。
    3)会话与消息
    FIX业务是通过initiator与acceptor之间建立一个TCP会话并交换消息来进行的。FIX业务消息有一系列预定义类型与格式。目前标准的消息类型(类比于证券柜台的功能号)有5、60个,函盖了交易、行情、结算等投资管理的各个环节。FIX应用基本上就是对FIX业务消息的编程,本贴我们只讨论交易类消息及其业务。
    消息是类xml的字符串,串的格式是:tag1=value1分隔符tag2=value2分隔符...tagN=valueN分隔符,即用分隔符隔开的tag/value对。这里的tag是标准化的key,而value是规定类型或格式的值,可能是自由赋值(如价格),也可能是列举值(如委托类型)。
    消息、tag和value的定义一般参考FIX字典(见下段)。
    可以使用自定义的消息类型并定义其格式来支持各种扩展业务。
    4)版本和字典
    通过配置,一个FIX应用可以管理多个FIX通讯会话,每个会话可以采用相同的FIX协议版本,也可以采用不同的版本。即使采用的是相同的协议版本,会话间也可以有协议细节的差异,这通过绑定会话与协议字典的方式来实现,即在[Session]配置项中加一条“DataDictionary=指定的FIX字典文件”来实现。使用字典管理会话给FIX业务带来很大的便利。
    5)编码规范
    • 创建一个主应用类,实现QuickFix.Application接口,即oncreate(), onlogon(), onlogout(), fromaddmin(), fromapp(), toadmin(), toapp()函数,用于应用的lifetime管理,如初始化、监控等,一般在此不做业务逻辑处理;
    • 重写Send()/OnMessage()函数对,在此函数内做业务逻辑处理。FIX业务都是异步方式处理的,而业务处理的基本对象是消息。Send用于发送消息,OnMessage是消息接收回调函数。Send/OnMessage都有多个重载,或者通过入口消息类型加以区分,如Send(委托消息/撤单消息/...)/OnMessage(执行回报消息/行情消息/...);或者通过FIX消息版本号加以区分,如Send(fix42.委托消息/fix44.委托消息/...)。一般而言,我们只需要使用一个FIX版本来开发应用;
    • 对于FIX交易业务,一般要实现(重写)4个基本消息,即Send(NewOrderSingle)、Send(CancelRequest)、 OnMessage(ExecutionReport)、 OnMessage(CancelReject),分别用于做委托、撤单、执行回报(包括对委托的拒绝)和对撤单的拒绝等4项业务。从业务逻辑的完整性出发,还应该实现Order Status Request、Don't Know Trade和Business Message Reject等消息处理函数,但应首先确认应用的对端是否同样支持这些消息的收或发。
    6)code范例
    quickfix的源码包中examples子目录中有样本代码,其中executor和ordermatch是acceptor应用,tradeclient和tradeclientgui是initiator应用。ordermatch与tradeclient是c++,tradeclientgui是java,executor有多语言代码。
    7)注意事项
    • 对于C#代码,注意在消息使用完成后,必须调用message.dispose释放资源;
    • 由于quickfix的底层编码的原因,在主动断开连接后如果应用重新发起连接请求,将会抛出异常(.net环境下已知,不清楚其他语言的情况)。如需避免这种情况,需要退出并重新启动应用;
    未完待续...
     
    Last edited by a moderator: Dec 20, 2010
  2. 最关键的一点:这玩意能干什么?
     
  3. 烤鸡翅膀的国际标准装备
     
  4. code once, trade everywhere
     
  5. 国内股票和期货市场能用吗?
     
  6. 建议TOM大哥在可能的情况下公开个FIX的股票接口协议和对应的客户端简单示例,这样大家就可以比较容易的入门了。对于整个FIX,比较庞大,涉及的内容也很多,对于群里一般交易者,很多内容是不需要去操作的,而且大家的基础可能比较薄,全部掌握比较困难。
     
  7. ;) 同感。(另谢谢TOM大,资料已查收。)
     
  8. tom大哥,你们提供这个接口要申请吗? 我是你们国信的客户,想你们提供这个接口给我。
     
  9. 学习学习