如何理解FIX协议的原理、消息格式及配置开发

发布时间:2021-11-23 17:58:26 作者:柒染
来源:亿速云 阅读:224

本篇文章给大家分享的是有关如何理解FIX协议的原理、消息格式及配置开发,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、定义

FIX协议是由国际FIX协会组织提供的一个开放式协议,目的是推动国际贸易电子化的进程,在各类参与者之间,包括投资经理、经纪人,买方、卖方建立起实时的电子化通讯协议。FIX协议的目标是把各类证券金融业务需求流程格式化,使之成为一个个可用计算机语言描述的功能流程,并在每个业务功能接口上统一交换格式,方便各个功能模块的连接。

二、协议工作原理

2.1 通信模型及基本概念

通信模型

Fix connection

FIX连接 由3部分组成:logon登录,message exchange消息传输,logout注销。

如何理解FIX协议的原理、消息格式及配置开发

如何理解FIX协议的原理、消息格式及配置开发

Fix session

FIX会话由一个或多个FIX Connection FIX连接组成。一个FIX会话可以有多次登录。

序列号

心跳

数据完整校验

校验代码:

样例:8=FIX.4.29=7335=A34=149=CLIENT52=20181119-10:42:48.76856=SERVER98=0108=30141=Y10=208
1、消息长度:9=73
35=A34=149=CLIENT52=20181119-10:42:48.76856=SERVER98=0108=30141=Y(这段长度)
2、效验码检查
char *GenerateCheckSum( char *buf, long bufLen ) {
static char tmpBuf[ 4 ]; long idx;
unsigned int cks;
for( idx = 0L, cks = 0; idx < bufLen; cks += (unsigned int)buf[ idx++ ] ); sprintf( tmpBuf, “%03d”, (unsigned int)( cks % 256 ) );
return( tmpBuf );
}

消息确认

加密

自定义域

三、消息格式

3.1 数据类型

整数int,浮点数float,单个字符char,布尔Boolean,字符串String,数据data 

3.2 域

常见域

Tag(标记)FieldName(域名)备注
8BeginString起始串,FIX协议版本
9BodyLength消息长度
35MsgType消息类型:例如F=Order Cancel Request,取消订单
11ClOrdID客户端订单ID
37OrderID服务端订单ID
41OrigClOrdID原始客户端订单ID
54Side买卖类型。例如:1 = Buy,2 = Sell
55Symbol股票代码。例如:YRD
10CheckSum校验码

域语法

安全与加密

3.3 消息

消息头

每一个会话或应用消息有一个消息头,该消息头指明消息类型、消息体长度、发送目的地、消息序号、发送起始点和发送时间。

Tag域名必需说明
8BeginStringY起始串,取值:FIX.4.2(不可加密,消息的第一个域)
9BodyLengthY消息体长度(不可加密,消息的第二个域)
35MsgTypeY消息类型(不可加密,消息的第三个域)
49SenderCompIDY发送方代码(不可加密,发送方标识符)
59TargetCompIDY接收方代码(不可加密,接收方标识符)
115OnBehalfOfCompIDN最初发送方标识符(可加密),用于经第三方发送。
128DeliverToCompIDN最终接收方标识符(可加密),用于经第三方发送。
90SecureDataLenN密文数据长度
91SecureDataN密文数据(紧跟密文数据长度域)
34MsgSeqNumY消息序号(可加密),如果交易双方不采用 FIX 会话 机制,可将该 tag 置为一个固定的值,例如 0。
50SenderSubIDN发送方子标识符(可加密)
142SenderLocationIDN发送方方位标识符(可加密)
57TargetSubIDN接收方子标识符(可加密)
143TargetLocationIDN接收方方位标识符(可加密)
116OnBehalfOfSubIDN最初发送方子标识符(可加密)
144OnBehalfOfLocationIDN最初发送方方位标识符(可加密)
129DeliverToSubIDN最终接收方子标识符(可加密)
145DeliverToLocationIDN最终接收方方位标识符(可加密)
43PossDupFlagN可能重复标志,重复发送时,作此标记。(可加密)
97PossResendN可能重发标志。(可加密)
52SendingTimeY发送时间(可加密)
122OrigSendingTimeN原始发送时间(可加密)
347MessageEncodingN消息中 Encoded 域的字符编码类型(非 ASCII 码)
369LastMsgSeqNumProcesse dN最后处理消息序号(可加密)
370OnBehalfOfSendingTimeN最初发送时间(用 UTC 表示时间)

消息尾

每一个消息(会话或应用消息)有一个消息尾,并以此终止。消息尾可用于分隔多个消息,包含有 3 位数的校验和值。

Tag域名必需说明
93SignatureLengthN数字签名长度(不可加密)
89SignatureN数字签名(不可加密)
10CheckSumY校验和,消息的最末域。(不可加密)

新订单消息(MsgType=D)

对于在消息头中设置了 PossResend 标志的订单消息,应当使用交易客户方订单编号(ClOrdID)核 实是否已收到该订单,具体实现时还应检查订单参数(买卖方向、证券代码、数量等)进行核实。如果 之前收到该订单,应以执行报告消息回应订单状态。如果之前未收到,则以执行报告消息回应订单确认。

如何理解FIX协议的原理、消息格式及配置开发

Tag域名必需说明

标准消息头YMsgType=D
11ClOrdIDY交易客户方订单编号,在订单有效交易日内必需
109ClientIDY客户资金帐号
1AccountY客户交易编码
110MinQtyN最小成交量。
55SymbolY期货合约代码
167SecurityTypeNFUT = 期货
200MaturityMonthYearN用于指定期货到期的年和月
205MaturityDayN用于期货的到期日期,并被与到期年月(MaturityMonthYear)联合使用
207SecurityExchangeY用于指定交易所
77OpenCloseY指明开仓,平仓
8009HedgeFlagY投机套保标志
8010TouchConditionN触发条件
54SideY买卖方向
38OrderQtyN委托手数
60TransactTimeY订单发起时间
40OrdTypeY订单类型
44PriceN价格(限价订单时有效)
423PriceTypeN价格类型
99StopPxN停止价
15CurrencyN币种
59TimeInForceN新订单生效时间,默认为当日有效
168EffectiveTimeN用于指定定单有效的时间
432ExpireDateN有条件地用于在生效时间(TimeInForce)=在某 日前有效(GTD),而没有指定截止时间 (ExpireTime)的情况之下
126ExpireTimeN有条件地用于生效时间(TimeInForce) = 在某 日前有效(GTD)和到期日没有被指定的情况之 下
8096MacNetInfoN委托方的机器网络信息

标准消息尾Y

执行报告消息(MsgType=8)

Tag域名必需说明

标准消息头YMsgType=8
37OrderIDY期货公司委托号,同个交易日必需保证唯一
11ClOrdIDN交易客户方订单编号。如果是强平回报,则该值 取值为以”NONE”开头的当天交易日唯一的字符 串标识
42OrigClOrdIDN原始交易客户方订单编号,指示被撤消订单的 ClOrdID
17ExecIDY期货公司的执行编号,在订单有效交易日内应保证唯一
150ExecTypeY执行类型
39OrdStatusY订单状态
103OrdRejReasonN订单拒绝时需要
109ClientIDY客户资金帐号
1AccountY客户交易编码
55SymbolY期货合约代码
167SecurityTypeNFUT=期货
200MaturityMonthYearN到期年月
205MaturityDayN到期日期
207SecurityExchangeY用于指定交易所
77OpenCloseN指明开仓,平仓
54SideY买卖方向
38OrderQtyY委托手数
40OrdTypeN订单类型
44PriceN订单价格
99StopPxN停止价
59TimeInForceN新订单生效时间,默认为当日有效
15CurrencyN币种
32LastSharesN上一成交数(最近一笔成交数量)
31LastPxN上一成交价(最近一笔成交价格)
30LastMktN上一成交市场
151LeavesQtyY订单剩余数量
14CumQtyY成交总数
6AvgPxY成交平均价
60TransactTimeN执行报告时间
381GrossTradeAmtN成交总金额
110MinQtyN最小成交量
8500OrderEntryTimeN订单申报时间
8093DeclarationIDN报单号
8094TradeIDN撮合编号

标准消息尾Y

订单状态请求消息(MsgType=H)

订单状态请求用于向交易服务方请求某订单的状态,交易服务方通过执行报告消息返回订单状态。

Tag域名必需说明

标准消息头YMsgType=H
37OrderIDY期货公司委托号,同个交易日必需保证唯一
11ClOrdIDY交易客户方订单编号
109ClientIDY客户资金帐号
1AccountY客户交易编码
55SymbolY期货合约代码
207SecurityExchangeY用于指定交易所
167SecurityTypeNFUT=期货
200MaturityMonthYearN用于指定期货到期的年和月
205MaturityDayN用于期货的到期日期,并被与到期年月(MaturityMonthYear)联合使用
54SideY买卖方向

标准消息尾Y

撤单消息(MsgType=F)

撤单消息用以撤消订单的全部订单剩余数量。

撤单消息也被赋予一个 ClOrdID,可视作另外一个订单。如果被拒绝,撤单拒绝消息的 ClOrdID 放 置撤单消息的 ClOrdID,而原始订单的 ClOrdID 则放入 OrigClOrdID 域。ClOrdID 要保证唯一。

Tag域名必需说明

标准消息头YMsgType=F
41OrigClOrdIDY原始交易客户方订单编号,指示被撤消订单的ClOrdID
37OrderIDY期货公司委托号,同个交易日必需保证唯一
11ClOrdIDY交易客户方订单编号
109ClientIDY客户资金帐号
1AccountY客户交易编码
55SymbolY期货合约代码
167SecurityTypeN证券代码源
200MaturityMonthYearNFUT=期货
205MaturityDayN期货到期年月
207SecurityExchangeY期货到期日期
54SideY买卖方向
60TransactTimeY订单发起时间
40OrdTypeY订单类型
38OrderQtyY委托手数
8093DeclarationIDN报单号
58TextN

标准消息尾Y

撤单拒绝消息(MsgType=9)

本消息用于撤单消息的拒绝。

交易服务方接收到撤单发现无法执行(已成交订单不可更改等),将发送撤单拒绝。

拒绝撤单时,撤单拒绝消息应用 ClOrdID 指示撤单的 ClOrdID,用 OrigClOrdID 指示之前最后接受的订单(除非拒绝原因是“未知订单”)。

Tag域名必需说明

标准消息头YMsgType=9
37OrderIDY期货公司委托号,同个交易日必需保证唯一
11ClOrdIDY交易客户方订单编号
41OrigClOrdIDY原始交易客户方订单编号,指示被撤消订单的ClOrdID
39OrdStatusY订单状态
109ClientIDY客户资金帐号
1AccountY客户交易编码
60TransactTimeN订单发起时间
434CxlRejResponseToN撤单拒绝回应类型
102CxlRejReasonN撤单拒绝原因
58TextN

标准消息尾Y

四、FIX配置

4.1 会话配置(SESSION)

配置描述有效值默认
BeginString会话使用的FIX版本号(发送和接收消息起始字符串)FIXT.1.1、FIX.4.4、FIX.4.3、FIX.4.2、FIX.4.1、FIX.4.0
SenderCompID会话当中定义本方的ID区分大小写的字符串
SenderSubID会话相关的本方的子ID号 (可选)区分大小写的字符串
SenderLocationID会话相关的本方的locationID号 (可选)区分大小写的字符串
TargetCompID本会话当中的对方ID区分大小写的字符串
TargetSubID本会话当中的对方SubID (可选)区分大小写的字符串
TargetLocationID本会话当中的对方locationID (可选)区分大小写的字符串
SessionQualifier附加的限定词,用于消除歧义,保证会话的唯一性区分大小写的字符串
DefaultApplVerID仅FIXT1.1(或以上版本)需要。忽略早期版本的传输。指定会话的默认应用程序的版本ID。ApplVerID的枚举值(请看ApplVerID字段详细介绍),或默认BeginString。FIX.5.0SP2、FIX.5.0SP1、FIX.5.0、FIX.4.4、FIX.4.3、FIX.4.2、FIX.4.1、FIX.4.0
ConnectionType定义会话当中本方的角色:acceptor或者initiatorinitiator、acceptor
StartTime交易日的会话有效开始时间,这时FIX会话被激活UTC时间,格式: HH:MM:SS
EndTime交易日的会话失效时间,FIX会话将被停止UTC时间,格式: HH:MM:SS
StartDay对于为期一周的会话配置,一周会话开始的第一天。与STARTTIME结合使用。使用一周中某天的英语任何缩写都是有效的(比如,mo, mon, mond, monda,Monday都是有效的)
EndDay对于为期一周的会话配置,一周会话结束的最后一天。与EndTime结合使用。使用一周中某天的英语任何缩写都是有效的(比如,mo, mon, mond, monda,Monday都是有效的)
MillisecondsInTimeStamp时间戳是否加入毫秒。FIX.4.2和更高版本可用。Y、NY
ResetOnLogon接收登录请求时,序列号是否要复位。只用于AcceptorY、NN
ResetOnLogout正常注销登录时,序列号是否要复位Y、NN
ResetOnDisconnect连接异常断开后是否要将序列号重置为1Y、NN
RefreshOnLogon确定是否应当从持久层登录时恢复会话状态。在创建热故障切换会话时有用。Y、NN
EnableLastMsgSeqNumProcessed是否在header中添加最后一条消息的序列号(可选tag369)。Y、NN
MaxMessagesInResendRequest设置一次重发请求的消息的最大消息数。任何大于0的整数。使用0为无穷大(默认)。
SendLogoutBeforeDisconnectFromTimeout指定是否因超时断开连接之前发送logout消息Y、NN
IgnorePossDupResendRequests当PossDupFlag(tag 43)设置为true时,是否忽略一次重发请求Y、NN

4.2 验证配置

配置描述有效值默认
UseDataDictionary告诉会话是否使用数据字典,或不希望使用数据字典。 如果你要使用repeating group,你必须使用DataDictionary。Y、NY
DataDictionary该配置只用于比FIXT.1.1还老的版本。详细参考FIXT.1.1的TransportDataDictionary和AppDataDictionary的配置。FIX44.xml、FIX43.xml、FIX42.xml、FIX41.xml、FIX40.xml
TransportDataDictionaryXML定义文件用于验证传入的管理消息。如果没有提供DataDictionary,只会做基本消息的验证。该配置只用于FIXT.1.1(或更高版本)的会话。FIXT1.1.xml
AppDataDictionary用于验证应用层消息的XML定义文件。仅对FIXT.1.1(或更高版本)的会话有效。更多信息请参考(FIX.4.0到 FIX.4.4)的DataDictionary。该配置可以为每个会话指定一个自定义应用的数据字典。该配置仅用于FIXT.1.1或更新的传输协议。使用FIXT传输时,该配置可以作为指定多个应用的数据字典的前缀。例如: DefaultApplVerID=FIX.4.2 # For default application version ID AppDataDictionary=FIX42.xml # For nondefault application version ID # Use BeginString suffix for app version AppDataDictionary.FIX.4.4=FIX44.xml有效的XML数据字典文件。QuickFIX/N 配备默认的协议字典数据:FIX50SP2.xml、FIX50SP1.xml、FIX50.xml、FIX44.xml、FIX43.xml、FIX42.xml、FIX41.xml、FIX40.xml
ValidateFieldsOutOfOrder如果设置为N,字段放置区域错误(例如,body字段在header区域内,或在header字段在body区域内)将不会被拒绝。用于连接字段要求不严格的系统。Y、NY
ValidateFieldsHaveValues如果设置为N,没有值的字段将不会被拒绝。用于连接到系统不当发送空标签。Y、NY
ValidateUserDefinedFields如果设置为N,用户自定义的字段将不会被拒绝,即使没有在数据字典中定义,或没出现在消息中。Y、NY

4.3 Initiator

配置描述有效值默认
ReconnectInterval尝试重新连接的时间间隔(秒)。仅用于 initiator。正整数30
HeartBtInt心跳间隔(秒)。仅用于initiator。正整数-
LogonTimeout登录超时时间间隔(秒)正整数10
LogoutTimeout注销登录超时时间间隔(秒)正整数2
SocketConnectPortSocket服务端口,用于建立会话。仅用于 initiator正整数-
SocketConnectHost连接主机.仅用于 initiatorx.x.x.x格式IP地址或域名-
SocketConnectPort一组备用Socket端口,用于连接会话的故障转移,n是正整数。SocketConnectPort1,SocketConnectPort2 ... 必须是连续的,并有一个与之相匹配的数组SocketConnectHost正整数-
SocketConnectHost一组备用Socket服务主机,用于连接会话的故障转移,n是正整数。SocketConnectHost1, SocketConnectHost2... 必须是连续的,并有一个与之相匹配的数组SocketConnectPortx.x.x.x格式IP地址或域名-
SocketNodelay连接是否禁用Nagle算法。在[DEFAULT]配置节点定义。Y、NY
ReconnectInterval尝试重新连接的时间间隔(秒)。仅用于 initiator。正整数30

4.4 Acceptor

配置描述有效值默认
SocketAcceptPort监听接入连接Socket端口。仅用于acceptor正整数,有效的、开放的套接字端口-
SocketAcceptHost监听接入连接的Socket服务的主机。如果不提供,acceptor将监听所有网络端口(0.0.0.0)有效的x.x.x.x格式IP地址0.0.0.0
SocketNodelay连接是否禁用Nagle算法。在[DEFAULT]配置节点定义。Y、NY

4.5 Storage

配置描述有效值默认
PersistMessages如果设置为N,被不会保存消息。这样将迫使quickfix总是发送GapFills,而不是重新发送消息。如果你知道你永远不需要重新发送消息,使用此配置。有用的市场数据流。Y、NY

4.6 File Storage

配置描述有效值默认
FileStorePath存储序列号和消息的文件目录。有效的文件存储目录,必须有写入权限。-

4.7 Logging

配置描述有效值默认
FileLogPath存储日志的目录。有效的文件存储目录,必须有写入权限。-

五、FIX开发

5.1 FIX引擎

github:QFJ GitHub Repository(https://github.com/quickfix-j/quickfixj)

5.2 DEMO

Acceptor 配置文件

# 定义会话的默认配置(default节点)
[DEFAULT]
FileStorePath=store
FileLogPath=log
ConnectionType=acceptor
ReconnectInterval=60
SenderCompID=SERVER
ResetOnDisconnect=Y
ResetOnLogout=Y
ResetOnLogon=Y
[SESSION]
BeginString=FIX.4.2
TargetCompID=CLIENT
StartTime=00:00:00
EndTime=23:59:59
HeartBtInt=30
SocketAcceptHost=127.0.0.1
SocketAcceptPort=6666
DataDictionary=FIX42.xml

Initiator 配置文件

[DEFAULT]
ConnectionType=initiator
ReconnectInterval=60
FileLogPath=log
FileStorePath=store
StartTime=00:00:00
EndTime=23:59:59
HeartBtInt=30
ResetOnDisconnect=Y
ResetOnLogout=Y
ResetOnLogon=Y
[SESSION]
BeginString=FIX.4.2
SenderCompID=CLIENT
TargetCompID=SERVER
SocketConnectPort=6666
SocketConnectHost=127.0.0.1
DataDictionary=FIX42.xml

FixServer

package com.app.fix;
import quickfix.*;
/**
 * 服务启动主类(线程)
 */
public class FixServer {
    private static ThreadedSocketAcceptor acceptor = null;
    /**
     * 指定配置文件启动
     *
     * @param propFile
     * @throws ConfigError
     * @throws FieldConvertError
     */
    public FixServer(String propFile) throws ConfigError, FieldConvertError {
        // 设置配置文件
        SessionSettings settings = new SessionSettings(propFile);
        // 设置一个APPlication
        Application application = new FixServerApplication();
        /**
         *
         * quickfix.MessageStore 有2种实现。 quickfix.JdbcStore,quickfix.FileStore .
         * JdbcStoreFactory 负责创建JdbcStore , FileStoreFactory 负责创建FileStorequickfix
         * 默认用文件存储,因为文件存储效率高。
         */
        MessageStoreFactory storeFactory = new FileStoreFactory(settings);
        LogFactory logFactory = new FileLogFactory(settings);
        MessageFactory messageFactory = new DefaultMessageFactory();
        acceptor = new ThreadedSocketAcceptor(application, storeFactory, settings, logFactory, messageFactory);
    }
    private void startServer() throws RuntimeError, ConfigError {
        acceptor.start();
    }
    /**
     * 测试本地使用的main方法
     *
     * @param args
     * @throws FieldConvertError
     * @throws ConfigError
     */
    public static void main(String[] args) throws ConfigError, FieldConvertError {
        FixServer fixServer = new FixServer("res/acceptor.config");
        fixServer.startServer();
    }
}

FixServerApplication

package com.app.fix;
import quickfix.Application;
import quickfix.DoNotSend;
import quickfix.FieldNotFound;
import quickfix.IncorrectDataFormat;
import quickfix.IncorrectTagValue;
import quickfix.Message;
import quickfix.MessageCracker;
import quickfix.RejectLogon;
import quickfix.Session;
import quickfix.SessionID;
import quickfix.UnsupportedMessageType;
import quickfix.field.MsgType;
/**
 * 
 */
public class FixServerApplication extends MessageCracker implements Application {
    @Override
    protected void onMessage(Message message, SessionID sessionID) {
        try {
            String msgType = message.getHeader().getString(35);
            Session session = Session.lookupSession(sessionID);
            switch (msgType) {
                case MsgType.LOGON: // 登陆
                    session.logon();
                    session.sentLogon();
                    break;
                case MsgType.HEARTBEAT: // 心跳
                    session.generateHeartbeat();
                    break;
            }
        } catch (FieldNotFound e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onCreate(SessionID sessionId) {
        System.out.println(" 服务器启动时候调用此方法创建");
    }
    @Override
    public void onLogon(SessionID sessionId) {
        System.out.println("客户端登陆成功时候调用此方法");
    }
    @Override
    public void onLogout(SessionID sessionId) {
        System.out.println("客户端断开连接时候调用此方法");
    }
    @Override
    public void toAdmin(Message message, SessionID sessionId) {
        System.out.println("发送会话消息时候调用此方法");
    }
    @Override
    public void toApp(Message message, SessionID sessionId) throws DoNotSend {
        System.out.println("发送业务消息时候调用此方法");
    }
    @Override
    public void fromAdmin(Message message, SessionID sessionId)
            throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {
        System.out.println("接收会话类型消息时调用此方法");
        try {
            crack(message, sessionId);
        } catch (UnsupportedMessageType | FieldNotFound | IncorrectTagValue e) {
            e.printStackTrace();
        }
    }
    @Override
    public void fromApp(Message message, SessionID sessionId)
            throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
        System.out.println("接收业务消息时调用此方法");
        crack(message, sessionId);
    }
}

FixClient

package com.app.fix;
import quickfix.*;
import quickfix.field.*;
import quickfix.fix42.NewOrderSingle;
import java.io.FileNotFoundException;
import java.util.Date;
public class FixClient implements Application {
    private static volatile SessionID sessionID;
    @Override
    public void onCreate(SessionID sessionID) {
        System.out.println("OnCreate");
    }
    @Override
    public void onLogon(SessionID sessionID) {
        System.out.println("OnLogon");
        FixClient.sessionID = sessionID;
    }
    @Override
    public void onLogout(SessionID sessionID) {
        System.out.println("OnLogout");
        FixClient.sessionID = null;
    }
    @Override
    public void toAdmin(Message message, SessionID sessionID) {
        System.out.println("ToAdmin");
    }
    @Override
    public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {
        System.out.println("FromAdmin");
    }
    @Override
    public void toApp(Message message, SessionID sessionID) throws DoNotSend {
        System.out.println("ToApp: " + message);
    }
    @Override
    public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
        System.out.println("FromApp");
    }
    public static void main(String[] args) throws ConfigError, FileNotFoundException, InterruptedException, SessionNotFound {
        SessionSettings settings = new SessionSettings("res/initiator.config");
        Application application = new FixClient();
        MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings);
        LogFactory logFactory = new ScreenLogFactory(true, true, true);
        MessageFactory messageFactory = new DefaultMessageFactory();
        Initiator initiator = new SocketInitiator(application, messageStoreFactory, settings, logFactory, messageFactory);
        initiator.start();
        while (sessionID == null) {
            Thread.sleep(1000);
        }
        final String orderId = "342";
        NewOrderSingle newOrder = new NewOrderSingle(new ClOrdID(orderId), new HandlInst('1'), new Symbol("YRD"),
                new Side(Side.BUY), new TransactTime(new Date()), new OrdType(OrdType.MARKET));
        Session.sendToTarget(newOrder, sessionID);
        Thread.sleep(5000);
    }
}

以上就是如何理解FIX协议的原理、消息格式及配置开发,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

推荐阅读:
  1. 动态路由RIP协议的原理及配置
  2. SNMP协议开发概念理解-1

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

fix

上一篇:怎样理解Webshell

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》