Quickfix MarketDataIncrementalRefresh:未为此消息类型定义标记

时间:2015-04-13 13:58:18

标签: c++ quickfix fix-protocol

我使用Quickfix c ++。 我从服务器收到FIX消息:

8=FIX.4.2|9=312|35=X|34=17|49=CX|52=20150413-13:33:39.691|56=CACIB_MD2|262=1|9883=IDB|268=2|279=2|269=0|55=535791|270=15|271=1|272=20150413|273=13:28:07.653|59=0|126=20150413-21:56:46.201|290=1|9139=cacib_uat2|279=0|269=0|55=535791|270=17|271=1|272=20150413|273=13:33:39.660|59=0|126=20150413-21:56:46.201|290=1|9139=cacib_uat2|10=015|

和Quickfix会自动发回服务器拒绝消息(未为此消息类型定义标记55):

8=FIX.4.2|9=121|35=3|34=17|49=CACIB_MD2|52=20150413-13:33:39.755|56=CX|45=17|58=Tag not defined for this message type|371=55|372=X|373=2|10=044|

但是这个标签(55)在字典文件中定义:

  <message name='MarketDataIncrementalRefresh' msgcat='app' msgtype='X'>
   <field name='MDReqID' required='N' />
   <field name='CXMarketType' required='N' />
   <group name='NoMDEntries' required='N'>
     <field name='Symbol' required='N' />
   </group>
  </message>
  ...
  <field number='55' name='Symbol' type='STRING' />
  ...
  <field number='262' name='MDReqID' type='STRING' />
  ...
  <field number='268' name='NoMDEntries' type='INT' />
  ...
  <field number='9883' name='CXMarketType' type='STRING' />
  ...

FIX选项是:

UseDataDictionary=Y
DataDictionary=./conf/fix42_dictionary.xml
ValidateFieldsOutOfOrder=N
ValidateUserDefinedFields=N

我不明白为什么Quickfix决定标签55(符号)没有定义,当它是组的一部分时。

你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

问题是你不能直接将组添加到消息中,它应该首先在组件内部

<message name='MarketDataIncrementalRefresh' msgcat='app' msgtype='X'>
    <field name='MDReqID' required='N' />
    <field name='CXMarketType' required='N' />
    <component name='NoMDEntriesComp' required='N' />
</message>

<component name="NoMDEntriesComp">
    <group name='NoMDEntries' required='N'>
        <field name='Symbol' required='N' />
    </group>
</component>

NoMDEntries类型应该是NUMINGROUP而不是INT

<field number='268' name='NoMDEntries' type='NUMINGROUP' />

答案 1 :(得分:0)

我遇到了同样的问题。这是QuickFix错误报告的错误。必须在FIX4..xml中定义用户定义的字段。在部分中定义字段,并将它们也添加到适当的消息中。在您的情况下,9883看起来像您已声明的自定义标签,但未在35 = X message中正确定义。因此,如果您在NoMDEntries内的35 = X消息中使用此自定义标签,则可以解决您的问题。

  <message name='MarketDataIncrementalRefresh' msgcat='app' msgtype='X'>
   <field name='MDReqID' required='N' />
   <group name='NoMDEntries' required='N'>
     <field name='Symbol' required='N' />
     <field name='CXMarketType' required='N' />
   </group>
  </message>