НОВОСТИ [Из песочницы] Учимся торговать на бирже. Часть первая: настройка тестового окружения

Bonnie
Оффлайн
Регистрация
12.04.17
Сообщения
19.095
Реакции
107
Репутация
0
dlvrtjqqk_am65076owdlhopoc4.jpeg



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


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



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

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


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

Кратко о протоколе 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 соответственно. Чтобы запустить тестовый сервер, нужно склонировать репозиторий и открыть модуль quickfixj-examples: в пакете quickfix.examples.executor находятся необходимые для запуска файлы.


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


fnpjxh5yrk7cnqaytvglumxzrek.png



Настройки сервера находятся в файле 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 и настроим параметры подключения:


WmfDUUmC21wYWOW8FPWMYiUiYmz51QSQiVtTPm-KKkE_Bh5hCFVHP6caMu_Z1Bzt1qoLT7pwK5Z2JJQ_YqkvWf8_b0YOA29oTzaUJo9_fpUAZj6DKPIWflDj2lUJ6jsL9hql16Ok



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

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


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


HZc1e89STZMOzLHqRjzJBzg9BRaVOdEj72prRyYr4KdJNw8Gylp404LIhOu6IH_Ue7hvegLXFKZ0MZC3yevJKcceGR2C8ToRA1WYyti-3qPP3TP-lipVcpI8ZJbpyxRKelNYPvmb


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

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


_9UrprZ-LDh9-3C3hSnoz32zNrUq_22yBW5GxidPnOeyEibqTNZ4nOFdbFwCS_Y8GCEeEeoxwg2mdW33e9O-9Tr2GGGAZplyRsPB8eJtJtLnXE9wF_pivYz_b-N5qND8VtXaGh3J


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

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



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


0sulpq6z9pefdxzzbyum-z0ic6e.png



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

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

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


WBWzIIDDTu-THL0V-duS6zhjeJbnx2_bhFV9S9UAK4JXtGJ1tsxY8go_1OhYIbRp52yb5-6hklc60XnnP2D506EQJh52FxsVWIJ0iMoTVDwXqTv7SFRPojALpivjnRD1Hl1aa7ys



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


O7KQHpu7b6etsKNbosZGKGPNRZijRrXc2m7jwkzC0Ax4q--y2O6iB7qqQvHfJ_jqZ6WP8OJrS7lDy-DkAER0M8KdtNOzRg5Q9QP12EkCYMQfBIjV1528YfoJ3FfB1SetUURtlhr_


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


DP23Ew4t3RFYR_fojE_Z6VOhq1aP1qqSa46x3sfSdlJ2FFw7CZgO0KzRns2UiqrLHSeUxCNnoJLIHq1mT4PgUDNbn5SNmZ996Bt3NbgFOi22JBzN0KepuKlCXkF4DmP2nYnnAy88


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


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