Ram
Ram

Reputation: 31

quickfix marketdatarequest parsing errors

I am using quickfix 1.14.0 on a linux machine. I am sending a MarketDataRequest. The request I am sending is

<message>
  <header>
    <field number="8">
      <![CDATA[FIX.4.4]]>
    </field>
    <field number="35">
      <![CDATA[V]]>
    </field>
    <field number="49">
      <![CDATA[FixServer]]>
    </field>
    <field number="56">
      <![CDATA[INCA]]>
    </field>
  </header>

  <body>
    <field number="146">
      <![CDATA[1]]>
    </field>
    <field number="262">
      <![CDATA[MARKETDATAID]]>
    </field>
    <field number="263">
      <![CDATA[0]]>
    </field>
    <field number="264">
      <![CDATA[0]]>
    </field>
    <field number="267">
      <![CDATA[1]]>
    </field>
    <group>
      <field number="55">
        <![CDATA[LNUX]]>
      </field>
    </group>
    <group>
      <field number="269">
        <![CDATA[0]]>
      </field>
    </group>
  </body>
  <trailer>
  </trailer>
</message>

On the receiving end, I see the request coming in as

<message>
  <header>
    <field number="8">
      <![CDATA[FIX.4.4]]>
    </field>
    <field number="9">
      <![CDATA[112]]>
    </field>
    <field number="35">
      <![CDATA[V]]>
    </field>
    <field number="34">
      <![CDATA[93]]>
    </field>
    <field number="49">
      <![CDATA[FixServer]]>
    </field>
    <field number="52">
      <![CDATA[20150714-19:19:54.844]]>
    </field>
    <field number="56">
      <![CDATA[INCA]]>
    </field>
  </header>

  <body>
    <field number="55">
      <![CDATA[LNUX]]>
    </field>
    <field number="146">
      <![CDATA[1]]>
    </field>
    <field number="262">
      <![CDATA[MARKETDATAID]]>
    </field>
    <field number="263">
      <![CDATA[0]]>
    </field>
    <field number="264">
      <![CDATA[0]]>
    </field>
    <field number="267">
      <![CDATA[1]]>
    </field>
    <field number="269">
      <![CDATA[0]]>
    </field>
  </body>
  <trailer>
    <field number="10">
      <![CDATA[151]]>
    </field>
  </trailer>
</message>

I am parsing the request using

  FIX::MDReqID mdReqID;
  FIX::SubscriptionRequestType subscriptionRequestType;
  FIX::MarketDepth marketDepth;
  FIX::NoRelatedSym noRelatedSym;
  FIX44::MarketDataRequest::NoRelatedSym noRelatedSymGroup;

  message.get( mdReqID );
  message.get( subscriptionRequestType );
  if ( subscriptionRequestType != FIX::SubscriptionRequestType_SNAPSHOT )
    throw( FIX::IncorrectTagValue( subscriptionRequestType.getField() ) );
  message.get( marketDepth );
  message.get( noRelatedSym );

  for ( int i = 0; i < noRelatedSym; ++i )
  {
    FIX::Symbol symbol;
    message.getGroup( i, noRelatedSymGroup );
    noRelatedSymGroup.get( symbol );
  }

I get an exception when I try to get the noRelatedSymbolGroup. I see the following error message sent back to the requestor, 358=Conditionally Required Field Missing (146) The code I am using is from the examples. I do not understand why the tag 55 appears before tag 146, even though it appears correctly from the sender side. Any help is appreciated.

Upvotes: 1

Views: 605

Answers (1)

Grant Birchmeier
Grant Birchmeier

Reputation: 18504

This looks like a configuration problem.

Your config should have these two lines:

UseDataDictionary=Y
DataDictionary=path/to/your/dd.xml

I bet the first line is missing.

The 55 is appearing before 146 because QF will internally rearrange the top-level fields in your message (because FIX does not care about the order of top-level fields).

55 is not top-level in MarketDataReq messages, but your bad configuration is telling QF that there are no repeating groups (because repeating groups require a DD). Thus QF is treating everything as a top-level field.

Upvotes: 2

Related Questions