QuickFix嵌套重复组配置错误导致消息被拒问题求助
问题背景
需配置嵌套重复组:NoPositionsGroup包含两个子组——NoPosKeysGroup(含标签5026、5027)和NoPosItemsGroup(含标签5029、5030)。但接收Fix服务器的PositionReport(AP)消息时,应用返回Reject消息,提示标签5026、5029重复出现。
错误原因
字段定义冗余错误:
错误定义了NoPositionsGroup(20000)、NoPosKeysGroup(20001)、NoPosItemsGroup(20002)这三个NUMINGROUP类型字段。在FIX协议中,重复组的计数器就是以NoXXX命名的字段(比如NoPosKeys=5025对应NoPosKeysGroup的重复次数,NoPosItems=5028对应NoPosItemsGroup的重复次数),不需要额外给组名定义NUMINGROUP字段。这会导致解析器将5026、5029识别为普通非组内字段,而普通字段默认不允许重复出现,因此触发拒接。消息定义逻辑错误:
当前消息定义中,组的关联逻辑混乱,多余的组名字段干扰了解析器对重复组边界的判断,无法正确识别5026/5027、5029/5030是组内重复字段。
从接收的消息来看,格式是标准的FIX重复组:
5025=2表示有2组NoPosKeysGroup(对应两组5026+5027)5028=12表示有12组NoPosItemsGroup(对应12组5029+5030)
正确配置方案
1. 修正后的字段定义
删除冗余的NUMINGROUP字段,保留计数器字段和组内字段:
<field number='5024' name='PosUpdateAction' type='CHAR'> <value enum='0' description="NEW"/> <value enum='1' description="CHANGE"/> <value enum='2' description="DELETE"/> </field> <field number='5025' name='NoPosKeys' type='INT'/> <field number='5026' name='PosKeyType' type="STRING"/> <field number='5027' name='PosKeyValue' type='STRING'/> <field number='5028' name='NoPosItems' type='INT'/> <field number='5029' name='PosItemType' type='STRING'/> <field number='5030' name='PosItemValue' type='FLOAT'/> <field number='5110' name='StreamPhaseIndicator' type='STRING'/>
2. 修正后的消息定义
确保计数器字段和对应组正确关联,结构清晰:
<message name='PositionReport' msgcat='app' msgtype='AP'> <field name='PosMaintRptID' required='N'/> <field name='PosReqID' required='N'/> <field name='PosReqType' required='N'/> <field name='SubscriptionRequestType' required='N'/> <field name='TotalNumPosReports' required='N'/> <field name='UnsolicitedIndicator' required='N'/> <field name='PosReqResult' required='N'/> <field name='ClearingBusinessDate' required='N'/> <field name='SettlSessID' required='N'/> <field name='SettlSessSubID' required='N'/> <field name='NoPartyIDs' required='N'/> <component name='Parties' required='Y'/> <field name='NoPositions' required='N'/> <group name='NoPositionsGroup' required='N'> <field name='PosType' required='N'/> <field name='PosUpdateAction' required='N'/> <field name='NoPosKeys' required='N'/> <group name='NoPosKeysGroup' required='N'> <field name='PosKeyType' required='N'/> <field name='PosKeyValue' required='N'/> </group> <field name='NoPosItems' required='N'/> <group name='NoPosItemsGroup' required='N'> <field name='PosItemType' required='N'/> <field name='PosItemValue' required='N'/> </group> </group> <field name='StreamPhaseIndicator' required='N'/> <field name='Account' required='N'/> <field name='AcctIDSource' required='N'/> <field name='AccountType' required='N'/> <component name='Instrument' required='N'/> <field name='Currency' required='N'/> <field name='SettlPrice' required='N'/> <field name='SettlPriceType' required='N'/> <field name='PriorSettlPrice' required='N'/> <component name='InstrmtLegGrp' required='N'/> <component name='PosUndInstrmtGrp' required='N'/> <component name='PositionQty' required='N'/> <component name='PositionAmountData' required='N'/> <field name='RegistStatus' required='N'/> <field name='DeliveryDate' required='N'/> <field name='Text' required='N'/> <field name='EncodedTextLen' required='N'/> <field name='EncodedText' required='N'/> <field name='MatchStatus' required='N'/> <field name='PriceType' required='N'/> <field name='SettlCurrency' required='N'/> <field name='MessageEventSource' required='N'/> </message>
修正后,解析器会通过NoPosKeys=2识别后续的两组5026+5027是NoPosKeysGroup的重复内容,通过NoPosItems=12识别后续12组5029+5030是NoPosItemsGroup的重复内容,不再将这些标签视为普通重复字段。
内容的提问来源于stack exchange,提问作者JamesBondCaesar

