Thread: [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 |
From: Grant B. <gbi...@co...> - 2009-12-21 18:07:20
|
I believe you need to be using a data dictionary when using repeating groups. Thus, you need to set UseDataDictionary=N and specify a location to your dictionary xml file. -Grant On Mon, Dec 21, 2009 at 1:33 AM, chris <chr...@gm...> wrote: > QuickFIX Documentation: http://www.quickfixengine.org/quickfix/doc/html/index.html > QuickFIX Support: http://www.quickfixengine.org/services.html > > > 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 > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > Quickfix-users mailing list > Qui...@li... > https://lists.sourceforge.net/lists/listinfo/quickfix-users > > |
From: Grant B. <gbi...@co...> - 2009-12-21 20:42:08
|
I meant UseDataDictionary=Y, of course. On Mon, Dec 21, 2009 at 12:07 PM, Grant Birchmeier <gbi...@co...> wrote: > I believe you need to be using a data dictionary when using repeating groups. > > Thus, you need to set > UseDataDictionary=N > and specify a location to your dictionary xml file. > > -Grant > > On Mon, Dec 21, 2009 at 1:33 AM, chris <chr...@gm...> wrote: >> QuickFIX Documentation: http://www.quickfixengine.org/quickfix/doc/html/index.html >> QuickFIX Support: http://www.quickfixengine.org/services.html >> >> >> 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 >> >> ------------------------------------------------------------------------------ >> This SF.Net email is sponsored by the Verizon Developer Community >> Take advantage of Verizon's best-in-class app development support >> A streamlined, 14 day to market process makes app distribution fast and easy >> Join now and get one step closer to millions of Verizon customers >> http://p.sf.net/sfu/verizon-dev2dev >> _______________________________________________ >> Quickfix-users mailing list >> Qui...@li... >> https://lists.sourceforge.net/lists/listinfo/quickfix-users >> >> > |