2017-06-29 18 views
1

私は株式市場と為替市場に取り組んでいます。私は次のような状況があります:ログから文字列を取り出し、それを "Message"型Objectに変換する必要があります。 this linkに従って、私はJAVAの "MessageUtils"クラスの3つのメソッドをすべて試してみました。しかし、私のStringは一意のタグを持つMessageクラス型のオブジェクトに取り除かれています。しかし、私の文字列が "MarketDataIncrementalRefresh"型であるので、私はすべてのすべてのタグをMessageに入れることを望みます。JavaのQUICKFIXでstringをMarketDataIncrementalRefreshに変換する方法は?

例:「MessageUtils.parse()」メソッドに次の文字列を指定しています。

8 = FIX.4.2 | 9 = 00795 | 35 = W | = 49 TT_PRICE | 56 = SAP0094X | = 2392 34 | 52 = 20170623から04:41:33.375 | 55 = CL | 48 = 00A0HR00CLZ | 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 = 271 = 46 | 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 = 271 = 31 | 269 = 1 | 290 = 10 | 290 = 9 | 270 = 4297 | 271 = 31 | 269 = 1 | 290 = 8 | 270 = 4298 | 271 = 55 | 269 = 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 | = 192 9 | 35 = W | = 2 34 | 49 = TT_PRICE | 52 = 20170622から14:16: 23685 = 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 configuration](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); 

はつまり、あなたのデータディクショナリを修正して、代わりに「ヌル」を渡すのparseメソッドに渡す必要があり

+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))私は、 MessageUtilsは検証も行います(誤った注文のためメッセージは無効です)。 'Message.fromString'を見て、私は' doValidation'パラメータを見ています。もしfalseに設定されていれば、まだそのトリックを行うことができます。 –

+1

私の前のコメントに加えて、 'MessageUtils.parse'は、' doValidation'パラメータが 'dataDictionary!= null'に設定された' Message.fromString'に委任します。 –

関連する問題