3

我们似乎无法使用 QuickFix 处理某些群组消息。

我正在尝试使用 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=5004335=d49=ICE34=252=20121017-00:39:41.38556=600357=23322=3924323=4320=1393=1310382=13267=1711=100 311=1705282309=TEB SMG0013-TFL SMG0013305=8463 =FXXXXX307=NG Basis Futures Spr - TETCO-ELA/TGP-500L - Feb13542=20130131436=1.09013=0.00059014=2500.09017=25009022=289024=19025=Y916=20130201917=201302289201=11969200=129202=Feb139300=60589301=Texas Eastern Transmission Corp . - East Louisiana Zone/Tennessee Gas Pipeline Co. - Zone L, 500 Leg Pool9302=TETCO-ELA/TGP-500L998=MMBtus9100=USD9101=USD / MMBtu9085=daily9083=49084=09061=4909062=NG Basis Futures Spr9063=天然气Basis Futures Spread9032=1.259004=17051939005=1353778 311=1714677309=PGE SQF0014.H0014-SCB SQF0014.H0014305=8463=FXXXXX307=NG Basis Futures Spr - PG&E-Citygate/Socal-Citygate - 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

4

2 回答 2

2

我们通过创建一个名为 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>
于 2012-10-17T17:35:07.107 回答
1

如果这些标签不在您的配置文件中,请将它们添加到其中。我假设您的数据字典没有被读取。

UseDataDictionary=Y

ValidateFieldsOutOfOrder=N   /* This caused a lot of grief for me, 
because of the underlying data structure used in QuickFix, 
hence I always put it to N to save me the pain */

但是我检查了 FIX4.4 的规格,这个消息确实存在于版本中,那你为什么要添加它呢?这应该在 QuickFix 可用的默认 xml 配置文件中。

您的第一组似乎被正确读取,但第二组(两个 305 标签)导致错误。Quickfix 无法弄清楚那里有多少组和哪些组。而且您正在不必要地复制信息。您在消息中使用这样的组。而且 Quickfix 无法正确解析您的消息定义。这就是 QuickFix 的工作原理,因此您无能为力。

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

否则,如果在多个消息中使用UnderlyingInstrument ,您将需要在多个位置复制它,这会增加您的 XML 大小而没有任何好处。这是在默认的 Quickfix 配置文件中完成的方式,请尝试遵循它,它会为您省去很多麻烦。

于 2012-10-17T08:12:55.387 回答