Сегодня невозможно представить биржевую торговлю без использования FIX протокола. Однако появился он относительно недавно - в 1992. Увеличение скорости и объема данных, побудили создать принципиально новое соединение с высокой пропускной способностью и надежностью подключение. На сегодня выпущена уже пятая версия протокола FIX5, которая должна придти на смену предыдущему FIX4. Однако наиболее популярным для использования все так же остается FIX4, который зарекомендовал себя, как оптимальное решение для передачи данных. Сам протокол существует в двух синтаксисах, это XML (второе название FIXML) и «ключ - значение» («Tag=Value»). Стоит сказать, что протокол разделяется на 3 уровня - транспортный, сессионный, прикладной. fix_protocol.jpg Для лучшего восприятия механизма работы протокола, рассмотрим каждый из уровней отдельно. Начнем рассмотрение с транспортного уровня протокола FIX. Данный уровень дает описание структуры сообщения передаваемого посредством FIX протокола. Дает описание как построена структура сообщений. Рассматривая ее можно сказать следующее, что это обычная строка, содержащая шифр, записанный при помощи синтаксиса FIX протокола. По сути - это шифр, содержащий сообщение для отправки на торговую площадку. FIX_connector_data.png На примере указано сообщение транспортного уровня FIX протокола, которое направлено на биржу Lmax. Данное сообщение передает информацию, что трейдер хочет войти в систему торгов, для совершения операций. На первый взгляд, данное сообщение это набор цифр и символов, однако давайте разберем, какую информацию содержит данное сообщение. На нашем примере мы видим синтаксис типа «Tag=Value». Все сообщение состоят из нескольких составляющих - полей, данные поля поделены вертикальными линиями. Каждое поле разделено на две части знаком «=». Получается, что слева от знака равно – ключ или «Tag», а справа – значение или «Value». Ключи – это всегда положительные и целые числа, которые обозначают наименование поля. Каждой биржей предоставляется своего рода документация, в соответствии с которой шифруются и дешифруются сообщения по FIX протоколу. В ней указываются имена «Tag», описывающих тип данных, и описание самих получаемых данных. Практически все поля стандартизированы, имея одинаковый смысл на всех торговых площадках. Однако стоит сказать, что при этом, не каждая биржа поддерживает их. Сообщения отправленные посредством FIX протокола, содержат обязательные и необязательные поля, а также условно-обязательные поля, присутствие которых обусловлено наличием других полей. На схеме ниже можем наглядно увидеть разделение сообщения на поля. Давайте рассмотрим пример такой записи. FIX_protocol_messenge.png Разделение полей происходит посредством SOH символа, который расшифровывается как - Start of Heading, и принадлежит способу кодирования ASCII. При этом данный символ не отображается в виде аббревиатуры, а условно указывается вертикальной чертой и с точки зрения формата UNICODE имеет значение “\\u0001”. Та же стоит отметить, что сообщение строится из трех частей. Условно они показаны на рисунке различными цветами: - Зеленый - заголовок - Розовый - тело - Сиреневый - контрольная сумма Давайте подробнее разберем, что собой представляет каждая из частей. В заголовке сообщения может содержаться различное количество полей, рассмотрим главные, которые обязательно должны быть в FIX сообщении: - 8 = FIX.4.4 – это поле указывает на версию протокола, оно всегда первое. - 9 = 123 – данное поле указывает на размер FIX сообщения, оно располагается вторым размер сообщения, всегда второе по счету - 35 = V – данное поле означает наименование операции, которую необходимо совершить, в данном случае V – запрос рыночных данных, данное поле всегда расположено третьим. - 34 = 2 – обозначает какое по счету сообщение, исчисляется за текущую сессию. - 49 = FIXtest1 – данное поле означает идентификатор пользователя-отправителя, который присваиваться биржей. - 54 = 20120924-14:05:44.952 – это текущее время направления сообщения. - 56 = LMXBDM – данное поле значение идентификатора, который присваивается получателю биржей. Рассматривая тело FIX сообщения, можно сказать что это перечень полей, которые соответствуют каждому из типов запросов. Так же используется практика применения набора полей или групп, которые содержат одинаковые теги. Давай те предположим, что нам нужно запросить информацию по списку инструментов. При этом каждый из них будет иметь одинаковый тег, и отличаться только содержанием. Мы перечисляем необходимые инструменты, используя при этом для каждого отдельное поле. Такой вид записи называется группой или набором полей. Все они будут иметь один тег или тип данных, и отличаться только содержимым. Рассмотрим контрольную сумму. Расчет производится в соответствии со специальным алгоритмом, при расчете принимаются заголовок и тело. В начале, высчитывается длина «заголовка плюс тело», затем делим длину на 256 и получаем остаток. Контрольная сумма состоит из трех символов. Если в остатке от деления мы получили 20, то вперед мы добавляем 0, и получаем 020. В итоге контрольная сумма в нашем случае будет иметь вид «10 = 020|». Теперь рассмотрим протокол уровня сессии. Данный протокол FIX сообщений регламентирует механизм установки/разрыва соединения, поддержания соединения, сообщения о пропущенных данных. Он состоит из ряда сообщений: 1. Logon (35=A) – по средством данного сообщения происходит аутентификация сервером пользователя. Оно направляется первым, и служит сигналом к началу сессии передачи данных. При успешном запуске, приходит ответное сообщение, при ошибке -сообщение о возникшей ошибки. 2. Logout (35=5) – данное сообщение говорит о разрыве связи с сервером. 3. Heartbeat (35=0) – данное сообщение оповещает о готовности контрагентов, направляется обеим сторонам, другое название сообщение «пульса». Периодичность отправки пульса задается пользователем в первом сообщении Logon. 4. Test Request (35=1) – это сообщение является тестовым и направляется в случае когда контрагент за установленный период не отправил пульс сообщение. Сеанс сессии будет закрыт, если данное сообщение останется без ответа. 5. Resend Request (35=2) – это сообщение-запрос, которое направлено на отправку повторного сообщения. Resend Request, например, может повторить дать сигнал, что бы биржа повторила пропущенную информацию. 6. Reject (35=3) – сообщение отправляется в ответ, если предыдущее является неправильно сформированным. 7. Sequence Reset (35=4) – данное сообщение может иметь две формы. - в поле GapFillFlag (тег 123) стоит значение “Y”, применяется для игнорирования административных сообщений, если едет повторение их отсылки. - во втором случае применяется для обнуления счетчика MsgSeqNum. Последним уровнем FIX сообщений – прикладной. Данный уровень имеет самое емкое описание, это связано с тем, что данный уровень содержит информацию, которая необходима работы с торговой площадкой. Давайте рассмотрим основные сообщения данного уровня: 1. Market Data Request (35=V) – сообщение отправляет сигнал о том, что пользователь подписывается на поток передаваемых данных о котировках в текущий период времени. Пользователь может отписаться от получения данных через аналогичный запрос, указывая ID предшествующего сообщения. В этом случае ему придет сообщение MarketDataSnapshotFullRefresh (35=W). 2. New Order Single (35=D) – сообщение о желании пользователя выставить ордер в систему. Пользователь имеет возможность установить собственный идентификатор, это упрощает процесс отслеживания за исполнением, частичным исполнением или отменой ордера. 3. Execution Report (35=8) – сообщение о отчете о выполнения, которое предоставляет информацию в каком статусе ордер исполнен или отменен, и по каким причинам. Данный отчет указывается как Exec Type (Tag 150). 4. OrderCancelRequest (35=F) – сообщение о запросе на отмену выставленного ордера. fix_protocol_trading.jpg Мы разобрали основные аспекты работы с сообщениями, передаваемыми по средством FIX протокола. Количество таких сообщений и вариантов запросов огромное множество, и с каждым годом возможности и инструменты работы с FIX протоколом растут. Спецификация таких сообщений регламентируется биржей, оставляя стандартизированную форму записи запросов. Напомню, что передача таких сообщений проходит непосредственно при прямом подключении к торговой площадке, посредством FIX коннекторов. Стоимость таких коннекторов и их наименование различны, подробнее о спецификации коннекторов можно ознакомится на нашем сайте.