Андрей К
Андрей К личный блог
13 февраля 2016, 21:00

Изучаю FIX протокол с нуля. Рисуем и программируем дальше.

Начало — Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#

Вступление

     В прошлой статье я положил начало циклу разработки класса для работы с FIX протоколом. Обсудили его особенности передачи данных. Теперь время немного по программировать. Если профессионально подходить к делу, то нахрапом такие задачи решать нельзя. Надо посидеть с кружкой чая, порисовать схемы программного продукта. Что как будет взаимодействовать. Накидать блок схемы после полученного первого опыта. Наверное многие скажут, что это какой то дедовский способ. Но и программист я из старой плеяды, до сих пор любящий семерку Delphi.

Рисуем

     Напомню, как работают сетевые соединения. Через сокеты связываемся с сервером и начинаем обмениваться сообщениями.
Изучаю FIX протокол с нуля. Рисуем и программируем дальше.     Из опыта первой статьи вы наверное вспомните, что я предложил под каждый блок сообщения делать класс и на основе этих классов строить сообщение. Переспав с этой идеей, сегодня за кружкой чая, я решил остановиться на этой идее. А именно:
  1. Класс, отвечающий за заголовок сообщения. class HeaderMessage.
  2. Ряд классов, отвечающих за само сообщение:
    • класс LogonMessage, отвечающий за сообщение Logon
    • класс LogoutMessage, отвечающий за сообщение
    • … и тд
  3. Класс, отвечающий за концовку сообщения. class TrailerMessage

Изучаю FIX протокол с нуля. Рисуем и программируем дальше.     Далее. С сокетами я работаю не первый раз. Знаю примерные подводные камни. Например получение в короткий промежуток времени не одного сообщения, а целого ряда. То есть вы запрашиваете получение данных в сокете, а там вам выдают целый набор сообщений. Все в одну кучу. Для этого я решил делать разбор полученной группы и сохранять в отдельный список все сообщения.
Изучаю FIX протокол с нуля. Рисуем и программируем дальше.     Чтобы пользователю было удобно обрабатывать полученные сообщения, я решил для каждого его типа сделать обработчик события. То есть при получении сообщения от сервера, вызывался бы обработчик. Так программисту, использующий класс, будет удобно обрабатывать каждый полученный тип сообщения. Для удобства, я пока решил в этот обработчик, передавать заголовок сообщения. Тут как раз пригодится мною разработанный класс, отвечающий за заголовок.
Изучаю FIX протокол с нуля. Рисуем и программируем дальше.     Также мне пригодятся некоторые вспомогательные методы. Я их скрою от программиста (private). Они буду чисто для внутреннего использования:
  • Разбитие сообщений на отдельные поля. GetFieldsFromMessage. C# хорошо и быстро решает такие задачи.
    Изучаю FIX протокол с нуля. Рисуем и программируем дальше.Изучаю FIX протокол с нуля. Рисуем и программируем дальше.
  • Получение из сообщения значение заданного поля (Tag). GetTagValueFromMessage. С# также быстро решает эту задачу через регулярные выражения Regex.
    Изучаю FIX протокол с нуля. Рисуем и программируем дальше.Изучаю FIX протокол с нуля. Рисуем и программируем дальше.
  • разбивка поля на 2 значения (код поля и его значение) GetValuesFromFields.
    Изучаю FIX протокол с нуля. Рисуем и программируем дальше.Изучаю FIX протокол с нуля. Рисуем и программируем дальше.

     Далее. Следующим образом я вижу отработку получения сообщений.

Изучаю FIX протокол с нуля. Рисуем и программируем дальше.

Изучаю FIX протокол с нуля. Рисуем и программируем дальше.

     На всякий случай, я сделал метод, который будет выводить на экран сообщение с заданным номером. Здесь прекрасно показывается возможности лексем LINQ для c#. Ищем в коллекции строк нужное сообщение с заданным номером. Сообщение выводится в формате <тип поля>=<значение>
Изучаю FIX протокол с нуля. Рисуем и программируем дальше.

Традиционно тестируем класс в консольном приложении. Стараюсь доступно комментировать код.
Изучаю FIX протокол с нуля. Рисуем и программируем дальше.

Результат работы кода. Обратите внимание на скорость работы протокола. Терминалы так не подключаются.
Изучаю FIX протокол с нуля. Рисуем и программируем дальше.

Продолжение Изучаю FIX протокол с нуля. Подводим итоги первой части. Первая борьба за миллисекунды.
17 Комментариев
  • sortarray sortarray
    13 февраля 2016, 21:25
    Вы в прошлой статье написали:
    Наша биржа дает тестовый контур для отработки своих алгоритмов по данному протоколу. Надо всего лишь написать запрос на доступ. Надо признать, тех служба работает отменно. Очень все быстро было организовано. 

    Что значит тестовый контур? Это дается бесплатно и неограничено по времени, или как? И там будет доступ к реальным биржевым данным в реальном времени?
      • Сергей Гаврилов
        13 февраля 2016, 23:13
        Андрей К, по определению FIX — это протокол для обмена финансовой информацией и выполнения транзакций… В принципе он может использоваться для трансляции маркет-даты… Только медленно будет…
  • Кирилл Браулов
    13 февраля 2016, 23:27
    Насколько понимаю, сейчас тема такая: получать данные через FAST, а отправлять заявки через новый бинарный протокол TWIME: 
    1. http://forum.moex.com//viewtopic.asp?t=30523
    2. http://forum.moex.com//viewtopic.asp?t=30534
  • Сергей Гаврилов
    13 февраля 2016, 23:29
    Кстати, for работает быстрее foreach..., иногда заметно быстрее..
    И еще, решарпер почему-то, вместо Contains предлагает использовать Any или All… Может тоже быстрее работает?
  • netlink
    14 февраля 2016, 00:45
    Люди во всем мире уже давно и вовсю используют JSON или Xml. Наши опять чтото свое изобрели? Куча тегов с разделителями и = посередине?
  • netlink
    14 февраля 2016, 01:09
    Кстати, спасибо за такой пост. Я почитал первую часть немного сейчас. Здорово. Побольше бы таких глубоких постов.
    Reject — Отправляется в ответ на неверное сообщение (некорректный заголовок, контрольная сумма и т.п.), пришедшее от другойстороны

    Видимо протокол старый с рождался так… на коленке.
    Вообще-то за целостностью данных следит сам TCP/IP. Иначе бы полная чушь приходила бы. А для контроля полей ещё при отправке можно использовать валиданцию по XSD схеме. Правда XML несёт некую избыточность в виде дублирования тегов. Но можно и JSON юзать.
    А как там соединение устанавливается? Просто сокет по tcpip?

    Да, попробовал сейчас telnet'ом стукнутся по этому IP и порту… к-тото там слушает… блин… без авторизации )
    Их же задедосят так бедных )

  • netlink
    14 февраля 2016, 01:15
    А что дает этот протокол? Если через 5й метатрейдер заявки посылать? Намного дольше чтоли будет? Или эти шлюзы прям на площадке биржи стоят?
  • Sopernik
    14 февраля 2016, 08:41
    ничего не понял но выглядит сильно!
  • Fillio
    14 февраля 2016, 09:31
    пиши исчо!
  • Дмитрий Новиков
    15 февраля 2016, 01:46
    Хорошее исследование. Вот хочу помочь. Тут ссылка на тестировщиков, может что то подскажет http://testitquickly.com/2010/11/20/23/
  • Ivor
    16 февраля 2016, 00:58
    ох. вижу регулярки. даже здесь они. 

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн