发送Order Cancel/Replace Request时遇invalid integral value报错求助
问题:Order Cancel/Replace Request中PERCENTAGE类型字段30022设置小数被拒,提示invalid integral value
问题详情
- 发送**Order Cancel/Replace Request(MsgType=G)**时,给自定义字段30022设置小数数值(如0.8),收到拒绝报文
- 错误信息:
invalid integral value: 0.8,对应SessionRejectReason为INCORRECT_DATA_FORMAT_FOR_VALUE - 关键矛盾点:
- 该字段在FIX字典中定义为PERCENTAGE类型,本应支持小数
- 其他同类型PERCENTAGE字段无此问题
- 在NewOrderSingle报文中设置该字段小数数值完全正常
- 尝试
replace.setString(30022, textValue)、setDouble、setDecimal三种赋值方式均触发相同报错 - 错误来自IntConverter类的convert方法,但仅在发送MsgType=G报文时被调用
发送的替换报文:
8=FIX.4.49=31735=G34=349=SILICONBOVDEVEL0152=20240812-14:22:30.82856=SILICONBOVDEV1=32111=30022552721=438=100040=241=140438870644=1054=155=MBOTFBOV159=060=20240812-14:22:30.819111=1000847=10130022=0.830023=14:05:0130024=20:50:0030025=1030026=100030036=1030038=Y30057=0453=2448=935452=7448=TZINI452=3610=166
收到的拒绝报文:
8=FIX.4.49=13135=334=349=SILICONBOVDEV52=20240812-14:22:30.93356=SILICONBOVDEVEL0145=358=invalid integral value: 0.8371=30022372=G373=610=181
排查方向与解决思路
- 核对FIX字典的消息类型专属配置
检查本地使用的FIX字典,确认字段30022在**MsgType=G(Order Cancel/Replace Request)**下的类型是否被错误映射为INT而非PERCENTAGE。部分FIX库允许针对不同消息类型单独配置字段类型,可能存在配置遗漏或错误。 - 确认交易对手方的字段配置
联系交易对手方,核实他们的FIX引擎中,MsgType=G下的30022字段类型是否为PERCENTAGE。对方可能错误将该字段配置为整数类型,导致接收时用IntConverter解析小数触发报错。 - 调试本地FIX库的字段处理逻辑
跟踪本地代码执行流程,查看构建MsgType=G报文时,字段30022的类型推断逻辑是否异常。自定义字段(30000+段)的处理可能存在消息类型分支错误,导致库错误调用了IntConverter而非PercentageConverter。 - 临时兼容方案:显式指定字段类型
如果无法快速修正配置或库逻辑,可尝试在赋值时明确指定字段类型为PERCENTAGE,避免库自动推断出错。示例代码(根据所用FIX库调整):// 使用DecimalField显式设置数值与字段类型 replace.setField(new DecimalField(30022, new BigDecimal("0.8"))); // 或直接指定字段类型的方式 replace.setField(new Field(30022, "0.8", FieldType.PERCENTAGE));
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

