2017-06-29 95 views
1

我正在股票和外汇市场工作。我有这样的情况:我需要从日志中取出一个字符串,并将其转换为“消息”类型的对象。按照this link我尝试使用JAVA中的“MessageUtils”类的所有三种方法。但我的字符串被剥离到具有唯一标记的Message类型对象。但是因为我的字符串是“MarketDataIncrementalRefresh”类型,我希望每个标签都出现在消息中。如何在Java的QUICKFIX中将字符串转换为MarketDataIncrementalRefresh?

例如:我将以下字符串提供给“MessageUtils.parse()”方法。

8 = FIX.4.2 | 9 = 00795 | 35 = W | 49 = TT_PRICE | 56 = SAP0094X | 34 = 2392 | 52 = 20170623-04:41:33.375 | 55 = CL | 48 = 00A0HR00CLZ | 10455 = CLQ7 | 167 = FUT | 207 = CME | 15 = USD | 262 = MDRQ-751 | 200 = 201708 | 18210 = 1 | 387 = 12292 | 268 = 24 | 269 = 0 | 290 = 1 | 270 = 4290 | 271 = 33 | 269 = 0 | 290 = 2 | 270 = 4289 | 271 = 34 | 269 = 0 | 290 = 3 | 270 = 4288 | 271 = 40 | 269 = 0 | 290 = 4 | 270 = 4287 | 271 = 38 | 269 = 0 | 290 = 5 | 270 = 4286 | 271 = 46 | 269 = 0 | 290 = 6 | 270 = 4285 | 271 = 53 | 269 = 0 | 290 = 7 | 270 = 4284 | 271 = 46 | 269 = 0 | 290 = 8 | 270 = 4283 | 271 = 66 | 269 = 0 | 290 = 9 | 270 = 4282 | 271 = 48 | 269 = 0 | 290 = 10 | 270 = 4281 | 271 = 64 | 269 = 1 | 290 = 1 | 270 = 4291 | 271 = 21 | 269 = 1 | 290 = 2 | 270 = 4292 | 271 = 40 | 269 = 1 | 290 = 3 | 270 = 4293 | 271 = 48 | 269 = 1 | 290 = 4 | 270 = 4294 | 271 = 83 | 269 = 1 | 290 = 5 | 270 = 4295 | 271 = 62 | 269 = 1 | 290 = 6 | 270 = 4296 | 271 = 46 | 269 = 1 | 290 = 7 | 270 = 4297 | 271 = 34 | 269 = 1 | 290 = 8 | 270 = 4298 | 271 = 55 | 269 = 1 | 290 = 9 | 270 = 4299 | 271 = 31 | 269 = 1 | 290 = 10 | 270 = 4300 | 271 = 128 | 269 = 2 | 270 = 4291 | 271 = 1 | 269 = 4 | = 270 4280 | 269 = 7 | 270 = 4292 | 269 = 8 | 270 = 4277 | 10 = 044 |

但是我得到是这样的:

8 = FIX.4.2 | 9 = 192 | 35 = W | 34 = 2 | 49 = TT_PRICE | 52 = 20170622-14:16: 23.685 | 56 = SAP0094X | 15 = USD | 48 = 00A0HR00GCZ | 55 = GC | 167 = FUT | 200 = 201708 | 207 = CME | 262 = MDRQ-21 | 268 = 25 | 269 = 0 | 270 = 12510 | 271 = 24 | 290 = 1 | 387 = 121890 | 10455 = GCQ7 | 18210 = 1 | 10 = 036 |

正如您所看到的,只有字符串中存在唯一标签。但是我想要每一个标签,不管它在提供的字符串中存在多少次。

请任何人都可以帮助我在JAVA中做到这一点。这将是非常可观的。

下面是我使用的转换代码:

  MessageUtils mu = new MessageUtils(); 
     Session session = Session.lookupSession(sessionID); 
     Message msg = MessageUtils.parse(new DefaultMessageFactory(), null, str); 
    // Message msg = new Message(str, false); //This can also be used for converting 
     System.out.println(msg.toString()); 
+0

你可以发布带有'SOH'字符的管道符号('|')替换的FIX消息吗?因为现在这个信息太难读取和解释了(字段分隔符是不可见的)。 –

+0

谢谢。肯定更新。 –

回答

1

我认为这个问题是如下。有一个以标签286(NoMDEntries)开头的重复组。重复组中字段的顺序应该是严格的,即与重复组的定义相同的顺序。请参阅Market Data - Snapshot/Full Refresh或QuickFIX/J(FIX42.xml)提供的数据字典。

268标记后面应该跟着269,然后是270.我在消息字符串中看到:|268=24|269=0|290=1|270=4290|这是标记的不正确顺序。这可能是邮件被MessageUtils.parse截断的原因。

作为一项测试,您可以尝试手动更正字符串中的顺序并尝试解析,看看是否给出了正确的消息。

+0

非常感谢。问题出在标签的顺序上。非常非常感谢你。 –

+0

即使标签的顺序不正确,是否有方法可以形成字符串? –

+0

@hemachandra也许在会话的配置中将'ValidateUnorderedGroupFields'标志设置为'N'。有关详细信息,请参见[QuickFIX/J配置](http://www.quickfixj.org/quickfixj/usermanual/1.6.3/usage/configuration.html)。我不知道这是否可行,但你可以试一试。 –

2

另一个线程说:

MessageUtils.parse(MessageFactory messageFactory, DataDictionary dataDictionary, java.lang.String messageString) 

而且你的代码说:

Message msg = MessageUtils.parse(new DefaultMessageFactory(), null, str); 

所以你需要修复您的数据字典,并将它传递给解析方法,而不是通过“零”

+0

这可能会更好地工作,但浏览GitHub上的代码(['MessageUtils'](https://github.com/quickfix-j/quickfixj/blob/e2a0fc0636b70d2f735815c6773b5f8dbb993d16/quickfixj-core/src/main/java/ quickfix/MessageUtils.java)和['Message'](https://github.com/quickfix-j/quickfixj/blob/master/quickfixj-core/src/main/java/quickfix/Message.java))I' m认为MessageUtils也会进行验证(由于排序不正确,该消息无效)。看看'Message.fromString'通过我看到一个参数'doValidation',如果设置为false仍然可以做到这一点。 –

+1

除了我以前的评论,'MessageUtils.parse'委托给'Message.fromString',参数'doValidation'设置为'dataDictionary!= null'。 –

相关问题