ПоискПоиск  ПравилаПравила  ПользователиПользователи  ПрофильПрофиль  РегистрацияРегистрация  ВходВход
Форум «Техническая поддержка»
Форум для разработчиков и пользователей программного обеспечения, использующегося на бирже.

Раздел тех.поддержки | Форма обратной связи Тех.поддержка ОАО Московская Биржа: +7 (495) 733-9507, 287-7691
Расшифровка полей FAST по шаблону
Новая тема   Ответить на тему
На страницу 1, 2, 3, 4, 5, 6, 7  След.
 Предыдущая тема :: Следующая тема 
 Автор  Сообщение 
Apollo
Стаж: 1 год 7 месяцев
Сообщений: 50
Ср Авг 03, 2016 12:42 Ответить с цитатой Получить постоянный адрес сообщения
Всем привет!
Пишу декодер для расшифровки FAST сообщений и хочу уточнить некоторые наблюдения:
<string name="MessageType" id="35">
<constant value="A"/>
</string>

Такое поле говорит о том, что тип данных этого поля - string, номер поля - 35, а строчка
<constant value="A"/>
говорит о том, что в PMAP это поле будет стоять в 0, так как поле имеет константное значение... Всё правильно?
------------------------------------------------
<string name="Username" id="553" presence="optional"/>

В этом поле строчка presence="optional говорит о том, что это поле может присутствовать, а может и отсутствовать в конкретном сообщении. Уточнять это нужно в PMAP полученного сообщения... Так?
------------------------------------------------
<sequence name="GroupMDEntries">

Не понял какие особенности несет в себе последовательность, кроме как играть роль области видимости внутри сообщения, что дает возможность использовать повторно имена полей, которые не входят в эту последовательность...
------------------------------------------------
<string name="DealNumber" id="9885" presence="optional">
<copy/>
</string>

Сколько не читал буржуйской литературы так и не понял что делает атрибут <copy/>... Обьясните пожалуйста.


Помогите пожалуйста разобраться с вышеописанными полями и строками... Это те камни преткновения, которые меня затормозили Sad 
 
Последний раз редактировалось автором 03.08.2016 12:43, всего редактировалось 1 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Авг 03, 2016 13:27 (спустя 45 минут) Ответить с цитатой Получить постоянный адрес сообщения
По PMAP. Тут нужно детально изучать эту тему. Перечитывать инет, перечитывать этот форум. Пока не могу покопаться в исходниках, по памяти:

1) PMAP не распространяется на const.
2) по комментариям биржи на этом форуме, годов так 2012-2013, pmap не распространяется на optional и они (поля) приходят в любом случае.

Вообще насколько помню (нужно глянуть исходники), pmap распространяется только на операторы. Могу ошибаться, испробуйте методом тыка.

Про последовательность ничего не понял. Попробуйте изложить вопрос яснее.

Про copy, вроде как копирует с предыдущего, нет? Не разберетесь, залезу в исходники, как время будет. 
 
Последний раз редактировалось автором 03.08.2016 13:28, всего редактировалось 1 раз
Apollo
Стаж: 1 год 7 месяцев
Сообщений: 50
Ср Авг 03, 2016 21:03 (спустя 8 часов 20 минут) Ответить с цитатой Получить постоянный адрес сообщения
1. Про const стало ясно - такие поля также в PMAP не указываются.
2. Насколько я понял, поля с атрибутом optional в любом случае приходят в PMAP, и если бит стоит, то значение есть в сообщении, если бита нет - то, соответственно, и значение не приходило (но тогда вопрос чем такие поля отличаются от обычных полей (не const)?).
3. Про последовательности хотел написать то, что я не понял для чего они нужны... Каков их смысл? Зачем создали последовательность?
4. Про copy понял... Этот атрибут дает команду использовать предыдущее значение, если бит в PMAP равен 0.
5. Еще немного непонятно, как работать с типом данных decimal. Понятно, что это вещественное число. Как мне его перевести в тип float (C++)? Есть особенности? 
 
Последний раз редактировалось автором 03.08.2016 21:05, всего редактировалось 1 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Авг 03, 2016 21:15 (спустя 8 часов 33 минуты) Ответить с цитатой Получить постоянный адрес сообщения
Apollo писал(а):

3. Про последовательности хотел написать то, что я не понял для чего они нужны... Каков их смысл? Зачем создали последовательность?
 

Последовательность, это когда поля в отдельной группе?
Там есть у нее поле length (или size, опять пишу по памяти). Это означает, сколько таких "последовательностей"/групп в сообщении пришло. Они стоят друг за дружкой.

То есть примерно вот так может быть, если length = 2
<sequence name="GroupMDEntries">
...
...
...
<>
<sequence name="GroupMDEntries">
...
...
...
<>

Надеюсь пояснение вы мое поняли. 
 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Авг 03, 2016 21:18 (спустя 8 часов 36 минут) Ответить с цитатой Получить постоянный адрес сообщения
Apollo писал(а):

5. Еще немного непонятно, как работать с типом данных decimal. Понятно, что это вещественное число. Как мне его перевести в тип float (C++)? Есть особенности? 


как то вы не озадачиваетесь чтением =).
дробные числа приходят в виде двух полей. первое поле - мантисса, второе поле - экспонента. 
 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Авг 03, 2016 21:20 (спустя 8 часов 37 минут) Ответить с цитатой Получить постоянный адрес сообщения
Apollo писал(а):

2. Насколько я понял, поля с атрибутом optional в любом случае приходят в PMAP,
 

наверное все таки нет. Я писал не так. Перечитайте тогда комментарии в соответствующих ветках форума. Там есть официальный ответ от представителя биржи. 
 
Apollo
Стаж: 1 год 7 месяцев
Сообщений: 50
Ср Авг 03, 2016 21:31 (спустя 8 часов 49 минут) Ответить с цитатой Получить постоянный адрес сообщения
О последовательности:
Вот пример...
<template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="X-Generic" id="2104">
<string name="MessageType" id="35">
<constant value="X"/>
</string>
<string name="ApplVerID" id="1128">
<constant value="9"/>
</string>
<string name="BeginString" id="8">
<constant value="FIXT.1.1"/>
</string>
<string name="SenderCompID" id="49">
<constant value="MOEX"/>
</string>
<uInt32 name="MsgSeqNum" id="34"/>
<uInt64 name="SendingTime" id="52"/>
<sequence name="GroupMDEntries">
<length name="NoMDEntries" id="268"/>
<uInt32 name="MDUpdateAction" id="279" presence="optional"/>
<string name="MDEntryType" id="269" presence="optional"/>
<string name="MDEntryID" id="278" presence="optional"/>
<int32 name="RptSeq" id="83" presence="optional"/>
<uInt32 name="MDEntryDate" id="272" presence="optional"/>
<uInt32 name="OrigTime" id="9412" presence="optional"/>
<uInt32 name="SettlDate" id="64" presence="optional"/>
<string name="SettleType" id="5459" presence="optional"/>
<uInt32 name="MDEntryTime" id="273" presence="optional"/>
<uInt32 name="EffectiveTime" id="5902" presence="optional"/>
<uInt32 name="StartTime" id="9820" presence="optional"/>
<string name="Symbol" id="55" presence="optional"/>
<decimal name="MDEntryPx" id="270" presence="optional"/>
<decimal name="MDEntrySize" id="271" presence="optional"/>
<string name="QuoteCondition" id="276" presence="optional"/>
<string name="TradeCondition" id="277" presence="optional"/>
<string name="OpenCloseSettlFlag" id="286" presence="optional"/>
<string name="OrdType" id="40" presence="optional"/>
<decimal name="NetChgPrevDay" id="451" presence="optional"/>
<decimal name="AccruedInterestAmt" id="5384" presence="optional"/>
<decimal name="ChgFromWAPrice" id="5510" presence="optional"/>
<decimal name="ChgOpenInterest" id="5511" presence="optional"/>
<decimal name="BidMarketSize" id="5292" presence="optional"/>
<decimal name="AskMarketSize" id="5293" presence="optional"/>
<int32 name="TotalNumOfTrades" id="6139" presence="optional"/>
<decimal name="TradeValue" id="6143" presence="optional"/>
<decimal name="Yield" id="236" presence="optional"/>
<decimal name="TotalVolume" id="5791" presence="optional"/>
<int32 name="OfferNbOr" id="9168" presence="optional"/>
<int32 name="BidNbOr" id="9169" presence="optional"/>
<decimal name="ChgFromSettlmnt" id="9750" presence="optional"/>
<int32 name="SumQtyOfBest" id="10503" presence="optional"/>
<string name="OrderSide" id="10504" presence="optional"/>
<string name="OrderStatus" id="10505" presence="optional"/>
<decimal name="MinCurrPx" id="10509" presence="optional"/>
<uInt32 name="MinCurrPxChgTime" id="10510" presence="optional"/>
<uInt32 name="VolumeIndicator" id="7017" presence="optional"/>
<decimal name="Price" id="44" presence="optional"/>
<int32 name="PriceType" id="423" presence="optional"/>
<decimal name="NominalValue" id="9280" presence="optional"/>
<decimal name="RepoToPx" id="5677" presence="optional"/>
<decimal name="BuyBackPx" id="5558" presence="optional"/>
<uInt32 name="BuyBackDate" id="5559" presence="optional"/>
<string name="DealNumber" id="9885" presence="optional">
<copy/>
</string>
<string name="CXFlag" id="5154" presence="optional">
<copy/>
</string>
<string name="TradingSessionID" id="336" presence="optional"/>
<string name="TradingSessionSubID" id="625" presence="optional"/>
</sequence>
</template>


Получается, что если значение length будет 3, то это значит, что после закрытия последовательности </sequence> в сообщении стоит опять она же? Зачем это? В PMAP учитывается всё это? 
 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Авг 03, 2016 23:02 (спустя 10 часов 19 минут) Ответить с цитатой Получить постоянный адрес сообщения
Apollo писал(а):

Получается, что если значение length будет 3, то это значит, что после закрытия последовательности </sequence> в сообщении стоит опять она же? Зачем это? В PMAP учитывается всё это? 

Пока что, я могу вам порекомендовать начать разбирать данные и набираться опыта. Если у вас не получается набрать данные (нет логинов, не получает мультикаст и тд), скачайте готовые дампы на ftp биржи. Когда у вас будет картинка перед глазами, я думаю, большинство вопросов у вас отпадет.

Что касательно цифры 3. Да, так и будет.
 
 
Последний раз редактировалось автором 03.08.2016 23:05, всего редактировалось 1 раз
Константин Мымрин
Стаж: 6 лет
Откуда: Московская биржа
Сообщений: 20
Чт Авг 04, 2016 14:43 (спустя 1 день 2 часа) Ответить с цитатой Получить постоянный адрес сообщения
Добрый день, рекомендую ознакомиться со стандартом FAST:
http://www.fixtradingcommunity.org/pg/file/fplpo/read/30255/fast-specification-version-11 
 
Apollo
Стаж: 1 год 7 месяцев
Сообщений: 50
Чт Авг 04, 2016 21:39 (спустя 1 день 8 часов) Ответить с цитатой Получить постоянный адрес сообщения
Константин Мымрин писал(а):
Добрый день, рекомендую ознакомиться со стандартом FAST:
http://www.fixtradingcommunity.org/pg/file/fplpo/read/30255/fast-specification-version-11 

Я бы с радостью... там ссылки не работают( 
 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Пт Авг 05, 2016 10:00 (спустя 1 день 21 час) Ответить с цитатой Получить постоянный адрес сообщения
Apollo писал(а):
Константин Мымрин писал(а):
Добрый день, рекомендую ознакомиться со стандартом FAST:
http://www.fixtradingcommunity.org/pg/file/fplpo/read/30255/fast-specification-version-11 

Я бы с радостью... там ссылки не работают( 


работают. Внимательно читайте, что там пишут 
 
Константин Мымрин
Стаж: 6 лет
Откуда: Московская биржа
Сообщений: 20
Пт Авг 05, 2016 10:51 (спустя 1 день 22 часа) Ответить с цитатой Получить постоянный адрес сообщения
Добрый день, для того чтобы стали доступны ссылки на стандарты нужно зарегистрироваться на сайте http://www.fixtradingcommunity.org 
 
Apollo
Стаж: 1 год 7 месяцев
Сообщений: 50
Пт Авг 05, 2016 12:42 (спустя 2 дня) Ответить с цитатой Получить постоянный адрес сообщения
Эту спецификацию я и читаю...
Помогите мне с самого начала, а то голова уже изломана вдоль и поперек... Получаю сообщение отсюда: 239.192.112.3; 10.50.129.200; 9023 такого содержания (это уже полезная нагрузка):

5d ee 01 00 e0 1b b8 07 5c dd 23 68 04 53 47 2b
59 89 83 82 b1 53 30 30 30 37 36 33 34 37 b5 45
55 52 5f 52 55 42 5f 5f 54 4f cd 04 0e e9 fc 2e
4c d3 81 09 98 24 06 6f 91 2d 3b 9a 43 45 54 d3
80 81 b1 53 30 30 30 37 37 31 33 30 b0 45 55 52
5f 52 55 42 5f 5f 54 4f cd 04 0e ea fe 3c a1 81
02 da 24 06 6f 91 2d 3d 9d 43 45 54 d3 80 81 b0
42 30 30 30 37 32 38 31 35 b0 55 53 44 30 30 30
55 54 53 54 4f cd 04 20 c5 fd 04 38 ef 81 03 c4
24 06 6f 91 2d 3d ab 43 45 54 d3 80


Начинаем парсить... Первые 4 байта по спецификации MOEX (5d ee 01 00) - это порядковый номер 126557 (пока трудностей нет).
Следующий байт - это PMAP, который говорит нам о том, что он состоит из одного байта (стоп-бит стоит), далее бит, указывающий на то, что далее располагается Template ID и бит, указывающий на то, что после Template ID будут данные для первого поля по шаблону в сообщении.
Template ID (1b bCool равен 3512 (Шаблон найден).

Теперь мы знаем как выглядит шаблон:
<!--  Market Data - Incremental Refresh OBR CURR -->
<template xmlns="http://www.fixprotocol.org/ns/fast/td/1.1" name="X-OBR-CURR" id="3512">
<string name="MessageType" id="35">
<constant value="X"/>
</string>
<string name="ApplVerID" id="1128">
<constant value="9"/>
</string>
<string name="BeginString" id="8">
<constant value="FIXT.1.1"/>
</string>
<string name="SenderCompID" id="49">
<constant value="MOEX"/>
</string>
<uInt32 name="MsgSeqNum" id="34"/>
<uInt64 name="SendingTime" id="52"/>
<sequence name="GroupMDEntries">
<length name="NoMDEntries" id="268"/>
<uInt32 name="MDUpdateAction" id="279" presence="optional"/>
<string name="MDEntryType" id="269" presence="optional"/>
<string name="MDEntryID" id="278" presence="optional"/>
<string name="Symbol" id="55" presence="optional"/>
<int32 name="RptSeq" id="83" presence="optional"/>
<decimal name="MDEntryPx" id="270" presence="optional"/>
<decimal name="MDEntrySize" id="271" presence="optional"/>
<uInt32 name="MDEntryTime" id="273" presence="optional"/>
<uInt32 name="OrigTime" id="9412" presence="optional"/>
<string name="TradingSessionID" id="336" presence="optional"/>
<string name="TradingSessionSubID" id="625" presence="optional"/>
</sequence>
</template>


Открыв шаблон видим, что первые 4 поля - константы (они не передаются в сообщении). Значит наше сообщение на данном этапе выглядит так: 35=X|1128=9|8=FIXT1.1|49=MOEX.
Вспоминаем, что в PMAP после Template ID стоял бит, значит поле по шаблону <uInt32 name="MsgSeqNum" id="34"/> имеет данные в присланном сообщении. Вытаскиваем для этого следующие 3 байта (07 5c dd). Получаем номер сообщения... Пока всё сходиться с преамбулой.

Но что делать дальше????? В PMAP остальные биты установлены в 0, что говорит о том, что в сообщении больше ничего не содержится... А там еще куча данных...

Обьясните мне на моем примере как обрабатываются данные дальше... Как обработать sequence...  
 
westtrd
Стаж: 6 лет 4 месяца
Откуда: Belarus
Сообщений: 1034
Пт Авг 05, 2016 13:06 (спустя 2 дня) Ответить с цитатой Получить постоянный адрес сообщения
Разбирайтесь, для каких полей задействован бит PMAP, а для каких нет. Эти азы подробно расписаны в стандарте. Для MsgSeqNum бит PMAP в соответствии со схемой, не задействован, так как у него noop оператор по дефолту. 
 
Apollo
Стаж: 1 год 7 месяцев
Сообщений: 50
Пт Авг 05, 2016 13:39 (спустя 2 дня) Ответить с цитатой Получить постоянный адрес сообщения
Я пытаюсь разобраться... читаю спецификацию... даже свой алгоритм последовательности описал, как и в какой последовательности я принимаю решение при распарсивании. Вы мне лучше на моём примере и на моей последовательности носом ткните что из шагов у меня не правильно.

Если можно, то используя приведенные выше полученное сообщение и шаблон сделайте соответствие полей в шаблоне... какие байты из полученного сообщения за что отвечают в шаблоне... Может так наглядней будет. 
 
Показать сообщения:   
Новая тема   Ответить на тему
Список разделов форума -> Техническая поддержкаНа страницу 1, 2, 3, 4, 5, 6, 7  След.
Страница 1 из 7

Rambler's Top100 Rambler's Top100
Рейтинг@Mail.ru
Copyright © Московская биржа, 2006-2017.
Ваши предложения, замечания и вопросы
по работе форума направляйте на email: