Лучший онлайн-брокер для работы на бирже
65,93
рейтинг
10 ноября 2014 в 16:03

Разработка → Cпособы передачи финансовых данных: протокол FIX

image

Фондовый рынок является высокотехнологичной отраслью — помимо физической ИТ-инфраструктуры и технологичных торговых роботов игроки этого рынка занимаются развитием технических стандартов протоколов передачи данных. Сегодняшним материалом мы открываем серию топиков о протоколах передачи финансовой информаци. В первом выпуске представлена информация об одном из старейших протоколов — Financial Information eXchange или сокращенно FIX.

Немного истории


Создание протокола FIX было инициировано рядом финансовых организаций США в 1992 году — брокеры и инвестфонды хотели ускорить процесс осуществления торговых операций на бирже. В то время значительная часть торговых операций совершалась с помощью телефона, а протокол FIX позволил перевести взаимодействия в электронный вид.

В результате родился открытый стандарт передачи информации в электронном виде, который не контролирует ни одна из крупных организаций. Сегодня FIX стал отраслевым стандартом, который используется участниками финансового рынка разных стран для связи своих продуктов.

Как это работает


В настоящий момент протокол определен на двух уровнях — сессии (работа над доставкой данных) и приложения (описание содержимого данных). Существует два варианта синтаксиса протокола — традиционный, вида Tag=Value и в формате XML (FIXML). Рассмотрим каждый из них.

Синтаксис Tag Value


Сообщения протокола FIX обычно содержат заголовок и, собственно, тело сообщения. Каждое сообщение представляет собой поток полей =, отделенных друг от друга специальными символами — в спецификации FIX для разделения данных использован ASCII-символ SOH (#001, 0x01).

Теги содержат данные в формате TagNum, а поле тега не может быть пустым (кроме того, значение должно быть положительным и не начинаться с нулей). Сообщение с пустым полем Tag будет отклонено.

Тело сообщения обычно состоит из заголовка, тела сообщения и завершающего элемента (трейлера). Первым полем сообщения всегда является обозначение начала строки (BeginString, тег #8), затем указывается длина тела сообщения (BodyLength тег #9) и тип сообщения (MsgType, тег #35). Последним символом трейлера всегда является контрольная сумма (тег #10).

Часто сообщения содержат, как зашифрованную часть, так и символы, переданные в текстовом виде — данная схема обычно используется для валидации и верификации данных. Например, передача зашифрованного значения SenderCompID, указывающего на отправителя, является устаревшим способом валидации.

Для обеспечения большей гибкости FIX протокол содержит так называемые пользовательские поля — User Defined Fields. Они используются при передачи данных между сотрудничающими финансовыми организациями. Номера тегов с 5000 до 9999 были зарезервированы под пользовательские поля — зарезервировать их можно было на официальном сайте стандарта. В дальнейшем эти номера были израсходованы, поэтому был выделен новый интервал — с 20000 до 39999.

Сообщения в формате Tag Value выглядят следующим образом (символ ^ — это разделитель SOH):

8=FIX.4.2^9=251^35=D^49=AFUNDMGR^56=ABROKER^34=2^52=20030615-01:14:49^11=12345^ 1=111111^63=0^64=20030621^21=3^110=1000^111=50000^ 55=IBM^48=459200101^22=1^54=1^60=2003061501:14:49 38=5000^40=1^44=15.75^15=USD^59=0^10=127

Синтаксис FIXML


Работы по созданию синтаксиса в формате XML начались в 1998 году, а первая версия FIXML появилась в январе 1999 года.

Новая заявка на совершение операции в формате FIXML описывается следующим образом:

<Order
ClOrdID="123456"
Side="2"
TransactTm="2001-09-11T09:30:47-05:00"
OrdTyp="2"
Px="93.25"
Acct="26522154">

Здесь ClOrdID — id-ордера, side=”2” означает заявку на продажу, далее указывается время транзакции, тип заявки (2 соответствует Limit-ордеру) и его цена pX. Поле Acct означет номер счета пользователя.

Далее в сообщении указывается информация о ценной бумаге и число ценных бумаг, которые нужно купить или продать. В итоге простое сообщение будет выглядеть примерно так:

<FIXML>
<Order
ClOrdID="123456"
Side="2"
TransactTm="2001-09-11T09:30:47-05:00"
OrdTyp="2"
Px="93.25"
Acct="26522154">
<Instrmt Sym="IBM"
ID="459200101"
IDSrc="1"/>
<OrdQty Qty="1000"/>
</Order>
</FIXML>

В начале пути XML-версии FIX использовался только механизм определения синтаксиса DTD. В дальнейшем организация W3C разработала новый механизм — XML Schema, что заставило разработчиков FIX адаптировать стандарт для использования этого варианта синтаксиса.

Этот шаг позволил добиться улучшения XML-версии протокола FIX, в частности, пользователи получили возможность добавления в сообщения атрибутов и контекстных сокращений.

Базовая организация схемы XML предполагает наличие типов данных, используемых в полях, которые содержатся в отдельном файле. Поля FIX определяются в специальном shared-файле, а компоненты и элементы синтаксиса FIXML в специальных файлах компонентов. Сообщения FIXML определяются с помощью специальных файлов, указывающих категорию.

image

Пример сообщения об отправке заявки на FIXML (Schema):

<FIXML v="4.4" r="20030618" s="20040109">
   <Order ClOrdID="123456" Side="2" TransactTm="2001-09-11T09:30:47-05:00"
          OrdTyp="2" Px="93.25" Acct="26522154">
      <Instrmt Sym="IBM" ID="459200101" IDSrc="1"/>
      <OrdQty Qty="1000"/>
   </Order>
</FIXML>

Сообщения FIX


Каждое сообщение, отправленное в формате протокола FIX, состоит из обязательных, необязательных и условно обязательных (в зависимости от значения других частей сообщения) полей.

Сообщения делятся на три категории:
  • Пре-торговые сообщения;
  • Торговые сообщения (заявки и передача информации о сделках);
  • Пост-торговые сообщения.

FIX на российских биржах


C помощью протокола FIX любой желающий может напрямую подключиться к «Московской бирже». Кроме того, биржа работает над унификацией доступа по FIX для всех доступных рынков (акции, срочный, валютный).

ITinvest также предоставляет своим клиентам доступ к рынкам «Московской биржи» с помощью прямого подключения по протоколу FIX. Кроме того, для высокочастотных торговцев и алготрейдеров созданы специальные ИТ-услуги от колокации серверов в дата-центре M1 до предоставления доступа к виртуальным машинам для размещения торгового робота.



Другие протоколы


Для получения рыночной информации (Market Data) используется протокол FAST (Fix Adapted for STreaming) — стандарт, разработанный создателями протокола FIX, который позволяет добиться значительных возможностей компрессии данных для передачи больших объемов рыночной информации с минимальными временными задержками. Помимо Московской биржи, используется на NYSE, Nasdaq-OMX и многих других мировых площадках.

Также для прямого подключения используются так называемые нативные протоколы, которые возникли еще до объединения бирж ММВБ и РТС в «Московскую биржу».

Так на рынках относившихся к бирже РТС (FORTS – фьючерсы и опционы, Standard), для прямого совершения операций и получения данных в режиме подключения используется протокол Plaza II. Для выполнения торговых операций и получения биржевых данных на площадках, ранее относившихся к бирже ММВБ (валютный и фондовый рынки) используется двунаправленный шлюз MICEXBridge (TEAP).

Об этих протоколах пойдет речь в наших следующих статьях. На сегодня все, спасибо за внимание, будем рады ответить на вопросы в комментариях.

P.S. Если вы заметили опечатку или ошибку — напишите личным сообщением, и мы оперативно все исправим.
Автор: @IT_invest
ITinvest
рейтинг 65,93
Лучший онлайн-брокер для работы на бирже

Комментарии (30)

  • +2
    Новый приказ на совершение операции в формате

    Наверное, лучше использовать слово «заявка» или даже «ордер». Слово «приказ» как-то совсем режет глаза :).
    • +1
      На самом деле все эти варианты используются трейдерами, как-то уже устоялось. Но раз режет, то поправим, не вопрос :).
      • 0
        Ни разу не встречал использование слова «приказ» за свой 10-летний стаж разработки торговых платформ. Правда, мой опыт в основном связан с зарубежными заказчиками, которые по-русски и не говорят. Внутри компании всегда использовали «ордер» или «заявка». Возможно это специфика российского трейдинга — любят отдавать приказы, а не просить заявками :).
  • +2
    Спасибо за статью! Полезно
    • +1
      Пожалуйста! Спасибо, что читаете)
  • 0
    Спасибо за хорошую статью!
    Мне кажется, что если Вы рассмотрите FIX/FAST по UDP Multicast'у (например для MICEX/ASTS), то получится очень познавательно и интересно. Особенно касательно парсинга и составления пакетов. Спасибо
    • +2
      Отличная идея! Материал про FIX/FAST уже в плане, так что скоро должен быть, должно получиться интересно
  • +1
    Хочется добавить про продолжателя FIX — Simple Binary Encoding от небезивестного Мартина Томпсона.
    SBE даже в сравнении с Google Protoсol Buffers на два порядка быстрее сериализует/десериализует данные, про текстовый FIX я уже молчу!
    • +1
      Кстати, это вариант. Давайте мы сделаем отдельный материал на эту тему
      • 0
        Если будете писать, то не затруднит ли вас рассказать почему SBE быстрее ASN.1, внятного объяснения не увидел на сайте, и само решение выглядит с первого взгляда как подмножество asn.1…
    • 0
      Спасибо за интересную информацию по протоколу SBE. Сам сейчас активно занимаюсь FIX-м, плюс — Google Protocol Buffer. Так что SBE будет очень даже кстати изучить.
  • 0
    Протокол FIX это кошмар. Во-первых, сам протокол настолько overengineered, что непонятно, что может быть дальше. Особенно 5.x. Но это еще можно пережить: в конце концов, протокол документирован очень хорошо. Во-вторых, в силу сложности протокола его реализации отличаются в своем поведении кардинально, вплоть до полной несовместимости. Я сделал две реализации на JS для node.js и интегрировал с парочкой платформ и понял, что FIX в качестве универсального протокола — не вариант. Отличия одной реализации от другой так велики, что дешевле разрабатывать коннекторы к проприетарным API брокеров, чем тюнить FIX.
    • 0
      Интересно, а есть в открытом виде эти модули?
      • 0
        я думал опенсорснуть их, но спектр применения настолько узок, что не вижу смысла.
        • 0
          отчего же? у квантлиба еще уже но шикарная и уникальная библиотека. Именно в этом сила опенсорса — а вы размышляете сильно по коммерчески :)
      • 0
        QuickFiX
        на Java и на .NET
        • 0
          это я знаю и мы их используем. спрашивал про модуль для node.js
          • 0
            а смысл?
            • 0
              чтобы обрабатывать его на этой платформе. Я на ИТ-ресурс попал или где я?
              • 0
                вы попали на IT-ресурс где только что опубликовали коммерческую рекламную статью, т.е «джинсу»
    • 0
      >>>> Я сделал две реализации на JS для node.js

      какой ужас

      >>>> и понял, что FIX в качестве универсального протокола

      а что такое «универсальный протокол»?
  • 0
    Спасибо за ваши статьи.
    Было бы очень хорошо, если бы вы добавили к описанию стандарта, что же именно можно получить с его помощью, хотя бы у той же московской биржи. Возможно ли получение таких данных как содержимое стакана (список открытых, не исполненных ордеров купли/продажи) или даже прямого потока данных о сделках (собственно сами ордера клиентов биржи и их пересечения — исполнения (а по их логу можно будет уже самостоятельно восстановить стакан)? Открытая ли это информация, даже если речь идет не о полном realtime? Возможно ли приобретение доступа к этим данным (практикуют ли это биржи)?

    Так же было бы интересно узнать, что такое датафид (не то ли это, о чем я написал)? Существуют ли стандартны на обмен такими данными? Что по поводу исторических данных, какие на этот счет есть стандарты? Это реально, получить полный лог событий на бирже (чтобы можно было восстановить состояние стакана на любой момент времени и точный лог транзакций)? Публикует ли биржи, работающие по типу форекс-брокера, информацию, когда мелкие сделки клиентов агрегируются и отправляются для исполнения на подчиненную биржу, а когда исполняется внутри?

    p.s. почему время в ваших примерах используется без миллисекунд О_о?
    • 0
      Мы в дальнейшем сделаем материал о доступных вариантах с Московской биржей. Помимо этого у самой биржи есть блог на Хабре (http://habrahabr.ru/company/moex), думается на какие-то вопросы лучше всего ответят ее сотрудники.
    • 0
      Стакан нельзя восстановить по тиковым данным.
      • 0
        Полный лог событий, если биржа публикует все (к сожалению я видел реализацию, когда в поток выдавали только ближайшие к рынку по ценам ордера, из-за чего стакан получается естественно дырявым), позволяет. Если в этом потоке будут данные вида 'был получен ордер на продажу по цене X объем Y' а не только 'был исполнен по цене X объем Y'.
        • 0
          все можно получить. но за бабки. очень очень очень очень очень очень очень очень большие бабки. у вас столько нету
  • 0
    >>>>> Создание протокола FIX было инициировано рядом финансовых организаций США в 1992 году — брокеры и инвестфонды хотели ускорить процесс осуществления торговых операций на бирже

    Создание протокола FIX было инициировано Fidelity Investments и Salomon Brothers. для обмена финансовыми сообщениями исключительно между друг другом. Ни о каких других брокерах и инвестфондах тогда и речи не было. Операции на бирже по-прежнему как осуществлялись по телефону вручную так и продолжали осуществляться.
  • 0
    >>>> C помощью протокола FIX любой желающий может напрямую подключиться к «Московской бирже».

    Нет че правда? Любой желающий? И брокерской лицензии не спросят? И членства на бирже не требуется? И клирингового счета не нужно?
  • 0
    Было бы интересно прочитать сравнение FIX и ISO 20022.
  • 0
    Добрый день. Было бы отлично, если бы вы привели какой-нибудь пример программного кода (на C#, или хотя бы на C++), использующий протокол FIX.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка