- PVSM.RU - https://www.pvsm.ru -
В одном из прошлых топиков мы рассмотрели протокол FIX [2], который был создан для передачи финансовой информации и автоматизации коммуникаций на фондовом рынке. Однако этот протокол оказался не самым идеальным инструментом в условиях все увеличивающихся объёмов финансовых данных, поэтому в качестве его развития был создан новый стандарт — протокол FAST (FIX Adapted for STreaming). Сегодня мы поговорим об этой технологии.
В ноябре 2004 года тогдашний CEO финансового холдинга Acrhipelago Holding Майк Кормак на конференции сообщества FIX под названием FPL (FIX Protocol Limited) в Нью-Йорке заявил о том, что текущая версия протокола не справляется с возросшим объёмом финансовой информации, генерируемой на фондовом рынке. При передачи больших объёмов данных с помощью FIX возникали значительные задержки в их обработке, что приносило трейдерам убытки и лишало их возможности разработки действующих торговых стратегий.
Классический формат передачи сообщений Tag=Value, использовавшийся в FIX, оказался слишком громоздким для его быстрой обработки. Вскоре после этого выступления, были сделаны первые шаги к исправлению ситуации.
При создании протокола FAST разработчики преследовали цель добиться возможности передачи больших объёмов данных, избегая появления задержек в получении информации. Разработкой протокола занималась рабочая группа сообщества FIX под названием «Группа оптимизации передачи рыночных данных» (Market Data optimization working group — mdowg), которая была сформирована в 2004 году.
В 2005 году эксперты группы представили пилотный проект (proof of concept) протокола, а уже через год был осуществлен релиз первой версии FAST 1.0. В дальнейшем было выпущено несколько обновлений, и в настоящий момент большинством игроков финансового рынка используется версия протокола 1.2. Также существует несколько открытых реализаций протокола (например, OpenFAST [3], OpenFAST.NET [4] и QuickFAST [5]).
Согласно стандарту FIX-протокола каждое сообщение имеет формат Tag = Value SOH, где Tag — это номер передаваемого поля, Value — его значение, а SOH — символ-разделитель (подробнее — в нашем прошлом материале [5]). Пример записи сообщения в синтаксисе Tag = Value:
35=x|268=3 (message header) 279=0|269=2|270=9462.50|271=5|48=800123|22=8 (trade) 279=0|269=0|270=9462.00|27
Протокол FAST позволяет избавиться от избыточности с помощью шаблона, который описывает структуру сообщения целиком. Этот метод называется «неявным тегированием» (implicit tagging), поскольку теги FIX в передаваемых данных только «подразумеваются». Итого, синтаксис Tag = Value меняется следующим образом:
Протокол FAST используется для получения рыночных данных.
Протокол FAST поддерживается целым рядом крупнейших мировых фондовых площадок, среди которых:
Рассмотрим подробнее реализацию FIX на «Московской Бирже».
«Московская Биржа» реализовала возможность предоставления доступа к финансовой информации по протоколу FAST [21]. Трейдеры могут получать по FAST таблицы финансовых инструментов (цены, объёмы торгов и т.п.), котировки, все сделки, индексы, а также информацию обо всех активных обезличенных заявках. Согласно информации на сайте Биржи, средняя задержка публикации обновлений составляет менее 300 микросекунд (для фондового и валютного рынков).
Для передачи финансовых данных используются UDP-каналы, а по TCP передаются наборы недоставленных данных. Данные структурированы на группу потоков (каналов или «фидов»), которые содержат в себе информацию о группе финансовых инструментов. Эти инструменты автоматически группируются торговой системой Биржи в соответствии с определенным параметрами.
UDP позволяет сократить задержки при передаче информации, а их дублирование снижает потери сообщений. Если описывать схему более подробно, то сервис FAST состоит из следующих каналов:
Изображение / moex.com (по клику откроется в полном размере)
Все сообщения, отправляемые с торговой системой «Московской биржи» кодируются в формате FAST. Особенностью формата «Московской Биржи» заключается в добавлении к сообщению преамбулы из 4 байт. Эта преамбула содержит тег под номером 34 (SeqNum), который позволяет получать номер последовательности сообщений без необходимости декодирования всего сообщения — это выливается в дополнительную экономию времени на обработку потоков данных.
Как правило, передача шаблона FAST осуществляется с помощью XML. Типичный сценарий использования протокола (подключение до начала торгового дня) можно описать следующей последовательностью действий:
Пример шаблона на XML:
<!-- Market Data - Incremental Refresh Generic -->
<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="TradingSessionID" id="336" presence="optional"/>
<string name="TradingSessionSubID" id="625" presence="optional"/>
</sequence>
</template>
ITinvest предоставляет [25] своим клиентам доступ к рынкам «Московской биржи» с помощью прямого подключения по протоколуам FIX и FAST Кроме того, для высокочастотных торговцев и алготрейдеров созданы специальные ИТ-услуги от колокации [26] серверов в дата-центре M1 до предоставления доступа к виртуальным машинам для размещения торгового робота (тарифы указаны на сайте [27]).
Для тех, кто не читал наш предыдущий материал о протоколе FIX снова прикрепляем видео с рассказом о решениях по получению прямого доступа на фондовый рынок.
Помимо протоколов FIX и FAST, поддерживаемых международным сообществом, для прямого подключения к отечественным рынкам используются и так называемые нативные протоколы, которые возникли еще до объединения бирж ММВБ и РТС в «Московскую биржу».
На рынках, относившихся к бирже РТС (FORTS – фьючерсы [28] и опционы [29], Standard), для прямого совершения операций и получения данных в режиме подключения используется протокол Plaza II [30]. Для выполнения торговых операций и получения биржевых данных на площадках, ранее относившихся к бирже ММВБ (валютный и фондовый рынки) используется двунаправленный шлюз [31] MICEXBridge (TEAP).
Об этих протоколах пойдет речь в наших следующих статьях. Кроме того, мы расскажем о протоколе Simple Binary Encoding [32], который, в определенной степени, является продолжателем дела FIX.
На сегодня все, спасибо за внимание, будем рады ответить на вопросы в комментариях.
P. S. Если вы заметили опечатку или ошибку — напишите личным сообщенрем, и мы оперативно все исправим.
Автор: IT_invest
Источник [33]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/74947
Ссылки в тексте:
[1] Image: http://habrahabr.ru/company/itinvest/blog/243657/
[2] протокол FIX: http://habrahabr.ru/company/itinvest/blog/242789/
[3] OpenFAST: http://www.openfast.org/
[4] OpenFAST.NET: http://sourceforge.net/projects/openfastdotnet/
[5] QuickFAST: http://www.quickfast.org/
[6] NYSE Archipelago: https://www.nyse.com/markets/nyse-arca
[7] CME Group (CME): http://www.cmegroup.com/
[8] International Securities Exchange (ISE): http://www.ise.com/
[9] NasdaqOMX: http://business.nasdaq.com/
[10] SIX_Swiss_Exchange: http://www.six-swiss-exchange.com/index.html
[11] Eurex: http://www.eurexchange.com/exchange-en/
[12] Xetra (trading system): http://en.wikipedia.org/wiki/Xetra_(trading_system)
[13] Bombay_Stock_Exchange: http://www.bseindia.com/
[14] BATS: http://en.wikipedia.org/wiki/BATS_Global_Markets
[15] ICAP: http://www.icap.com/
[16] OPRA: http://www.opradata.com/
[17] BVMF: http://en.wikipedia.org/wiki/Bovespa
[18] Nordic Growth Market (NGM): http://en.wikipedia.org/wiki/Nordic_Growth_Market
[19] Shanghai Stock Exchange(SSE,China): http://english.sse.com.cn/
[20] «Московская Биржа» (MICEX-RTS): http://moex.com/
[21] протоколу FAST: http://moex.com/s441
[22] Image: http://i.imgur.com/esxXW0r.png
[23] конфигурационного: https://www.pvsm.ruftp://ftp.moex.com/pub/FAST/Spectra/test_templates/internet_test/configuration.xml
[24] шаблона: https://www.pvsm.ruftp://ftp.moex.com/pub/FAST/Spectra/test_templates/internet_test/templates.xml
[25] предоставляет: http://www.itinvest.ru/services/access/
[26] колокации: http://www.itinvest.ru/services/access/razmeshenie/
[27] сайте: http://www.itinvest.ru/pricing-n-docs/tariffs/direct-access/
[28] фьючерсы: http://habrahabr.ru/company/itinvest/blog/222257/
[29] опционы: http://habrahabr.ru/company/itinvest/blog/226829/
[30] Plaza II: http://fs.moex.com/files/4929
[31] шлюз: http://moex.com/a574
[32] Simple Binary Encoding: http://real-logic.github.io/simple-binary-encoding/
[33] Источник: http://habrahabr.ru/post/243657/
Нажмите здесь для печати.