QuickFIX/n报Tag appears more than once(Field=523)错误排查求助
问题根因
报错Tag appears more than once (Field=523)的核心原因不是字段顺序,而是数据字典中QuoteRequest(35=R)的重复组结构定义错误,导致QuickFIX/n无法正确识别组边界,把组内允许重复的Tag 523(PartySubID)判定为全局重复字段。
你当前的数据字典存在两个核心错误:
- QuotReqGrp组件是重复组容器,但你没有将NoRelatedSym(Tag46)下属的字段用
<group>标签包裹,解析器无法识别这是重复组 - Parties、SecurityID等字段实际属于NoRelatedSym组内结构,你错误将其放在了QuoteRequest消息的平级位置,导致组边界提前结束
修复步骤
- 修正QuotReqGrp组件定义
将NoRelatedSym下属所有字段包裹在<group>标签内,同时将原本放在消息平级的Parties组件、Security系列字段移入组内:
<component name="QuotReqGrp"> <group name="NoRelatedSym" required="Y"> <field name="Symbol" required="Y"/> <field name="SymbolSfx" required="N"/> <field name="TrdType" required="N"/> <field name="TransactTime" required="Y"/> <field name="TradeDate" required="Y"/> <field name="TestMessageIndicator" required="N"/> <field name="NoOfDealers" required="N"/> <field name="NegotiationType" required="N"/> <field name="CanRespond" required="N"/> <field name="CanQuote" required="N"/> <field name="CanRequote" required="N"/> <field name="BookName" required="N"/> <field name="TraderList" required="N"/> <field name="TimeoutPeriod" required="N"/> <field name="NewTimePeriod" required="N"/> <field name="QuoteTimePeriod" required="N"/> <field name="ConfirmTimePeriod" required="N"/> <field name="RequoteTimePeriod" required="N"/> <component name="Parties" required="Y"/> <field name="MultipleTickets" required="N"/> <field name="SecurityID" required="N"/> <field name="SecurityIDSource" required="N"/> <field name="Product" required="N"/> <field name="SecurityType" required="N"/> <field name="SecuritySubType" required="N"/> <field name="Currency" required="N"/> <field name="SettlDate" required="N"/> <field name="MaturityDate" required="N"/> <field name="CouponRate" required="N"/> <component name="OrderQtyData" required="N"/> <field name="Side" required="N"/> <component name="SpreadOrBenchmarkCurveData" required="N"/> <field name="PriceType" required="N"/> <field name="Factor" required="N"/> <field name="Text" required="N"/> <field name="EncodedTextLen" required="N"/> <field name="EncodedText" required="N"/> <field name="BookingType" required="N"/> <field name="OrderRestrictions" required="N"/> </group> </component>
- 修正QuoteRequest消息定义
删除原本放在消息平级的多余组件/字段,仅保留顶层结构:
<message name="QuoteRequest" msgtype="R" msgcat="app"> <field name="QuoteReqID" required="Y"/> <component name="QuotReqGrp" required="Y"/> </message>
- 可选配置调整
调试阶段可以将SessionSettings中的ValidateFieldsOutOfOrder设为N,关闭字段顺序校验,等消息解析正常后再按需开启。
额外说明
只要重复组结构定义正确,字段顺序不会导致重复Tag报错:QuickFIX/n对组内的重复字段是允许的,只有无法识别到组归属的重复字段才会触发该报错。
内容的提问来源于stack exchange,提问作者Shruti
相关产品推荐
相关产品推荐

