Reputation: 31
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
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