#quickfix #fix-protocol
#quickfix #исправление-протокол
Вопрос:
Мы получаем сообщение об исправлении из исходной базы данных и должны проанализировать и сохранить в нашей системе. Они из ICE exchange (WebICE), и мы используем QuickFix и FIX42.xml словарь данных для анализа сообщений.
Мы можем успешно анализировать отчеты о выполнении и UD (пользовательские стратегии), но это не позволяет определить безопасность при попытке проанализировать повторяющиеся группы.
Ниже приведен пример кода с сообщением.
val testMessage = "8=FIX.4.2^A9=97129^A35=d^A49=ICE^A34=21^A52=20200904-11:00:16.742^A56=8428^A57=123abc^A322=1^A323=4^A320=XX_Security_Request 0^A9064=0^A393=19275^A82=193^A67=1^A711=3^A311=2322323^A309=MSS SDU0320.U0320^A308=IFED^A305=8^A9013=0.001^A9133=2.500^A9134=2.500^A9040=0.001^A9041=2500^A307=XYXYXYXYXYX^A763=0^A1039=C^A9014=2500.0^A9017=57500.0^A326=17^A998=TEST TEST^A318=USD^A9083=3^A9084=0^A9085=daily^A9061=467^A9062=TEST TEST Futures^A9063=Product Description^A9032=2.500^A9030=1^A9132=2.500^A9091=Test Malin^A9092=1^A9093=0^A9095=Energy^A9215=0^A9217=0^A9205=0^A436=1.0^A9216=0^A463=FXXXXX^A542=20200904^A9100=USD^A9101=USD / TEST TEST^A9022=1^A9024=1.0^A9049=1^A9203=1^A9025=Y^A916=20200903^A917=20200903^A9201=69360^A9200=4^A9202=03 Sep 20^A9300=656^A9301=TEST Gas Transmission - Malin^A9302=PGT-Malin^A9303=MSS^A9034=1^A9070=16^A9071=0^A9072=K^A9073=25.0^A9071=1^A9072=K^A9073=1.0^A9071=2^A9072=K^A9073=1.0^A9071=3^A9072=K^A9073=1.0^A9071=0^A9072=V^A9073=1.0^A9071=1^A9072=V^A9073=1.0^A9071=2^A9072=V^A9073=1.0^A9071=3^A9072=V^A9073=1.0^A9071=0^A9072=S^A9073=1.0^A9071=1^A9072=S^A9073=1.0^A9071=2^A9072=S^A9073=1.0^A9071=3^A9072=S^A9073=1.0^A9071=0^A9072=E^A9073=1.0^A9071=1^A9072=E^A9073=1.0^A9071=2^A9072=E^A9073=1.0^A9071=3^A9072=E^A9073=1.0^A311=624232323233062^A309=PES SDU0320.U0320^A308=IFED^A305=8^A9013=0.001^A9133=2.500^A9134=2.500^A9040=0.001^A9041=2500^A307=Test Desc Futures - Permian (EP) - 03 Sep 20^A763=0^A1039=C^A9014=2500.0^A9017=57500.0^A326=17^A998=TEST TEST^A318=USD^A9083=3^A9084=0^A9085=daily^A9061=476^A9062=TEST TEST Futures^A9063=Product Description ^A9032=2.500^A9030=1^A9132=2.500^A9091=Test EPPermian^A9092=1^A9093=0^A9095=Energy^A9215=0^A9217=0^A9205=0^A436=1.0^A9216=0^A463=FXXXXX^A542=20200904^A9100=USD^A9101=USD / TEST TEST^A9022=1^A9024=1.0^A9049=1^A9203=1^A9025=Y^A916=20200903^A917=20200903^A9201=69360^A9200=4^A9202=03 Sep 20^A9300=665^A9301=El Paso - Permian Basin^A9302=Permian (EP)^A9303=PES^A9034=1^A9070=16^A9071=0^A9072=K^A9073=25.0^A9071=1^A9072=K^A9073=1.0^A9071=2^A9072=K^A9073=1.0^A9071=3^A9072=K^A9073=1.0^A9071=0^A9072=V^A9073=1.0^A9071=1^A9072=V^A9073=1.0^A9071=2^A9072=V^A9073=1.0^A9071=3^A9072=V^A9073=1.0^A9071=0^A9072=S^A9073=1.0^A9071=1^A9072=S^A9073=1.0^A9071=2^A9072=S^A9073=1.0^A9071=3^A9072=S^A9073=1.0^A9071=0^A9072=E^A9073=1.0^A9071=1^A9072=E^A9073=1.0^A9071=2^A9072=E^A9073=1.0^A9071=3^A9072=E^A9073=1.0^A311=23232323^A309=SCS SDU0320.U0320^A308=IFED^A305=8^A9013=0.001^A9133=2.500^A9134=2.500^A9040=0.001^A9041=2500^A307=Test Desc Futures - Socal-TEST - 03 Sep 20^A763=0^A1039=C^A9014=2500.0^A9017=57500.0^A326=17^A998=TEST TEST^A318=USD^A9083=3^A9084=0^A9085=daily^A9061=1462^A9062=TEST TEST Futures^A9063=Product Description ^A9032=2.500^A9030=1^A9132=2.500^A9091=Test Socal Cty^A9092=1^A9093=0^A9095=Energy^A9215=0^A9217=0^A9205=0^A436=1.0^A9216=0^A463=FXXXXX^A542=20200904^A9100=USD^A9101=USD / TEST TEST^A9022=1^A9024=1.0^A9049=1^A9203=1^A9025=Y^A916=20200903^A917=20200903^A9201=69360^A9200=4^A9202=03 Sep 20^A9300=1277^A9301=Socal - TEST^A9302=Socal-TEST^A9303=SCS^A9034=1^A9070=16^A9071=0^A9072=K^A9073=25.0^A9071=1^A9072=K^A9073=1.0^A9071=2^A9072=K^A9073=1.0^A9071=3^A9072=K^A9073=1.0^A9071=0^A9072=V^A9073=1.0^A9071=1^A9072=V^A9073=1.0^A9071=2^A9072=V^A9073=1.0^A9071=3^A9072=V^A9073=1.0^A9071=0^A9072=S^A9073=1.0^A9071=1^A9072=S^A9073=1.0^A9071=2^A9072=S^A9073=1.0^A9071=3^A9072=S^A9073=1.0^A9071=0^A9072=E^A9073=1.0^A9071=1^A9072=E^A9073=1.0^A9071=2^A9072=E^A9073=1.0^A9071=3^A9072=E^A9073=1.0^A10=210^A"
val dd: DataDictionary = new DataDictionary("FIX42.xml")
val message: Message = new quickfix.Message(testMessage,dd)
val noOfunderlyings= message.getInt(711)
println("Underlyings " noOfunderlyings)
for(i <- 1 to noOfunderlyings ) {
val FixGroup: Group = message.getGroup(i, 711)
println("UnderlyingSecurityID : " FixGroup.getString(309))
}
Сбой в строке: val FixGroup: Group = message.getGroup(i, 711)
С сообщением об ошибке ниже
Exception in thread "main" quickfix.FieldNotFound: 711, index=1
at quickfix.FieldMap.getGroup(FieldMap.java:644)
Мы проверили словарь данных, и там присутствуют повторяющиеся группы. Также тот же словарь данных использовался в исходном конце в FIX client engine для получения сообщений от exchange.
Словарь данных: словарь данных
На данный момент это стало для нас узким местом. Запрашиваю помощь у всех других пользователей SO.
Сегмент тега DD 9064 -> ExchangeSilo (Int)
711 tag -> NoUnderlyings (нумерация групп)
<message name='SecurityDefinition' msgtype='d' msgcat='app'>
<field name='SecurityResponseID' required='Y' />
<field name='SecurityResponseType' required='N' />
<field name='SecurityReqID' required='Y' />
<field name='SecurityID' required='N' />
<field name='ExchangeSilo' required='N' />
<field name='TotalNumSecurities' required='Y' />
<field name='Symbol' required='N' />
<field name='NoRpts' required='N' />
<field name='ListSeqNo' required='N' />
<!-- USEFUL FOR THE NEW SECURITY DEFINITION RESPONSE-->
<group name='NoUnderlyings' required='N'>
<field name='UnderlyingSymbol' required='N' />
<field name='UnderlyingSecurityID' required='N' />
<field name='UnderlyingSecurityExchange' required='N' />
<field name='UnderlyingIDSource' required='N' />
<field name='IncrementPrice' required='N' />
<field name='ScreenTickValue' required='N' />
Комментарии:
1. Не могли бы вы опубликовать
testMessage
с видимыми разделителями, например, символом канала|
? В противном случае трудно определить, где заканчивается один тег и начинается другой. Какой тег после 320? Это 9064 или только 64? Если первое, определено ли оно в вашем словаре данных? Может быть, это неизвестно, и это ломает анализатор? Не могли бы вы распечатать сообщение после его анализа? Я предполагаю, что синтаксический анализ нарушен из-за неизвестного тега, и именно поэтому 711 не найден. OTOH, это, вероятно, неправильно распечатало бы ваши базовые элементы. Итак, вы получаете 33 там?2. @ChristophJohn Большое спасибо за ответ, фактическое сообщение ограничено символом SOH, который был удален при вставке сообщения здесь. Я обновил сообщение разделителем «^ A».
3. И тег 9064 содержится в вашем словаре в этой позиции (т.Е. Перед группой 711)?
4. В настоящее время нет доступа к компьютеру, только мобильный. Что происходит, когда вы вызываете
dd.validate
сообщение после построения? Есть ошибки?5. Да, в повторяющейся группе поля должны располагаться в том же порядке, что и в словаре.