- Регистрация
- 12.04.17
- Сообщения
- 19.095
- Реакции
- 107
- Репутация
- 0
В этом цикле статей создадим окружение для работы с тестовой биржей и обмена сообщениями с ней, разберёмся с основными биржевыми терминами и закрепим знания на практике.
Для настройки всего необходимого понадобятся лишь базовые знания в программировании и умение пользоваться Git-ом.
Для тестирования сообщений нам понадобится:
- реализация протокола FIX: например, QuickFix — открытая реализация на С++ (также есть QuickFix на Java (QuickFix/J), C# (QuickFix/N) и Go (QuickFix/Go));
- тестовый сервер, который будет моделировать работу биржи (я использовала готовый Open Source сервер на Java –
You must be registered for see links);
- клиент для отправки сообщений на сервер (его можно реализовать самостоятельно, но это тема для отдельной статьи, для начала достаточно установить
You must be registered for see links).
Если вы уже знакомы с протоколом обмена сообщениями FIX, можете сразу переходить к настройке сервера и клиента. Далее будет использоваться формат сообщений с помощью тегов и значений и
You must be registered for see links
.Кратко о протоколе 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).
Заголовок сообщения
Первое поле заголовка – это всегда тег BeginString, в котором указывается версия FIX-протокола (8=FIX.4.2). Затем длина и тип сообщения в тегах BodyLength и MsgType. Например, сообщение для размещения торговой заявки имеет тип D (35=D), а сообщение на получение рыночных данных об инструменте — тип V (35=V).
Следующие поля не обязательно должны идти в строгом порядке, но обязательно должны присутствовать в сообщении:
- SenderCompID – идентификатор отправителя сообщения (например, название компании или просто имя пользователя);
- TargetCompID – идентификатор получателя;
- SendingTime – UTC-время отправки сообщения (указывается в формате YYYYMMDD-HH:MM:SS или YYYYMMDD-HH:MM:SS.sss);
- MsgSeqNum – номер сообщения (начиная с первого сообщения этот номер увеличивается на 1 в каждом последующем сообщении).
Если в последовательно отправленных сообщениях MsgSeqNum будет отличаться не на 1, то сервер вернет ошибку и не обработает сообщение.
Тело и завершающий элемент сообщения
В теле сообщения задаются поля, связанные с конкретным типом сообщения: вид инструмента, комиссия для торговой заявки, идентификатор брокера и т.д. Порядок полей не важен, а обязательность полей зависит от спецификации биржи.
При работе с конкретной биржей важно изучить ее спецификацию FIX-протокола. В ней могут быть указаны дополнительные виды сообщений, изменена обязательность или добавлены новые теги.
Последний тег сообщения – контрольная сумма ( CheckSum), которая рассчитывается при отправке сообщения на стороне клиента. Затем на сервере она рассчитывается еще раз и сверяется с полученной. Если контрольные суммы не совпадают, сервер возвращает сообщение об ошибке и не обрабатывает сообщение.
Подключение к серверу
Клиент и сервер для работы с FIX называются initiator и executor/acceptor соответственно. Чтобы запустить тестовый сервер, нужно склонировать репозиторий
You must be registered for see links
и открыть модуль 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, чтобы сбросить номера последовательности;
- ошибка в заполнении сообщения (например, пропущено обязательное поле или неправильно заполнено его значение); в таком случае сервер отправит в ответ сообщение типа Reject с текстом ошибки в теге 58:
- для MiniFIX: не выбрана опция автоматический ответ на тестовые запросы” – если эта опция не выбрана, то клиент должен “вручную” отправлять ответы на тестовые запросы;
- для MiniFIX: не выбрана опция автоматическое Logon-сообщение – в таком случае, чтобы начать обмен сообщениями с сервером, необходимо сначала вручную отправить ему сообщение типа Logon.
Теперь вы можете тестировать отправку различных типов сообщений, используя MiniFIX. Конечно, для работы напрямую с реальной биржей лучше написать собственную реализацию клиента (например, на Java или Go) или воспользоваться торговым терминалом. Но для того, чтобы разобраться в спецификации сообщений и понять, как их правильно составлять, такого рабочего окружения вполне достаточно. В следующей части расскажу, какими финансовыми инструментами торгуют на бирже и как правильно указать параметры для этих инструментов при размещении торговой заявки. Для тех, кому интересны технические подробности и написание собственного клиента, планирую написать отдельную статью.



