3

一部のグループ メッセージを QuickFix で処理できないようです。

QuickFix (C++) を使用して ICE エクスチェンジとの接続をセットアップしようとしています。ICE の非標準メッセージを処理するカスタム データ ディクショナリを作成しました。処理する最初のメッセージは SecurityDefinition です。メッセージには、100 のブロックに分割された約 13000 のエントリが含まれています。以下にメッセージを添付しました (わかりやすくするために、最初の 2 つのエントリに 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 = 170523309 = SMG0013333333333333333333333333333333333333333313 = FXXXXX307 = NG BASING先物SPR -TETCO -ELA/TGP -500L -FEB13542 = 20130131436 = 1.09013 = 0.00059014 = 2500.09017 = 25009022 = 289024 = 19025 = Y916 = FAMERTINASS . - 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 ベーシス先物 Spr9063=天然ガス基本先物spread9032 = 1.259004 = 17051939005 = 1353778 311 = 1714677309 = PGE SQF0014.H0014-SCB SQF0014.H0014305 = 8463 = FXXXX307 = NG FUTURES SPR-FUTURES SPR-FUTURES SPR-FUTURES SPR-e-CITIT/ec-City-citate .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=天然ガス先物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 構成ファイルにあるはずです。

最初のグループは正しく読み取られているようですが、2 番目のグループ (2 つの 305 タグ) がエラーを引き起こしています。Quickfix は、存在するグループの数とグループを特定できません。そして、あなたは不必要に情報を複製しています。メッセージでこのようなグループを使用します。また、Quickfix はメッセージ定義を適切に解析できません。これが QuickFix の仕組みなので、何もすることはできません。

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

そうしないと、UnderlyingInstrumentが複数のメッセージで使用されている場合、複数の場所でUnderlyingInstrumentを複製する必要があり、XML サイズが増加するだけで何のメリットもありません。これは、デフォルトの Quickfix 構成ファイルで行われている方法です。それに従ってみてください。

于 2012-10-17T08:12:55.387 に答える