나는 당신이 설명 정확히 할 몇 가지 시스템의 설계에 참여하고있다. 실제로 클래스 계층 구조를 설계하는 것보다 복잡합니다. 유의 사항 :
거래소 및/또는 자산 클래스에 따라 주문의 "고유 ID"는 실제로 태그의 조합 일 수 있습니다. 예를 들어 뉴욕 증권 거래소 (NYSE)의 "Classic"거래시 유일한 ID는 실제로 115 (OnBehalfOfCompID) + Tag 11 태그로 구성된 복합 ID입니다. 다른 장소의 경우 Tag 109 + Tag 11 또는 Tag 76 + Tag 11이 될 수 있습니다.
또한 별개의 장소로 보낸 ID가 동일 할 수 있다는 사실을 설명하기 위해 고유 ID에 데이터를 추가해야 할 수도 있습니다. 예를 들어 일부 장소의 경우 ClOrdID 값으로 Integer
이 필요합니다. 이 경우 '고유 ID'의 내부 표현은 소금과 ID 데이터 (예 : DARKCROSS-1
)가 있어야하며 (가상의) 장소는 'DARKCROSS'이고 1
은 태그 11 값입니다.
여러 장소에서 주문의 고유 ID를 해결하는 비슷한 전략이있는 경우 상속을 통해 ID 팩토리로 논리를 추출 할 수 있습니다.
따라서 추상화는 AbstractOrder
으로 시작될 수 있지만 NyseOrder
, NasdaqOrder
등이 있어야 할 수 있습니다.
(내가 본 일부 구현에는 GenericFixOrder
클래스가 있거나 일부 클래스가 있습니다. 실제로는 각 장소마다 다른 동작이 약간 있습니다.)
또 다른 주제는 일반적으로 모든 시간에 고유 한 ID (즉, ID에 날짜가 있어야 함)가 있어야하며 여러 번 다시 시작하기 위해 애플리케이션에서 존속해야하는 Good Til Cancel 및 Good Til Date 주문입니다. 따라서 귀하의 ID 공장은 이러한 명령을 고려해야합니다.
ID의 관계에 대해서는 실제로는 매우 간단합니다. Order
개 개체의 고유 주문 ID가 Map
입니다. 취소/바꾸기 또는 취소를 나타내는 클래스는 부모 주문을 참조합니다 (위에서 설명한 "고유 ID"필드와 동일하게 해석되는 "부모 주문 ID"필드를 통해).
원래 ("루트") 신규 주문에 대한 직접적인 참조가 필요하지 않습니다. 실제로 취소/대체가 수락 된 경우 주문을 보유한 Map
에서 제거하는 것이 유용 할 수 있습니다. 취소가 수락되면 주문과 주문이 모두 완료되어 Map
에서 주문을 완전히 삭제할 수 있습니다.
위의 내용은 일반적인 스케치입니다. 메모리에서 주문을 제거하는 것은 조숙 한 최적화로 간주 될 수 있습니다. 거래량이 적 으면 하루 종일 모든 거래 메시지를 메모리에 보관할 수 있습니다.
(http://www.quickfixj.org/) QuickfixJ는 오픈 소스 라이브러리입니다. 이를 확인하고 구현 세부 사항을 차트로 표시 할 수 있습니다. – DumbCoder