Pull to refresh

Торговля с помощью протокола FIX. Часть первая: настройка тестового окружения

Reading time 6 min
Views 12K


В этом цикле статей создадим окружение для работы с тестовой биржей и обмена сообщениями с ней, разберёмся с основными биржевыми терминами и закрепим знания на практике.


UPD: Основная цель этого цикла статей — комплексно рассмотреть устройство биржи и базовые понятия (сделки, фьючерсы и т.д) в рамках работы с протоколом FIX. Здесь не будет привязки к какой-то конкретной бирже, будем использовать готовый пример сервера (симулятор биржи) и в дальнейшем реализуем клиента, которого можно будет доработать для взаимодействия с интересной вам реальной биржей.


Для настройки всего необходимого понадобятся лишь базовые знания в программировании и умение пользоваться Git-ом.


Для тестирования сообщений нам понадобится:


  • реализация протокола FIX: например, QuickFix — открытая реализация на С++ (также есть QuickFix на Java (QuickFix/J), C# (QuickFix/N) и Go (QuickFix/Go));
  • тестовый сервер, который будет моделировать работу биржи (я использовала готовый Open Source сервер на Java – QuiсkFIX/J);
  • клиент для отправки сообщений на сервер (его можно реализовать самостоятельно, но это тема для отдельной статьи, для начала достаточно установить приложение MiniFIX).

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


Кратко о протоколе FIX

Протокол FIX является стандартом обмена финансовыми сообщениями, его поддерживает большинство крупных бирж. У него есть несколько версий, которые появлялись по мере внедрения улучшений и поддержки новых классов торговых инструментов. Наиболее популярной версией является FIX 4.2. С помощью FIX-протокола можно размещать заявки на покупку/продажу финансовых инструментов, получать котировки валют или ценных бумаг и многое другое.


Существует два формата FIX-сообщений: стандартный (вида tag=value) и XML.


FIX-сообщения представляют собой последовательность полей, указанных в спецификации, и их значений, разделенных с помощью ASCII-символа SOH (0x01). Например, вот так выглядит сообщение, соответствующее заявке типа Market на покупку 10000 акций компании Microsoft (вместо символа SOH используется пробел для наглядности):


8=FIX.4.2 9=103 35=D 34=3 49=BANZAI 52=20121105-23:24:42 56=EXEC 11=1352157882577 21=1 38=10000 40=1 54=1 55=MSFT 59=0 10=062.


Обязательные части любого FIX-сообщения: заголовок (Message Header), тело (Message Body) и завершающий элемент (Message Trailer).


Заголовок сообщения


Первое поле заголовка – это всегда тег <8>BeginString, в котором указывается версия FIX-протокола (8=FIX.4.2). Затем длина и тип сообщения в тегах <9> BodyLength и <35> MsgType. Например, сообщение для размещения торговой заявки имеет тип D (35=D), а сообщение на получение рыночных данных об инструменте — тип V (35=V).


Следующие поля не обязательно должны идти в строгом порядке, но обязательно должны присутствовать в сообщении:


  • <49> SenderCompID – идентификатор отправителя сообщения (например, название компании или просто имя пользователя);
  • <56> TargetCompID – идентификатор получателя;
  • <56> SendingTime – UTC-время отправки сообщения (указывается в формате YYYYMMDD-HH:MM:SS или YYYYMMDD-HH:MM:SS.sss);
  • <34> MsgSeqNum – номер сообщения (начиная с первого сообщения этот номер увеличивается на 1 в каждом последующем сообщении).

Если в последовательно отправленных сообщениях MsgSeqNum будет отличаться не на 1, то сервер вернет ошибку и не обработает сообщение.

Тело и завершающий элемент сообщения


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


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

Последний тег сообщения – контрольная сумма (<10> CheckSum), которая рассчитывается при отправке сообщения на стороне клиента. Затем на сервере она рассчитывается еще раз и сверяется с полученной. Если контрольные суммы не совпадают, сервер возвращает сообщение об ошибке и не обрабатывает сообщение.


Подключение к серверу


Клиент и сервер для работы с FIX называются initiator и executor/acceptor соответственно. Чтобы запустить тестовый сервер, нужно склонировать репозиторий QuiсkFIX/J и открыть модуль quickfixj-examples: в пакете quickfix.examples.executor находятся необходимые для запуска файлы.


Структура проекта и файл запуска:



Настройки сервера находятся в файле resources/quickfix/examples/executor/executor.cfg, интересующие нас параметры:


[default]
ConnectionType=acceptor // показывает, что приложение является сервером
SenderCompID=EXEC // идентификатор сервера
TargetCompID=BANZAI // идентификатор клиента

[session]
BeginString=FIX.4.2 // версия протокола - FIX4.2
SocketAcceptPort=9878 // порт для подключения

Заменим в этом файле идентификатор клиента на MINIFIX_CLIENT (можно указать любое другое значение).


Запустим приложение MiniFIX и попробуем подключиться к серверу. Для этого откроем вкладку Session и настроим параметры подключения:



Соответственно заполняем ID отправителя – MINIFIX_CLIENT и получателя – EXEC. Также выбираем версию протокола (FIX 4.2) и все доступные опции.


Более подробно об опциях
  • автоматический ответ на тестовые запросы: периодически сервер отправляет тестовые запросы клиенту, чтобы убедиться, что тот все еще подключен; если на тестовое сообщение ответа не приходит, значит, можно отключать соединение с клиентом;
  • автоматическая авторизация: при подключении к серверу нужно отправить сообщение типа Logon (MsgType = A) для успешной аутентификации; при выборе такой опции это сообщение генерируется и отправляется автоматически без необходимости задавать сообщение вручную.

После заполнения настроек нажимаем кнопку Connect и вводим хост и порт сервера. В файле настроек сервера для версии 4.2 был указан порт 9878, следовательно, подключаться будем к localhost:9878:



Если сервер запущен не на вашей локальной машине, то вместо localhost нужно указать IP-адрес сервера.

После успешного подключения приложение должно отправить Logon-сообщение на сервер и получить ответное Logon-сообщение:



Если убрать опцию “скрыть тестовые запросы”, то в приложении будут отображаться тестовые запросы, которыми обмениваются сервер и клиент:

Обмен сообщениями


В приложении MiniFIX во вкладке Transactions перечислены типы сообщений, которые можно отправить на сервер (если хотите добавить свой тип сообщения, нажмите на кнопку New):



(вверху — типы сообщений, внизу — теги выбранного сообщения).


Наш тестовый сервер принимает только сообщения на размещение торговых заявок – New Order Single (35=D).

Полей, указанных в MiniFIX по умолчанию, уже достаточно, чтобы отправить заявку, но мы можем добавлять и изменять поля сообщения с помощью кнопок New, Edit, Delete. Например, тег 38=1000 отвечает за объем сделки. Изменим его на 200:



В правом верхнем углу нажимаем на кнопку Send, отправляем наше сообщение на сервер и получаем сообщения о том, что наша заявка принята и исполнена:



Возможные причины ошибок при обмене сообщениями
  • неправильно указанный адрес или порт сервера – проверьте в настройках сервера параметр SocketConnectPort;
  • неправильно указанный идентификатор клиента или сервера – убедитесь, что значения SenderCompID и TargetCompID соответствуют значениям из файла настроек сервера;
  • неверная контрольная сумма – в случае неправильно рассчитанной суммы сервер отправит сообщение об ошибке с ожидаемым и фактическим значением контрольной суммы;
  • нарушение последовательности сообщений – в случае такой ошибки сервер отправит сообщение с ожидаемым значением последовательности; в случае с нарушением последовательности можно нажать кнопку Reset Sequence в приложении MiniFIX, чтобы сбросить номера последовательности;
  • ошибка в заполнении сообщения (например, пропущено обязательное поле или неправильно заполнено его значение); в таком случае сервер отправит в ответ сообщение типа <3> Reject с текстом ошибки в теге 58:


  • для MiniFIX: не выбрана опция автоматический ответ на тестовые запросы” – если эта опция не выбрана, то клиент должен “вручную” отправлять ответы на тестовые запросы;
  • для MiniFIX: не выбрана опция автоматическое Logon-сообщение – в таком случае, чтобы начать обмен сообщениями с сервером, необходимо сначала вручную отправить ему сообщение типа Logon.

Теперь вы можете тестировать отправку различных типов сообщений, используя MiniFIX. Конечно, для работы напрямую с реальной биржей лучше написать собственную реализацию клиента (например, на Java или Go) или воспользоваться торговым терминалом. Но для того, чтобы разобраться в спецификации сообщений и понять, как их правильно составлять, такого рабочего окружения вполне достаточно. В следующей части расскажу, какими финансовыми инструментами торгуют на бирже и как правильно указать параметры для этих инструментов при размещении торговой заявки. Для тех, кому интересны технические подробности и написание собственного клиента, – продолжение.

Tags:
Hubs:
+6
Comments 21
Comments Comments 21

Articles