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


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


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) или воспользоваться торговым терминалом. Но для того, чтобы разобраться в спецификации сообщений и понять, как их правильно составлять, такого рабочего окружения вполне достаточно. В следующей части расскажу, какими финансовыми инструментами торгуют на бирже и как правильно указать параметры для этих инструментов при размещении торговой заявки. Для тех, кому интересны технические подробности и написание собственного клиента, – продолжение.

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 21

    –2
    Спасибо за интересную статью! Жду продолжение
      0
      Вроде бы интересно, но не хватает общей вводной. Что за биржа? Московская? Спб? NASDAQ? Какая-нибудь криптобиржа? Или это чтобы свою биржу поднять?
        0
        Здесь используется собственная простая биржа на основе примера из репозитория QuikFIX/J, поскольку каждая реальная биржа имеет свои особенности (дополнительные теги, ограничения и т.д). Я же хотела рассмотреть базовый пример, на основе которого уже можно будет работать с конкретными биржами.
          +1
          Статья вообще-то о том как передаются FIX сообщения без относительно к какой-то конкретной бирже. Заголовок вводит в заблуждение
            0
            Это ведь не завершённая статья, это первая часть из цикла. Моя основная цель — рассказать об устройстве биржи и о базовых понятиях (сделках, фьючерсах и т.д) в рамках работы с FIX. Я в своё время работала с MOEX, сначала использовала MiniFIX, чтобы просто подключиться посмотреть, как работает, потом писала полноценный микросервис для работы с этой биржей (поэтому я в дальнейшем и буду освещать два этих способа) И, честно говоря, единственное отличие — это кастомные теги и форматы некоторых полей.

            Мне не хватало какой-то комплексной информации по теоретическим вопросам и по совмещению этой теории конкретно с FIX-ом, поэтому захотелось структурировать все это в один цикл статей и помочь тем, кто не знает, с чего начать.
              0
              Тем не менее, из контекста это плохо выводится. Добавьте дисклеймер, что ли.
                +1
                Спасибо за поправки. Добавила в начале статьи пояснение, чтобы не путать людей
                0
                Здравствуйте. Очень интересно. Хочется почитать про клиента на java и про подключение к Российским биржам.
            +2
            Биржа это большой обман,
            как только вы осуществили сделку (купили или продали),
            и если таких как вы большинство покупателей (или продавцов) — рынок (который делает маркетмейкер) идет против большинства, чтобы оставить это большинство без денег.
              +1
              Следовательно, надо покупать то, что не покупает никто, и тогда сказочно разбогатеешь?
              +3
              > Биржа это большой обман,
              вас сколько раз на бирже обманули?
                0
                А что если его ник — это счетчик обманов, и каждый раз, когда биржа его обманывает…

                А так конечно это большой обман, только для тех, кто думает что там можно легко заработать и разбогатеть.
                Биржа — это в первую очередь набор инструментов. Молоток тоже «обманывает», когда попадаете по пальцу.
                  0
                  Если вас обманывают, то смысла нет считать сколько раз
                  Вас обманывают постоянно.
                    0
                    вас обманывают. прямо сейчас.
                  0
                  Мне кажется, это зависит от торгуемого актива и от инвестиционных ожиданий. Если это краткосрочные спекуляции на форексе, то скорее всего это игра с нулевой суммой либо вообще обман (если брокер не выводит сделки на рынок, а имитирует рынок). Если это акции, то в долгосрочной перспективе этот рынок доходен, эта доходность определяется тем, что акции — это бизнес, а бизнес имеет добавленную стоимость, потому что люди ходят на работу, вкладывают силы. Но если какие-то игроки пытаются переиграть среднюю доходность рынка, то они играют в игру с нулевой суммой, перераспределяя деньги между собой и кормя брокеров комиссиями.
                  0
                  Компания выходит на биржу — продаёт акции, получает деньги
                  Дальнейшая судьба стоимости акций по идее её уже не должна интересовать
                  Так как она просто должна выплачивать дивиденды владельцам акций
                  Но на самом деле компания при выходе на биржу начинает размещать свои акции и пытается приложить усилия чтобы поднялся курс акций
                  После того как большинство акций продано, смысла в дальнейшем поднятии курса уже нет. Начинают выходить негативные новости, курс акций снижается. Компания выкупает свои акции — получает профит.
                    0
                    > Компания выкупает свои акции — получает профит.
                    но вы тоже можете выкупить акции этой компании и тоже получить профит?
                      0
                      есть два способа решить эту проблему:

                      1. менеджеры несут фидуциарную ответственность перед собственниками компании (то есть всеми держателями её акций) и их могут заменить на следующем собрании акционеров, а в худшем случае ещё и засудить;

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

                      поэтому управленцам компании обычно самим же выгодно не снижать курс.
                      0
                      наивность
                      биржа для того и создана чтобы оставить лохов/инвесторов без денег
                        0
                        ничто не мешает вам создать свою собственную биржу, где вы будете раздавать деньги лохам и инвесторам

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

                      Самое читаемое