2017-06-29 78 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'。 –

相關問題