国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

FIX協議介紹

stormjun / 2966人閱讀

摘要:每個消息由一個唯一的序列號進行標示。接收端應用程序負責監控接收消息序列號以識別消息間隙并產生重傳請求。加密加密算法由連接雙方共同協商。預先協商好的加密算法在消息中進行聲明。具體加密的方法由連接雙方達成的協議而定。

定義

FIX協議是由國際FIX協會組織提供的一個開放式協議,目的是推動國際貿易電子化的進程,在各類參與者之間,包括投資經理、經紀人,買方、賣方建立起實時的電子化通訊協議。FIX協議的目標是把各類證券金融業務需求流程格式化,使之成為一個個可用計算機語言描述的功能流程,并在每個業務功能接口上統一交換格式,方便各個功能模塊的連接。

協議工作原理 通信模型及基本概念 通信模型

Initiator?:發起者,建立通信連路,通過發送初始Logon消息發起會話的參與方。

Acceptor?:接收方 FIX會話的接收方。負責執行第一層次的認證和通過傳輸Logon消息的確認正式聲明連接請求被接受。

原則:先發起者為Initiator?,接受者為Acceptor?。

標準模式以網關為Acceptor,客戶端為Initiator做為常用模式。

Fix connection

FIX連接 由3部分組成:logon登錄,message exchange消息傳輸,logout注銷。

logon登錄

- logout注銷

Fix session

FIX會話由一個或多個FIX Connection FIX連接組成。一個FIX會話可以有多次登錄。

序列號

所有的FIX消息都由一個唯一的序列號進行標示。序列號在每一個FIX會話開始時被初始化為1,并在整個會話期間遞增。監控序列號可以使會話參與者識別和處理丟失的消息,當在一個FIX會話中重新連接時能夠快速進行應用程序同步。

每個會話將建立一組互不依賴的接受和發送序列。會話參與者將維護一個賦予發送消息的序列和一個監控接受消息的消息塊間隙序列號。

心跳

在消息交互期間,FIX應用程序將周期性產生Heartbeat心跳消息。該心跳消息可以監控通信鏈路狀態及識別接收序列號間隙。發送Heartbeat的周期間隔由會話發起者使用在Logon消息中HeartBtInt域進行定義。

Heartbeat心跳消息的時間間隔應當在每一個消息發送后復位,即發送一個消息后,在間隔給定的時間內無其它消息發送則發送一個Heartbeat心跳消息。HeartBtInt的值應當被會話雙方認同,由會話發起方定義并由會話接收者通過Logon消息進行確認。同一個HeartBtInt被會話雙方——登錄的發起者和登錄的接受者共同使用。

數據完整校驗

消息數據內容的完整性可以參用兩種方式來驗證:消息長度和效驗碼檢查。

程序通過計算BodyLength域到CheckSum標記(“10=”)分界符的字符數,域BodyLength標示的消息長度進行比較來完成完整性效驗。

ChekSum完整性檢查,通過計算從域“8=” 中“8”開始,包括緊跟在CheckSum標記域的分界符每個字符的2進制和同CheckSum進行比較得到。

一個FIX消息校驗和通過計算到ChechSum域(但不包括)的消息的每個字節和得到。然后,校驗和被轉換為模256的數字用于傳送和比較。校驗和在所有加密操作之后被計算。

校驗代碼:

樣例: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 );
}
消息確認

FIX協議不支持單個消息的確認。采用的是監控消息時隙的方法來進行消息恢復和驗證。

普通的數據傳送(無單個消息確認)通過消息序列間隙進行錯誤識別。每個消息由一個唯一的序列號進行標示。接收端應用程序負責監控接收消息序列號以識別消息間隙并產生重傳請求。

每個FIX參與方必須為FIX會話維護兩個序列號,一個是接收序列號,一個是發送序列號,兩者都在建立FIX會話開始時初始化為1。每個消息被賦予一個唯一的序列號值,并在消息發送后遞增。此外,每個收到的消息都有一個唯一的序列號,接收序列號計數器在收到每個消息后將會被遞增。

當接收序列號與所希望得到的的正確序列號不必配時,必須采取糾錯處理。

加密

加密算法由連接雙方共同協商。

一個消息的任何一個域可以被加密并放在SecureData域中。然而,一些顯示的標志域必須采用明文進行傳輸。為確保完整性,明文域可以在SecureData域中重復。

當使用加密時,建議但不是必須,所有的消息體都進行加密。如果一個消息中的重復組數據中的部分數據要加密,這個重復組必須全部進行加密。

預先協商好的加密算法在Logon消息中進行聲明。

自定義域

FIX為給用戶提供最大的靈活性,FIX協議允許用戶自定義域。這些域在認同的參與者之間實現、應用,并且應注意避免沖突。

Tag數在5000 到9999保留用于用戶自定義域。這些tag值用于企業聯盟的信息交換。可以通過FIX網站進行注冊。

10000以上保留用于單一企業內部使用。不用注冊。

消息格式 數據類型

整數int,浮點數float,單個字符char,布爾Boolean,字符串String,數據data

常見域
Tag(標記) FieldName(域名) 備注
8 BeginString 起始串,FIX協議版本
9 BodyLength 消息長度
35 MsgType 消息類型:例如F=Order Cancel Request,取消訂單
11 ClOrdID 客戶端訂單ID
37 OrderID 服務端訂單ID
41 OrigClOrdID 原始客戶端訂單ID
54 Side 買賣類型。例如:1 = Buy,2 = Sell
55 Symbol 股票代碼。例如:YRD
10 CheckSum 校驗碼
域語法

開始部分應是消息頭,隨后是正文,最后是消息尾;

消息頭的前 3 個域的次序不能改變:起始串(Tag =8)、消息體長度(Tag =9)、消息類型(Tag

=35);

消息尾的最后一個域應是校驗和域(Tag=10);

重復組中,域出現的順序應遵循該重復組在消息或組件中定義時的次序;

在一條消息中,除重復組域外任何其他域不能重復出現。

安全與加密

由于消息有可能在公網或不安全的網絡上傳輸交換,因此需要對相關的敏感數據加密處理。

具體加密的方法由連接雙方達成的協議而定。

消息內除某些需要公開識別的域以明文傳輸外其他任何域都可以加密放置密文數據域

(SecureData)內。當然,這些被加密的域也可以同時保留明文的表示方式。

當決定使用加密方案時,可以對消息正文內所有的域加密。如果消息的重復組內有部分需要加密的,那么要求對整個重復組加密。

本協議還提供的一些域用以支持數字簽名、密鑰交換和正文加密等安全技術。

消息 消息頭

每一個會話或應用消息有一個消息頭,該消息頭指明消息類型、消息體長度、發送目的地、消息序號、發送起始點和發送時間。

Tag 域名 必需 說明
8 BeginString Y 起始串,取值:FIX.4.2(不可加密,消息的第一個域)
9 BodyLength Y 消息體長度(不可加密,消息的第二個域)
35 MsgType Y 消息類型(不可加密,消息的第三個域)
49 SenderCompID Y 發送方代碼(不可加密,發送方標識符)
56 TargetCompID Y 接收方代碼(不可加密,接收方標識符)
115 OnBehalfOfCompID N 最初發送方標識符(可加密),用于經第三方發送。
128 DeliverToCompID N 最終接收方標識符(可加密),用于經第三方發送。
90 SecureDataLen N 密文數據長度
91 SecureData N 密文數據(緊跟密文數據長度域)
34 MsgSeqNum Y 消息序號(可加密),如果交易雙方不采用 FIX 會話 機制,可將該 tag 置為一個固定的值,例如 0。
50 SenderSubID N 發送方子標識符(可加密)
142 SenderLocationID N 發送方方位標識符(可加密)
57 TargetSubID N 接收方子標識符(可加密)
143 TargetLocationID N 接收方方位標識符(可加密)
116 OnBehalfOfSubID N 最初發送方子標識符(可加密)
144 OnBehalfOfLocationID N 最初發送方方位標識符(可加密)
129 DeliverToSubID N 最終接收方子標識符(可加密)
145 DeliverToLocationID N 最終接收方方位標識符(可加密)
43 PossDupFlag N 可能重復標志,重復發送時,作此標記。(可加密)
97 PossResend N 可能重發標志。(可加密)
52 SendingTime Y 發送時間(可加密)
122 OrigSendingTime N 原始發送時間(可加密)
347 MessageEncoding N 消息中 Encoded 域的字符編碼類型(非 ASCII 碼)
369 LastMsgSeqNumProcesse d N 最后處理消息序號(可加密)
370 OnBehalfOfSendingTime N 最初發送時間(用 UTC 表示時間)
消息尾

每一個消息(會話或應用消息)有一個消息尾,并以此終止。消息尾可用于分隔多個消息,包含有 3 位數的校驗和值。

Tag 域名 必需 說明
93 SignatureLength N 數字簽名長度(不可加密)
89 Signature N 數字簽名(不可加密)
10 CheckSum Y 校驗和,消息的最末域。(不可加密)
新訂單消息(MsgType=D)

對于在消息頭中設置了 PossResend 標志的訂單消息,應當使用交易客戶方訂單編號(ClOrdID)核
實是否已收到該訂單,具體實現時還應檢查訂單參數(買賣方向、證券代碼、數量等)進行核實。如果 之前收到該訂單,應以執行報告消息回應訂單狀態。如果之前未收到,則以執行報告消息回應訂單確認。

Tag 域名 必需 說明
標準消息頭 Y MsgType=D
11 ClOrdID Y 交易客戶方訂單編號,在訂單有效交易日內必需
109 ClientID Y 客戶資金帳號
1 Account Y 客戶交易編碼
110 MinQty N 最小成交量。
55 Symbol Y 期貨合約代碼
167 SecurityType N FUT = 期貨
200 MaturityMonthYear N 用于指定期貨到期的年和月
205 MaturityDay N 用于期貨的到期日期,并被與到期年月 (MaturityMonthYear)聯合使用
207 SecurityExchange Y 用于指定交易所
77 OpenClose Y 指明開倉,平倉
8009 HedgeFlag Y 投機套保標志
8010 TouchCondition N 觸發條件
54 Side Y 買賣方向
38 OrderQty N 委托手數
60 TransactTime Y 訂單發起時間
40 OrdType Y 訂單類型
44 Price N 價格(限價訂單時有效)
423 PriceType N 價格類型
99 StopPx N 停止價
15 Currency N 幣種
59 TimeInForce N 新訂單生效時間,默認為當日有效
168 EffectiveTime N 用于指定定單有效的時間
432 ExpireDate N 有條件地用于在生效時間(TimeInForce)=在某 日前有效(GTD),而沒有指定截止時間 (ExpireTime)的情況之下
126 ExpireTime N 有條件地用于生效時間(TimeInForce) = 在某 日前有效(GTD)和到期日沒有被指定的情況之 下
8096 MacNetInfo N 委托方的機器網絡信息
標準消息尾 Y
執行報告消息(MsgType=8)

訂單確認

訂單狀態變化確認(如撤單確認)

發送訂單的成交回報

訂單拒絕

Tag 域名 必需 說明
標準消息頭 Y MsgType=8
37 OrderID Y 期貨公司委托號,同個交易日必需保證唯一
11 ClOrdID N 交易客戶方訂單編號。如果是強平回報,則該值 取值為以”NONE”開頭的當天交易日唯一的字符 串標識
41 OrigClOrdID N 原始交易客戶方訂單編號,指示被撤消訂單的 ClOrdID
17 ExecID Y 期貨公司的執行編號,在訂單有效交易日內應保 證唯一
150 ExecType Y 執行類型
39 OrdStatus Y 訂單狀態
103 OrdRejReason N 訂單拒絕時需要
109 ClientID Y 客戶資金帳號
1 Account Y 客戶交易編碼
55 Symbol Y 期貨合約代碼
167 SecurityType N FUT=期貨
200 MaturityMonthYear N 到期年月
205 MaturityDay N 到期日期
207 SecurityExchange Y 用于指定交易所
77 OpenClose N 指明開倉,平倉
54 Side Y 買賣方向
38 OrderQty Y 委托手數
40 OrdType N 訂單類型
44 Price N 訂單價格
99 StopPx N 停止價
59 TimeInForce N 新訂單生效時間,默認為當日有效
15 Currency N 幣種
32 LastShares N 上一成交數(最近一筆成交數量)
31 LastPx N 上一成交價(最近一筆成交價格)
30 LastMkt N 上一成交市場
151 LeavesQty Y 訂單剩余數量
14 CumQty Y 成交總數
6 AvgPx Y 成交平均價
60 TransactTime N 執行報告時間
381 GrossTradeAmt N 成交總金額
110 MinQty N 最小成交量
8500 OrderEntryTime N 訂單申報時間
8093 DeclarationID N 報單號
8094 TradeID N 撮合編號
標準消息尾 Y
訂單狀態請求消息(MsgType=H)

訂單狀態請求用于向交易服務方請求某訂單的狀態,交易服務方通過執行報告消息返回訂單狀態。

Tag 域名 必需 說明
標準消息頭 Y MsgType=H
37 OrderID Y 期貨公司委托號,同個交易日必需保證唯一
11 ClOrdID Y 交易客戶方訂單編號
109 ClientID Y 客戶資金帳號
1 Account Y 客戶交易編碼
55 Symbol Y 期貨合約代碼
207 SecurityExchange Y 用于指定交易所
167 SecurityType N FUT=期貨
200 MaturityMonthYear N 用于指定期貨到期的年和月
205 MaturityDay N 用于期貨的到期日期,并被與到期年月 (MaturityMonthYear)聯合使用
54 Side Y 買賣方向
標準消息尾 Y
撤單消息(MsgType=F)

撤單消息用以撤消訂單的全部訂單剩余數量。
撤單消息也被賦予一個 ClOrdID,可視作另外一個訂單。如果被拒絕,撤單拒絕消息的 ClOrdID 放
置撤單消息的 ClOrdID,而原始訂單的 ClOrdID 則放入 OrigClOrdID 域。ClOrdID 要保證唯一。

Tag 域名 必需 說明
標準消息頭 Y MsgType=F
41 OrigClOrdID Y 原始交易客戶方訂單編號,指示被撤消訂單的ClOrdID
37 OrderID Y 期貨公司委托號,同個交易日必需保證唯一
11 ClOrdID Y 交易客戶方訂單編號
109 ClientID Y 客戶資金帳號
1 Account Y 客戶交易編碼
55 Symbol Y 期貨合約代碼。
167 SecurityType N 證券代碼源
200 MaturityMonthYear N FUT=期貨
205 MaturityDay N 期貨到期年月
207 SecurityExchange Y 期貨到期日期
54 Side Y 買賣方向
60 TransactTime Y 訂單發起時間
40 OrdType Y 訂單類型
38 OrderQty Y 委托手數
8093 DeclarationID N 報單號
58 Text N
標準消息尾 Y
撤單拒絕消息(MsgType=9)

本消息用于撤單消息的拒絕。
交易服務方接收到撤單發現無法執行(已成交訂單不可更改等),將發送撤單拒絕。
拒絕撤單時,撤單拒絕消息應用 ClOrdID 指示撤單的 ClOrdID,用 OrigClOrdID 指示之前最后接受的訂單(除非拒絕原因是“未知訂單”)。

Tag 域名 必需 說明
標準消息頭 Y MsgType=9
37 OrderID Y 期貨公司委托號,同個交易日必需保證唯一
11 ClOrdID Y 交易客戶方訂單編號
41 OrigClOrdID Y 原始交易客戶方訂單編號,指示被撤消訂單的ClOrdID
39 OrdStatus Y 訂單狀態
109 ClientID Y 客戶資金帳號
1 Account Y 客戶交易編碼
60 TransactTime N 訂單發起時間
434 CxlRejResponseTo N 撤單拒絕回應類型
102 CxlRejReason N 撤單拒絕原因
58 Text N
標準消息尾 Y
FIX配置

會話配置(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或者initiator initiator、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、N Y
ResetOnLogon 接收登錄請求時,序列號是否要復位。只用于Acceptor Y、N N
ResetOnLogout 正常注銷登錄時,序列號是否要復位 Y、N N
ResetOnDisconnect 連接異常斷開后是否要將序列號重置為1 Y、N N
RefreshOnLogon 確定是否應當從持久層登錄時恢復會話狀態。在創建熱故障切換會話時有用。 Y、N N
EnableLastMsgSeqNumProcessed 是否在header中添加最后一條消息的序列號(可選tag369)。 Y、N N
MaxMessagesInResendRequest 設置一次重發請求的消息的最大消息數。 任何大于0的整數。使用0為無窮大(默認)。 0
SendLogoutBeforeDisconnectFromTimeout 指定是否因超時斷開連接之前發送logout消息 Y、N N
IgnorePossDupResendRequests 當PossDupFlag(tag 43)設置為true時,是否忽略一次重發請求 Y、N N

驗證配置

配置 描述 有效值 默認
UseDataDictionary 告訴會話是否使用數據字典,或不希望使用數據字典。 如果你要使用repeating group,你必須使用DataDictionary。 Y、N Y
DataDictionary 該配置只用于比FIXT.1.1還老的版本。詳細參考FIXT.1.1的TransportDataDictionary和AppDataDictionary的配置。 FIX44.xml、FIX43.xml、FIX42.xml、FIX41.xml、FIX40.xml
TransportDataDictionary XML定義文件用于驗證傳入的管理消息。如果沒有提供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、N Y
ValidateFieldsHaveValues 如果設置為N,沒有值的字段將不會被拒絕。用于連接到系統不當發送空標簽。 Y、N Y
ValidateUserDefinedFields 如果設置為N,用戶自定義的字段將不會被拒絕,即使沒有在數據字典中定義,或沒出現在消息中。 Y、N Y

Initiator

配置 描述 有效值 默認
ReconnectInterval 嘗試重新連接的時間間隔(秒)。僅用于 initiator。 正整數 30
HeartBtInt 心跳間隔(秒)。僅用于initiator。 正整數 -
LogonTimeout 登錄超時時間間隔(秒) 正整數 10
LogoutTimeout 注銷登錄超時時間間隔(秒) 正整數 2
SocketConnectPort Socket服務端口,用于建立會話。僅用于 initiator 正整數 -
SocketConnectHost 連接主機.僅用于 initiator x.x.x.x格式IP地址或域名 -
SocketConnectPort 一組備用Socket端口,用于連接會話的故障轉移,n是正整數。SocketConnectPort1,SocketConnectPort2 ... 必須是連續的,并有一個與之相匹配的數組SocketConnectHost 正整數 -
SocketConnectHost 一組備用Socket服務主機,用于連接會話的故障轉移,n是正整數。SocketConnectHost1, SocketConnectHost2... 必須是連續的,并有一個與之相匹配的數組SocketConnectPort x.x.x.x格式IP地址或域名 -
SocketNodelay 連接是否禁用Nagle算法。在[DEFAULT]配置節點定義。 Y、N Y
ReconnectInterval 嘗試重新連接的時間間隔(秒)。僅用于 initiator。 正整數 30

Acceptor

配置 描述 有效值 默認
SocketAcceptPort 監聽接入連接Socket端口。僅用于acceptor 正整數,有效的、開放的套接字端口 -
SocketAcceptHost 監聽接入連接的Socket服務的主機。如果不提供,acceptor將監聽所有網絡端口(0.0.0.0) 有效的x.x.x.x格式IP地址 0.0.0.0
SocketNodelay 連接是否禁用Nagle算法。在[DEFAULT]配置節點定義。 Y、N Y

Storage

配置 描述 有效值 默認
PersistMessages 如果設置為N,被不會保存消息。這樣將迫使quickfix總是發送GapFills,而不是重新發送消息。如果你知道你永遠不需要重新發送消息,使用此配置。有用的市場數據流。 Y、N Y

File Storage

配置 描述 有效值 默認
FileStorePath 存儲序列號和消息的文件目錄。 有效的文件存儲目錄,必須有寫入權限。 -

Logging

配置 描述 有效值 默認
FileLogPath 存儲日志的目錄。 有效的文件存儲目錄,必須有寫入權限。 -
FIX開發 FIX引擎

官網:FIX引擎

github:QFJ GitHub Repository

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);
    }
}

宜信技術學院

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99330.html

相關文章

  • nodejs使用axios代理https失敗的解決方案

    摘要:前言在環境下做些簡單的爬蟲時,需要用代理地址,如果訪問的目標站點是協議,用就會有些問題解決方法使用隧道代理用于的隧道代理具體參考安裝使用使用是對請求修復的一個分支版本安裝使用使用模塊個人感覺如果只是在服務端運行的 前言 在node環境下做些簡單的爬蟲時,需要用代理地址,如果訪問的目標站點是https協議,用axios就會有些問題 解決方法 1.使用tunnel隧道代理 node-tun...

    13651657101 評論0 收藏0
  • Node12有哪些值得關注的新特性?

    摘要:再之后會有個月的延長維護期。期間支持的變更嚴重的,嚴重的安全問題或者文檔更新。已經成為協議的一個重大更新,并且正在積極地在上集成。此外,默認情況下已禁用和,并且庫已刪除已棄用的函數。 前言 時隔一年,Node.js 12 如約而至,正式發布第一個 Current 版本。它將從2019年10月開始進入長期支持(LTS)版本直到2022年4月。 該版本帶來的新特性: V8 更新帶來好多不...

    kaka 評論0 收藏0
  • 如何為你的 Vue 項目添加配置 Stylelint

    摘要:如何為你的項目添加配置如何為你的項目添加配置現在已經是年了,網上許多教程和分享帖都已經過期,照著他們的步驟來會踩一些坑,如已經不再維護,以及之后文件只剩下部分等。如有疑問或授權協商請與我聯系。如何為你的 Vue 項目添加配置 Stylelint 現在已經是 9102 年了,網上許多教程和分享帖都已經過期,照著他們的步驟來會踩一些坑,如 stylelint-processor-html 已經不...

    番茄西紅柿 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<