QuickFix/J中DeliverToCompID(Tag128)必填校验失败问题
问题排查与解决方案
核心原因分析
虽然日志显示Tag128已存在,但Fiximulator的校验逻辑可能对字段的位置或归属有严格要求——DeliverToCompID本质属于FIX消息的Header组件,如果自定义数据字典错误地将其定义在NewOrderSingle的消息体范围内,会导致校验时在消息体中找不到该字段,触发必填缺失错误。
具体排查与修复步骤
1. 修正自定义FIX42.xml的字段归属
打开你的自定义FIX42.xml,确认DeliverToCompID的定义位置:
- 正确做法:该字段必须属于
<component name="Header">节点下,而非<message name="NewOrderSingle">的<fields>或<components>节点内。 - 若之前误将
<field name="DeliverToCompID" required="Y"/>放在NewOrderSingle的节点下,需将其移至Header组件中并设置required="Y"。
示例正确结构:
<component name="Header"> <field name="BeginString" required="Y"/> <field name="BodyLength" required="Y"/> <field name="MsgType" required="Y"/> <!-- 其他Header字段 --> <field name="DeliverToCompID" required="Y"/> <!-- 放置在此处 --> </component> <message name="NewOrderSingle" msgtype="D" msgcat="app"> <fields> <!-- NewOrderSingle自身的必填字段,如ClOrdID、Symbol等 --> <!-- 请勿在此添加DeliverToCompID --> </fields> </message>
2. 确保Fiximulator加载最新字典
- 重启Fiximulator,避免缓存旧的字典规则,确保它加载了修改后的自定义FIX42.xml。
- 在Fiximulator配置界面再次确认,已选中的是修改后的字典文件,而非默认的标准FIX42.xml。
3. 验证消息的实际结构
- 查看发送方Banzai和接收方Fiximulator的原始消息字符串(非结构化日志),确认Tag128确实出现在Header部分(在MsgType(Tag35)之前)。
示例正确的消息开头:8=FIX.4.2|9=xxx|35=D|128=FIXIMULATOR3|...(后续为消息体字段) - 如果Tag128出现在消息体部分,说明代码设置位置有误,需检查
message.getHeader().setField(...)是否被正确执行——比如是否存在逻辑覆盖Header字段,或误用message.setField()(将字段设置到消息体)的情况。
4. 确认Banzai的会话配置有效性
- 检查配置文件中
DeliverToCompID是针对当前会话的配置,而非全局或其他会话。 - 在代码中添加日志,输出
message.getHeader().getField(new DeliverToCompID())的值,确认发送前Header中确实存在该字段且值正确。
内容的提问来源于stack exchange,提问作者Ahmad Hasan
相关产品推荐
相关产品推荐

