[Quickfix-users] Field Order in Message Class
Brought to you by:
orenmnero
From: chris <chr...@gm...> - 2009-12-21 07:34:02
|
Hi all, This is very odd - any clues or pointers to missed posts very welcome. Using FIX.4.2, C++, 1.12.4, g++ 4.3.3 on Ubuntu 9.04 [DEFAULT] ConnectionType=initiator HeartBtInt=30 ReconnectInterval=10 LogonTimeout=120 FileStorePath=store FileLogPath=log StartTime=00:00:00 EndTime=00:00:00 UseDataDictionary=N SocketConnectPort=442 SenderCompID=SENDER ResetOnDisconnect=Y ResetOnLogout=Y ValidateUserDefinedFields=N ValidateFieldsOutOfOrder=Y [SESSION] BeginString=FIX.4.2 TargetCompID=TARGET SocketConnectHost= ResetSeqNumFlag=Y DataDictionary=FIX42.xml Briefly : On receipt of a MarketDataIncrementalRefresh with more than 1 group (i.e most of them with BID / OFFER) quickfix generates a RepeatedTag rejection. Less Briefly : Looking at Log Viewer and Wireshark everything is fine - repeated groups, all OK. Everything is also good when viewing an XML export from the Log Viewer ... * <message> <header> <field name="BeginString" number="8"><![CDATA[FIX.4.2]]></field> <field name="BodyLength" number="9"><![CDATA[221]]></field> <field name="MsgSeqNum" number="34"><![CDATA[3]]></field> <field enum="MarketDataIncrementalRefresh" name="MsgType" number="35"><![CDATA[X]]></field> <field name="SenderCompID" number="49"><![CDATA[TARGET]]></field> <field name="SendingTime" number="52"><![CDATA[20091221-03:19:07.535]]></field> <field name="TargetCompID" number="56"><![CDATA[SENDER]]></field> </header> <body> <field name="MDReqID" number="262"><![CDATA[2009-12-21-03:19:07]]></field> <field name="NoMDEntries" number="268"><![CDATA[2]]></field> <group> <field enum="NEW" name="MDUpdateAction" number="279"><![CDATA[0]]></field> <field enum="BID" name="MDEntryType" number="269"><![CDATA[0]]></field> <field name="MDEntryID" number="278"><![CDATA[1]]></field> <field name="Symbol" number="55"><![CDATA[USD/JPY]]></field> <field name="MDEntryPx" number="270"><![CDATA[90.449]]></field> <field name="Currency" number="15"><![CDATA[USD]]></field> <field name="MDEntrySize" number="271"><![CDATA[6000000]]></field> <field name="NumberOfOrders" number="346"><![CDATA[2]]></field> </group> <group> <field enum="NEW" name="MDUpdateAction" number="279"><![CDATA[0]]></field> <field enum="OFFER" name="MDEntryType" number="269"><![CDATA[1]]></field> <field name="MDEntryID" number="278"><![CDATA[2]]></field> <field name="Symbol" number="55"><![CDATA[USD/JPY]]></field> <field name="MDEntryPx" number="270"><![CDATA[90.456]]></field> <field name="Currency" number="15"><![CDATA[USD]]></field> <field name="MDEntrySize" number="271"><![CDATA[1000000]]></field> <field name="NumberOfOrders" number="346"><![CDATA[1]]></field> </group> </body> <trailer> <field name="CheckSum" number="10"><![CDATA[041]]></field> </trailer> </message> *but quickfix insists it isn't and generates this ...* <message> <header> <field name="BeginString" number="8"><![CDATA[FIX.4.2]]></field> <field name="BodyLength" number="9"><![CDATA[109]]></field> <field name="MsgSeqNum" number="34"><![CDATA[3]]></field> <field enum="Reject" name="MsgType" number="35"><![CDATA[3]]></field> <field name="SenderCompID" number="49"><![CDATA[SENDER]]></field> <field name="SendingTime" number="52"><![CDATA[20091221-03:19:07.639]]></field> <field name="TargetCompID" number="56"><![CDATA[TARGET]]></field> </header> <body> <field name="RefSeqNum" number="45"><![CDATA[3]]></field> <field name="Text" number="58"><![CDATA[Tag appears more than once]]></field> <field name="RefTagID" number="371"><![CDATA[15]]></field> <field name="RefMsgType" number="372"><![CDATA[X]]></field> </body> <trailer> <field name="CheckSum" number="10"><![CDATA[111]]></field> </trailer> </message>* If I look in Session::next() with this ... std::cout << "DEBUG : Session::next() : BEGIN MESSAGE" << std::endl; std::cout << message.toXML() << std::endl; std::cout << "DEBUG : Session::next() : END MESSAGE" << std::endl; I see this ... DEBUG : Session::next() : BEGIN MESSAGE <message> <header> <field number="8"><![CDATA[FIX.4.2]]></field> <field number="9"><![CDATA[221]]></field> <field number="35"><![CDATA[X]]></field> <field number="34"><![CDATA[3]]></field> <field number="49"><![CDATA[CNX]]></field> <field number="52"><![CDATA[20091221-05:48:36.020]]></field> <field number="56"><![CDATA[int2mansing2str]]></field> </header> <body> <field number="15"><![CDATA[USD]]></field> <field number="15"><![CDATA[USD]]></field> <field number="55"><![CDATA[USD/JPY]]></field> <field number="55"><![CDATA[USD/JPY]]></field> <field number="262"><![CDATA[2009-12-21-05:48:35]]></field> <field number="268"><![CDATA[2]]></field> <field number="269"><![CDATA[0]]></field> <field number="269"><![CDATA[1]]></field> <field number="270"><![CDATA[90.301]]></field> <field number="270"><![CDATA[90.307]]></field> <field number="271"><![CDATA[1000000]]></field> <field number="271"><![CDATA[1000000]]></field> <field number="278"><![CDATA[1]]></field> <field number="278"><![CDATA[2]]></field> <field number="279"><![CDATA[0]]></field> <field number="279"><![CDATA[0]]></field> <field number="346"><![CDATA[1]]></field> <field number="346"><![CDATA[1]]></field> </body> <trailer> <field number="10"><![CDATA[017]]></field> </trailer> </message> DEBUG : Session::next() : END MESSAGE and of course this is the result ... DEBUG : DataDictionary::validate() field = 8 field = 9 field = 35 field = 34 field = 49 field = 52 field = 56 field = 10 field = 15 field = 15 DEBUG : Session::next() : catch RepeatedTag The field data in the message body is sorted and without the grouping information. -- chris boucher "In this house we obey the laws of thermodynamics!" - H. Simpson |