摘要:每個消息由一個唯一的序列號進行標示。接收端應用程序負責監控接收消息序列號以識別消息間隙并產生重傳請求。加密加密算法由連接雙方共同協商。預先協商好的加密算法在消息中進行聲明。具體加密的方法由連接雙方達成的協議而定。
定義
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標記域的分界符
一個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 | 校驗和,消息的最末域。(不可加密) |
對于在消息頭中設置了 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 |
訂單確認
訂單狀態變化確認(如撤單確認)
發送訂單的成交回報
訂單拒絕
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 |
訂單狀態請求用于向交易服務方請求某訂單的狀態,交易服務方通過執行報告消息返回訂單狀態。
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 |
撤單消息用以撤消訂單的全部訂單剩余數量。
撤單消息也被賦予一個 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 |
本消息用于撤單消息的拒絕。
交易服務方接收到撤單發現無法執行(已成交訂單不可更改等),將發送撤單拒絕。
拒絕撤單時,撤單拒絕消息應用 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 |
會話配置(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引擎
github:QFJ GitHub Repository
DEMOAcceptor 配置文件
# 定義會話的默認配置(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
摘要:前言在環境下做些簡單的爬蟲時,需要用代理地址,如果訪問的目標站點是協議,用就會有些問題解決方法使用隧道代理用于的隧道代理具體參考安裝使用使用是對請求修復的一個分支版本安裝使用使用模塊個人感覺如果只是在服務端運行的 前言 在node環境下做些簡單的爬蟲時,需要用代理地址,如果訪問的目標站點是https協議,用axios就會有些問題 解決方法 1.使用tunnel隧道代理 node-tun...
摘要:再之后會有個月的延長維護期。期間支持的變更嚴重的,嚴重的安全問題或者文檔更新。已經成為協議的一個重大更新,并且正在積極地在上集成。此外,默認情況下已禁用和,并且庫已刪除已棄用的函數。 前言 時隔一年,Node.js 12 如約而至,正式發布第一個 Current 版本。它將從2019年10月開始進入長期支持(LTS)版本直到2022年4月。 該版本帶來的新特性: V8 更新帶來好多不...
摘要:如何為你的項目添加配置如何為你的項目添加配置現在已經是年了,網上許多教程和分享帖都已經過期,照著他們的步驟來會踩一些坑,如已經不再維護,以及之后文件只剩下部分等。如有疑問或授權協商請與我聯系。如何為你的 Vue 項目添加配置 Stylelint 現在已經是 9102 年了,網上許多教程和分享帖都已經過期,照著他們的步驟來會踩一些坑,如 stylelint-processor-html 已經不...
閱讀 1106·2021-11-23 10:05
閱讀 1785·2021-11-12 10:36
閱讀 1853·2019-08-30 15:56
閱讀 1684·2019-08-29 12:32
閱讀 3043·2019-08-28 18:04
閱讀 3428·2019-08-26 12:17
閱讀 2502·2019-08-26 11:35
閱讀 1240·2019-08-23 15:11