簡體   English   中英

設計FIX消息編碼器和解碼器

[英]desiging a FIX message encoder and decoder

我正在嘗試設計一個簡單的FIX消息編碼器和解碼器,以對我的業務域Order對象進行編碼(轉換為FIX)和解碼(從FIX轉換)。 我已經設計了一些東西,但是我無法實現想要的漂亮設計。 想看看其他有構建這種東西的經驗的人是否有更好的設計思路。

這是我大致擁有的:業務對象訂單,QuickFIX對象消息。 我需要生成NewOrder / Cancel / Replace消息,並且該消息對於不同的交易所可能有所不同。 我可以使用ReplaceEncoder-> NewOrderEncoder-> AbstractEncoder,CancelEncoder-> AbstractEncoder。 但是,如果我要實現此目標的另一個方面,例如為不同的交換生成自定義消息,則會導致層次結構的組合過多。

我唯一的選擇是平凡地為不同的交流編寫不同的代碼嗎? 其他人如何做到這一點? 謝謝。

我唯一的選擇是平凡地為不同的交流編寫不同的代碼嗎?

當然不是。 FIX消息中包含強制字段和非強制字段。 您無法在必填字段上進行協商,因為那樣便無法保證消息的真實性和完整性。 現在我並不是說這是不可能的,許多交易對手都有自己的特定用戶級別協議,可以交換自己的特定消息。

借助Quickfix,您將可以從XML數據字典中找到引擎來確認消息的完整性。 根據您的要求進行調整。 您當然會有多個會話。 我不確定這是否可行,我自己還沒有嘗試過,不同的會話是否允許不同的數據字典? 如果是,則將它們用於不同的對手方。 如果無法做到這一點,我不禁想到的一種方法是在某些交易對手期望的消息中添加額外的代碼來處理您的特定字段,而不是整個消息。

在我工作過的地方,我們在這些線上使用了一些東西。 接收可能的任何版本,但是一旦收到消息,請將其轉換為特定版本的FIX消息,該消息僅存在於系統內部。 因此,您的引擎基本上只讀取1個FIX版本的消息。 但是增加的復雜性是您必須編寫一個轉換器。 我不確定這對您是否可行。

我認為您可能會遇到我們遇到的類似問題。 那就是每個FIX實現都是不同的。 有些使用4.2,其他使用4.4,某些使用一些標簽,而其他標簽則忽略它們,有些使用許多自己的標簽,而其他標簽則很少使用。 我們所做的是創建了帶有FIX 4.2和4.4子類的常規FIX會話,然后為每個特定會話(即單個代理)創建了子類。 這使我們可以合理地重用用於發送和接收FIX消息的代碼。 只是更改了諸如處理帳戶名和密碼等內容的細節。

為了生成消息,我們有一個返回和適配器的工廠方法。 所有適配器具有相同的API,它將我們的業務訂單對象轉換為FIX消息對象。 當然,每個適配器都特定於代理的API。 我想我們可能可以在適配器之間重用一些代碼,但是目前我們還沒有。

當涉及到消息定義時,FIX是一個非常簡單的協議。

實際上,每個提供FIX接口的機構都對默認消息集進行了修改。 這意味着,例如,來自交易對手A的FIX4.4 NewOrderSingle消息可能具有與交易對手B的不同的字段。

實際上,交易對手A可能已經全盤整理了一些字段並將它們添加進去。對於任何新的交易對手,您都有機會遇到從未見過的字段。

我已經為一些不同的交換編寫了一些適配器,但是不幸的是,您真的不得不單獨處理它們。 您也許可以利用一些共同點,但是在您閱讀完其FIX接口的規格之前,您無法對此做出任何假設。

因此,請簡短回答您的問題:

我唯一的選擇是平凡地為不同的交流編寫不同的代碼嗎?

是的,差不多。

我們最終要做的是編寫一個僅應用必需的修訂標記的基本修訂層。 在修訂規范中,某些標記被標記為每種消息類型所必需。

創建此消息后,我們將過濾器應用於特定於經紀人和工具類型的消息。

例如,如果您與高盛和摩根大通進行期權和股票交易,您將編寫以下過濾器:

高盛股權

高盛期權

摩根大通

摩根大通期權

每個廠商都會將供應商和儀器的特定字段應用於基本消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM