QuickfixJ多腿订单解析LegOrdGrp(555)重复组失败问题咨询
报错信息:Failed to parse repeated groups: LegOrdGrp(555) at position : 242soh45=11
报错原因
- 重复组字段顺序不符合数据字典规则:QuickFIX/J 解析重复组时要求每个LegOrdGrp(555)分组实例的字段顺序必须和使用的FIX数据字典定义完全一致,且每个分组的首个字段必须是字典指定的组首字段,顺序错误会导致解析器无法识别分组边界,触发解析失败。
- 字段所属层级错误:从你提供的示例消息结构来看,461(CFICode)、167(SecurityType)如果是LegOrdGrp组内的字段,你将其放在了所有555分组实例之后的外层位置,解析器在组内找不到预期字段,就会抛出边界解析错误。
- BodyLength(9)值计算错误:你手动拼接的消息中9=352如果和替换SOH后的实际消息体长度不匹配,会导致解析位置错位,刚好错位到555分组的位置时就会抛出该报错。
- 两端数据字典不匹配:本地使用的FIX4.4数据字典中LegOrdGrp的结构(字段顺序、字段数量)和接收方的字典定义不一致,导致接收方无法识别你发送的分组结构。
解决方案
- 严格对齐重复组字段顺序:先确认所使用的FIX数据字典中LegOrdGrp的字段顺序,每个分组实例的字段严格按照该顺序排列,禁止将组内字段挪到分组外层。
- 优先使用QuickFIX/J原生API构造重复组:不要手动拼接原始FIX字符串,直接用框架提供的Group接口构造重复组,框架会自动处理字段顺序、BodyLength、校验和等字段的计算,避免手动拼接引发的错误,示例代码如下:
// 构造AB类型消息 Message msg = new Message(); msg.getHeader().setField(new BeginString("FIX.4.4")); msg.getHeader().setField(new MsgType("AB")); // 设置LegOrdGrp分组数量 msg.setField(new NoLegs(2)); // 构造第一个分组 Group leg1 = new Group(555, 600); // 第二个参数为字典定义的该组首字段编号 leg1.setField(new LegSymbol("xxx")); leg1.setField(new LegSide("1")); // 其他组内字段按顺序添加 leg1.setField(new LegCFICode("ancd")); leg1.setField(new LegSecurityType("myst")); msg.addGroup(leg1); // 构造第二个分组 Group leg2 = new Group(555, 600); leg2.setField(new LegSymbol("yyy")); leg2.setField(new LegSide("2")); leg2.setField(new LegCFICode("ancd")); leg2.setField(new LegSecurityType("myst")); msg.addGroup(leg2); // 发送消息,框架自动补全校验字段 Session.sendToTarget(msg, sessionId);
- 对齐两端数据字典:确认本地和接收方使用完全一致的FIX数据字典,尤其是自定义的分组、字段定义,避免结构不一致。
- 开启本地预校验:在QuickFIX/J配置文件中开启出站消息校验,设置
ValidateOutgoingMessage=Y,消息不符合字典规则时本地会先抛出明确错误,提前定位问题。
内容的提问来源于stack exchange,提问作者S Shah
相关产品推荐
相关产品推荐

