2012-10-17 3 views
2

QuickFix에서 일부 그룹 메시지를 처리 ​​할 수 ​​없습니다.Quickfix C++에서 반복되는 그룹 메시지

QuickFix (C++)를 사용하여 ICE 교환기와의 연결을 설정하려고합니다. ICE의 비표준 메시지를 처리하기 위해 사용자 지정 데이터 사전을 만들었습니다. 처리 할 첫 번째 메시지는 SecurityDefinition입니다. 메시지에는 약 13000 개의 항목이 100 개의 블록으로 구분되어 있습니다. 아래에 메시지를 첨부했습니다 (명확성을 위해 CR/LF가 추가 된 처음 두 항목).

내 질문에 데이터 사전에, 내가 그룹에서 지정한 모든 필드가있는 항목의 일부로 그룹을 정의했습니다. 그러나 메시지가 잘못된 태그 (태그 = 305)를 갖는 것으로 크래커에 도착하기 전에 거부됩니다. 거부

메시지 2 : 태그이 메시지 유형에 대해 정의하지 : (305)

이 사전 항목이 올바른지 보입니까. 그룹 메시지를 다루는 방법에 관한 문서가 있습니까?

사전 엔트리

<message name='SecurityDefinition' msgcat='app' msgtype='d'> 
    <field name='SecurityResponseID' required='Y' /> 
    <field name='SecurityResponseType' required='Y' /> 
    <field name='SecurityReqID' required='Y' /> 
    <field name='TotNoRelatedSym' required='N' /> 
    <field name='NoRpts' required='N' /> 
    <field name='ListSeqNo' required='N' /> 
    <group name='NoUnderlyings' required='N'> 
     <field name='UnderlyingSymbol' required='N' /> 
     <field name='UnderlyingSecurityID' required='N' /> 
     <field name='UnderlyingSecurityIDSource' required='N' /> 
     <field name='UnderlyingCFICode' required='N' /> 
     <field name='UnderlyingSecurityDesc' required='N' /> 
     <field name='UnderlyingMaturityDate' required='N' /> 
     <field name='UnderlyingContractMultiplier' required='N' /> 
     <field name='IncrementPrice' required='N' /> 
     <field name='IncrementQty' required='N' /> 
     <field name='LotSize' required='N' /> 
     <field name='NumofCycles' required='N' /> 
     <field name='LotSizeMultiplier' required='N' /> 
     <field name='Clearable' required='N' /> 
     <field name='StripId' required='N' /> 
     <field name='StripType' required='N' /> 
     <field name='StripName' required='N' /> 
     <field name='HubId' required='N' /> 
     <field name='HubName' required='N' /> 
     <field name='HubAlias' required='N' /> 
     <field name='UnderlyingUnitOfMeasure' required='N' /> 
     <field name='PriceDenomination' required='N' /> 
     <field name='PriceUnit' required='N' /> 
     <field name='Granularity' required='N' /> 
     <field name='NumOfDecimalPrice' required='N' /> 
     <field name='NumOfDecimalQty' required='N' /> 
     <field name='ProductId' required='N' /> 
     <field name='ProductName' required='N' /> 
     <field name='ProductDescription' required='N' /> 
     <field name='TickValue' required='N' /> 
     <field name='ImpliedType' required='N' /> 
     <field name='PrimaryLegSymbol' required='N' /> 
     <field name='SecondaryLegSymbol' required='N' /> 
     <field name='IncrementStrike' required='N' /> 
     <field name='MinStrike' required='N' /> 
     <field name='MaxStrike' required='N' /> 
    </group> 
</message> 

실제 메시지가

8 = FIX.4.49 = 5,004,335 = D49 = ICE34 = 252 = 20121017-00 : 39 : 41.38556 = 600,357 = 23,322 = 3,924,323 = 4320 TETCO-ELA/TGP-500L - Feb13542 = 20130131436 = 1.09013 = 0.00059014 = 2500.09017 = 25009022 = NGX = 1300382 = 1327 = 1711 = 100 311 = 1705282309 = TEB SMG0013-TFL SMG0013305 = 8463 = FXXXXX307 = NG 기초 스프레드 Spr - 289024 = 19025 = Y916 = 20130201917 = 201302289201 = 11969200 = 129202 = Feb139300 = 60589301 = 동부 루이지애나 지역/테네시 가스 파이프 라인 - 지역 L, 500 다리 Pool9302 = TETCO-ELA/TGP-5 00L998 = MMBtus9100 = USD9101 = USD/MMBtu9085 = daily9083 = 49084 = 09061 = 4909062 = NG 기초 선물 Spr9063 = 천연 가스 기초 선물 Spread9032 = 1.259004 = 17051939005 = 1353778 311 = 1714677309 = PGE SQF0014.H0014-SCB SQF0014.H0014305 = 8463 = FXXXXX307 = NG 베이시스 선물 Spr - PG & 전자 시티 게이트/성좌 도시 - Q1 14542 = 20131231436 = 1.09013 = 0.00059014 = 2500.09017 = 25009022 = 909024 = 19025 = Y916 = 20140101917 = 201403319201 = 12339200 = 159202 = Q1 149300 = 59979301 = PG & E - Citygate/Socal - Citygate9302 = PG & E-Citygate/Socal-Citygate998 = MMBtus9100 = USD9101 = USD/MMBtu9085 = daily9083 = 49084 = 09061 = 4909062 = NG 기본 선물 Spr9063 = 천연 가스 기본 선물 스프레드 9032 = 1.259004 = 13430529005 = 1344660

답변

1

이 태그가 설정 파일에 없으면 태그를 추가하십시오. 귀하의 데이터 사전이 읽히지 않는다고 가정합니다.

그러나 FIX4.4에 대한 사양을 확인했는데,이 메시지는 버전에 존재하므로 왜 추가하고 있습니까? 이것은 QuickFix에서 사용할 수있는 기본 xml 구성 파일에 있어야합니다.

첫 번째 그룹이 올바르게 읽혀지고 있지만 두 번째 그룹 (두 개의 305 개의 태그)이 오류의 원인입니다. Quickfix는 얼마나 많은 그룹이 있는지 파악할 수 없습니다. 그리고 정보를 불필요하게 복제하고 있습니다. 당신은 당신의 메시지에서 이와 같은 그룹을 사용합니다. Quickfix는 메시지 정의를 올바르게 구문 분석 할 수 없습니다. 이것은 QuickFix가 작동하는 방식이므로 아무 것도 할 수 없습니다. 그렇지

<group name="NoUnderlyings" required="N"> 
    <component name="UnderlyingInstrument" required="N" /> 
</group> 

당신이 여러 메시지를 사용하는 경우, 여러 위치에서 UnderlyingInstrument를 복제해야하고, 어떤 혜택없이 XML의 크기를 증가시킬 것이다. This is how it is done in the default Quickfix config file, 그것을 따라하면 많은 슬픔을 덜어 줄 것입니다.

+0

나는 내가 ValidateFieldsOutOfOrder 플래그를 시도 할 것이다, 데이터 사전 항목을했다. UnderlyingInstrument 구성 요소를 수정하려고 시도했지만 동일한 결과가있었습니다. 봐 주셔서 대단히 감사합니다. –

+0

@Mark Jackson - XML ​​사전을 어지럽히 지 말고 새로운 메시지 나 구성 요소가 될 때까지 이미있는 것을 추가하지 마십시오. 그것은 단지 당신이 당신의 문제를 파악하는데 몇 시간을 허비하게 만듭니다. – DumbCoder

1

모든 사용자 지정 필드가있는 SecDefICE라는 사용자 지정 구성 요소를 만들고 사용자 지정 데이터 사전에 SecurityDefinition 메시지를 재정 의하여이 문제를 해결했습니다.

이제 그룹 정보를 읽을 수 있습니다. 단점은 우리가 일반적인 그룹을 사용하고 타입으로 안전한 방법으로 필드를 숫자로 그려야한다는 것입니다. 시간이되면 올바른 헤더 파일 (메시지, 필드, 사용자 정의 크래커 등)을 갖게 될 새 네임 스페이스 (FIXICE 등)를 만듭니다.

다음은 우리 사전의 정의입니다. 새 구성 요소

<component name='SecDefICE' required='N'> 
    <field name='UnderlyingSymbol' required='N' /> 
    <field name='UnderlyingSecurityID' required='N' /> 
    <field name='UnderlyingSecurityIDSource' required='N' /> 
    <field name='UnderlyingCFICode' required='N' /> 
    <field name='UnderlyingSecurityDesc' required='N' /> 
    <field name='UnderlyingMaturityDate' required='N' /> 
    <field name='UnderlyingContractMultiplier' required='N' /> 
    <field name='IncrementPrice' required='N' /> 
    <field name='IncrementQty' required='N' /> 
    <field name='LotSize' required='N' /> 
    <field name='NumofCycles' required='N' /> 
    <field name='LotSizeMultiplier' required='N' /> 
    <field name='Clearable' required='N' /> 
    <field name='StartDate' required='N' /> 
    <field name='EndDate' required='N' /> 
    <field name='StripId' required='N' /> 
    <field name='StripType' required='N' /> 
    <field name='StripName' required='N' /> 
    <field name='HubId' required='N' /> 
    <field name='HubName' required='N' /> 
    <field name='HubAlias' required='N' /> 
    <field name='UnderlyingUnitOfMeasure' required='N' /> 
    <field name='PriceDenomination' required='N' /> 
    <field name='PriceUnit' required='N' /> 
    <field name='Granularity' required='N' /> 
    <field name='NumOfDecimalPrice' required='N' /> 
    <field name='NumOfDecimalQty' required='N' /> 
    <field name='ProductId' required='N' /> 
    <field name='ProductName' required='N' /> 
    <field name='ProductDescription' required='N' /> 
    <field name='TickValue' required='N' /> 
    <field name='ImpliedType' required='N' /> 
    <field name='PrimaryLegSymbol' required='N' /> 
    <field name='SecondaryLegSymbol' required='N' /> 
    <field name='IncrementStrike' required='N' /> 
    <field name='MinStrike' required='N' /> 
    <field name='MaxStrike' required='N' /> 
    </component> 

새 메시지 정의

<message name='SecurityDefinition' msgcat='app' msgtype='d'> 
    <field name='SecurityResponseID' required='Y' /> 
    <field name='SecurityResponseType' required='Y' /> 
    <field name='SecurityReqID' required='Y' /> 
    <field name='TotNoRelatedSym' required='N' /> 
    <field name='NoRpts' required='N' /> 
    <field name='ListSeqNo' required ='N' /> 
    <group name='NoUnderlyings' required='N'> 
    <component name='SecDefICE' required='N' /> 
    </group> 
    <field name='Text' required='N' /> 
    <!-- these are the original fields in 4.4 spec --> 
    <!-- group name='NoUnderlyings' required='N' --> 
    <!-- component name='UnderlyingInst' required='N' --> 
    <!-- /group --> 
    <!-- component name='Instrument' required='N' --> 
    <!-- component name='InstrumentExtension' required='N' --> 
    <!-- field name='Currency' required='N' --> 
    <!-- field name='TradingSessionID' required='N' --> 
    <!-- field name='TradingSessionSubID' required='N' --> 
    <!-- field name='EncodedTextLen' required='N' --> 
    <!-- field name='EncodedText' required='N' --> 
    <!-- group name='NoLegs' required='N' --> 
    <!-- component name='InstrumentLeg' required='N' --> 
    <!-- /group --> 
    <!-- field name='ExpirationCycle' required='N' --> 
    <!-- field name='RoundLot' required='N' --> 
    <!-- field name='MinTradeVol' required='N' --> 
    </message>