Андрей К
Андрей К личный блог
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: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. Наши опять чтото свое изобрели? Куча тегов с разделителями и = посередине?

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

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