Блог им. karat39

Изучаю 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 протокол с нуля. Подводим итоги первой части. Первая борьба за миллисекунды.
★37
17 комментариев
Вы в прошлой статье написали:
Наша биржа дает тестовый контур для отработки своих алгоритмов по данному протоколу. Надо всего лишь написать запрос на доступ. Надо признать, тех служба работает отменно. Очень все быстро было организовано. 

Что значит тестовый контур? Это дается бесплатно и неограничено по времени, или как? И там будет доступ к реальным биржевым данным в реальном времени?
avatar
sortarray sortarray, протокол FIX используется для постановки заявок на рынок. Он не получает маркет данные.  Тестовый доступ — это тестовый аккаунт, для отработки правильности работы кода. Грубо говоря, как демо счет. Общаешься с сервером, он тебе отвечает на твои запросы. Без таких функций было бы совсем тяжко. Чтобы вникнуть в суть протокола, пришлось отправить серверу сотню запросов в разных вариациях, чтобы он хоть раз ответил. Толковой литературы мало, приходится экспериментировать. Спасибо, что сделали тестовый контур.

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

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

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

avatar
netlink, да. к сожалению пока все так, как вы описали. Наша биржа развивается. И не все сразу у нее получается.

А протокол стандартный, не нами созданный. Они только переняли опыт и немного адаптировали.
avatar
А что дает этот протокол? Если через 5й метатрейдер заявки посылать? Намного дольше чтоли будет? Или эти шлюзы прям на площадке биржи стоят?
avatar
netlink, алготрейдеры лучше ответят. У меня вообще нет опыта торговли по этому протоколу. Мне терминала хватало. Только создаю сейчас оснастку для работы. Но судя по сайту биржи, пакеты мимо брокера идут.
avatar
ничего не понял но выглядит сильно!
avatar
пиши исчо!
avatar
Хорошее исследование. Вот хочу помочь. Тут ссылка на тестировщиков, может что то подскажет http://testitquickly.com/2010/11/20/23/
ох. вижу регулярки. даже здесь они. 
avatar

теги блога Андрей К

....все тэги



UPDONW
Новый дизайн