我已經參與了幾個系統已經做你所描述的正是設計。它實際上比設計類層次結構更復雜。請注意以下幾點:
根據交易場地和/或資產類別,訂單的「唯一ID」實際上可能是標籤的組合。例如,在紐約證券交易所「經典」交易時,唯一ID實際上是由標籤115(OnBehalfOfCompID)+標籤11組成的複合ID。對於其他場所,可能是標籤109 +標籤11或標籤76 +標籤11.
此外,您可能需要向您的唯一ID添加更多數據,以說明發送到不同場館的ID可能相同。例如,一些場館需要Integer
作爲它們的ClOrdID值。在這種情況下,您對「唯一ID」的內部表示應該是某種鹽+ ID數據,即DARKCROSS-1
,其中(虛構)場所是「黑客」,1
是標記11的值。
如果幾個場所有類似的策略來解決訂單的唯一ID,那麼您可以將該邏輯抽取到ID工廠 - 組合繼承。因此,您的抽象可以從AbstractOrder
開始,但是您可能會發現需要有NyseOrder
,NasdaqOrder
等等。 (請注意,我看到的一些實現有一個GenericFixOrder
類或類似的東西。實際上,沒有這樣的東西 - 每個地點都有自己的特定行爲,與其他行爲有所不同。)
另一個主題是Good Til Cancel和Good Til日期訂單,通常必須具有所有時間唯一的ID(即ID必須包含日期),以及在多次重新啓動時應用程序能夠存活的ID。所以,您的ID工廠必須考慮這些訂單。
關於ID的關係,它實際上非常簡單。您有一個Map
的唯一訂單ID到Order
對象。表示取消/替換或取消的類引用父訂單(通過「父訂單ID」字段,與上述的「唯一ID」字段解析相同)。
沒有必要直接引用原始(「根」)新訂單,實際上,當接受取消/替換時,您可能會發現將它從持有您訂單的Map
中移除是有益的。當取消被接受時,您幾乎可以肯定地從Map
中刪除它和訂單 - 訂單已完成。
請注意,以上是一般草圖 - 從內存中刪除訂單等可被視爲過早優化。如果您的交易量很小,那麼您可能在整個一天內都將所有的交易信息保存在內存中。
(http://www.quickfixj.org/)QuickfixJ是一個開源庫。您可以通過它進行檢查並繪製出您自己的實施細節。 – DumbCoder