QuickFix4J 正在截断 FIX 消息中的重复组



>我有一个 FIX 消息作为字符串,我正在使用 QuickFix4J 从此消息创建一个消息对象,以便我可以将其发送给另一方。

我正在使用的数据字典是另一方给我的。

但是当我使用 DD 解决它并创建消息时,许多字段(尤其是重复的字段)被截断。基本上,当一组字段重复时,最终消息只有重复字段的一个实例。

这是我的原始信息:

8=FIXT.1.1|9=1288|35=X|34=1163|49=XX|52=20190410-10:27:43|56=XXXXXXXXXXXXXXXXXXXXX|131=XXXXXXXXXXXXXX_2019410_155743|146=1|55=[X/X]|48=58013XXX5|22=1|6360=XXXXXXXX XXXXXXXX|454=1|455=XX58013XXX54|456=4|20200=2|20201=1|20202=6|20203=99.06300000|20204=1111.00|20205=3|20206=XXX2|20201=2|20202=6|20203=0.14400000|20204=2222.00|20205=3|20206=XXX2|460=3|1227=XXXX|29703=XXXX XXXX|167=XXXX|541=20350410|225=20170410|223=0.03500000|106=XXXXXXXXX XXXX XXXXXX XXXX XXX XXXX XXXXX|107=XXX  3.500  3/1/27 X26|873=20170309|54=2|38=188000|64=20190412|15=XXX|126=20190410-10:32:43|60=20190410-10:27:43|663=1|699=9128286X1|761=1|29715=XX9128286X18|29716=4|29717=XXX|29718=0.02625000|29719=20290215|423=6|453=7|448=XXXXXXX1|447=X|452=11|802=1|523=XXXXXXX XXXXXX XX XXX|803=9|448=XXXX|447=X|452=13|448=XXX XXXXXXXXXX 5|447=X|452=13|448=XXXXXX33|447=X|452=17|802=1|523=0355|803=17|448=XXXX|447=X|452=17|448=XXXXXX XXXXXX XXXXXXXXXX (XXX) XXX|447=X|452=17|448=XXXXXXX|447=X|452=13|58=XXXXXX5 (XXXXXXXXXX, XXXXXXX XXXXXX XX XXX)  XXXXXXXX  XXX XX $100,000 XXX 3.500 03/01/27 X26, XXXXXXXXX XXX 2.625 02/29, XXX XX 2 XXXX XXXXX-XXXXXXX , XXXX XXXX.|5625=2|20117=10155743|5961=XXXXXX|5626=3|20012=1 3|5215=X|5627=XXXXXXXXX|5630=XXXXXXX, XXXX|20120=X2X-XXX-XXXX|21031=X|21032=X|20013=0.3|29724=60|22203=XXXX|29741=000X|29742=1000|10=144|

这是创建消息对象后的消息:

8=FIXT.1.1|9=262|35=X|34=656|49=XX|52=20190410-10:27:45.566|56=XXXXXXXXXXXXXXXXXXXXX|131=XXXXXXXXXXXXXX_2019410_155743|146=1|55=[X/X]|48=58013XXX5|22=1|6360=XXXXXXXX XXXXXXXX|454=1|455=XX58013XXX54|456=4|20200=2|20201=2|20202=6|20203=99.06300000|20204=1111.00|20205=3|20206=XXX2|10=111|

这是我用来创建消息的代码:

rawMessage = new Message(newmessage, dataDictionary, false);
Session.sendToTarget(rawMessage, sessionID)

有没有办法我可以按原样发送消息,而无需 quickfix4j 尝试解决它并因此截断字段。不幸的是,我无法共享 DD。

我看到两个问题:

第一个问题:你的方法是一个错误

rawMessage = new Message(newmessage, dataDictionary, false);
Session.sendToTarget(rawMessage, sessionID)

你不能这么做! 序列号、时间戳等不再有效!

您是否正在创建一个幼稚的消息重播器? (为什么人们一直试图这样做? 这是行不通的! FIX 消息流具有不能盲目重播的状态。

如果要创建测试工具,它需要比这更智能。 停止你正在做的事情,重新考虑你的方法。

第二个问题:您的 DD 可能有错误

截断的重复组始终意味着数据字典问题。 DD 与正在分析的消息不匹配。 以下情况之一肯定会发生:

  • 消息在组中放置了一个字段,该字段不在 DD 对该组的定义中
  • 消息组的字段顺序不正确(与 DD 的顺序相比)

解析组时,引擎将在看到它不期望的字段时立即结束该组。

我正在使用的数据字典是另一方给我的。

不要相信它! 交易对手在自己的文档中犯了错误,因为他们实际上并没有使用它们,或者因为他们的内部版本比他们发布的版本更新。

开始根据他们给您的DD手动解析您的消息,我敢打赌您会发现错误。

谢谢格兰特的输入,最后我们发现错误是重复组的顺序不对:

datadictionary.setCheckUnorderedGroupFields(false);

解决了。

最新更新