Начало —
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#
Вступление
В прошлой статье я положил начало циклу разработки класса для работы с FIX протоколом. Обсудили его особенности передачи данных. Теперь время немного по программировать. Если профессионально подходить к делу, то нахрапом такие задачи решать нельзя. Надо посидеть с кружкой чая, порисовать схемы программного продукта. Что как будет взаимодействовать. Накидать блок схемы после полученного первого опыта. Наверное многие скажут, что это какой то дедовский способ. Но и программист я из старой плеяды, до сих пор любящий семерку Delphi.
Рисуем
Напомню, как работают сетевые соединения. Через сокеты связываемся с сервером и начинаем обмениваться сообщениями.
Из опыта первой статьи вы наверное вспомните, что я предложил под каждый блок сообщения делать класс и на основе этих классов строить сообщение. Переспав с этой идеей, сегодня за кружкой чая, я решил остановиться на этой идее. А именно:
- Класс, отвечающий за заголовок сообщения. class HeaderMessage.
- Ряд классов, отвечающих за само сообщение:
- класс LogonMessage, отвечающий за сообщение Logon
- класс LogoutMessage, отвечающий за сообщение
- … и тд
- Класс, отвечающий за концовку сообщения. class TrailerMessage
Далее. С сокетами я работаю не первый раз. Знаю примерные подводные камни. Например получение в короткий промежуток времени не одного сообщения, а целого ряда. То есть вы запрашиваете получение данных в сокете, а там вам выдают целый набор сообщений. Все в одну кучу. Для этого я решил делать разбор полученной группы и сохранять в отдельный список все сообщения.
Чтобы пользователю было удобно обрабатывать полученные сообщения, я решил для каждого его типа сделать обработчик события. То есть при получении сообщения от сервера, вызывался бы обработчик. Так программисту, использующий класс, будет удобно обрабатывать каждый полученный тип сообщения. Для удобства, я пока решил в этот обработчик, передавать заголовок сообщения. Тут как раз пригодится мною разработанный класс, отвечающий за заголовок.
Также мне пригодятся некоторые вспомогательные методы. Я их скрою от программиста (private). Они буду чисто для внутреннего использования:
- Разбитие сообщений на отдельные поля. GetFieldsFromMessage. C# хорошо и быстро решает такие задачи.
- Получение из сообщения значение заданного поля (Tag). GetTagValueFromMessage. С# также быстро решает эту задачу через регулярные выражения Regex.
- разбивка поля на 2 значения (код поля и его значение) GetValuesFromFields.
Далее. Следующим образом я вижу отработку получения сообщений.
На всякий случай, я сделал метод, который будет выводить на экран сообщение с заданным номером. Здесь прекрасно показывается возможности лексем LINQ для c#. Ищем в коллекции строк нужное сообщение с заданным номером. Сообщение выводится в формате <тип поля>=<значение>
Традиционно тестируем класс в консольном приложении. Стараюсь доступно комментировать код.
Результат работы кода. Обратите внимание на скорость работы протокола. Терминалы так не подключаются.
Продолжение
Изучаю FIX протокол с нуля. Подводим итоги первой части. Первая борьба за миллисекунды.
Что значит тестовый контур? Это дается бесплатно и неограничено по времени, или как? И там будет доступ к реальным биржевым данным в реальном времени?
Чтобы получать быстро маркет данные, используется протокол Fast. Закончу с FIX, буду его изучать, пока точно не смогу ответить.
1. http://forum.moex.com//viewtopic.asp?t=30523
2. http://forum.moex.com//viewtopic.asp?t=30534
И еще, решарпер почему-то, вместо Contains предлагает использовать Any или All… Может тоже быстрее работает?
я ради интереса пробовал заслать xml. В ответ тишина. Правда может я где то ошибся.
Reject — Отправляется в ответ на неверное сообщение (некорректный заголовок, контрольная сумма и т.п.), пришедшее от другойстороны
Видимо протокол старый с рождался так… на коленке.
Вообще-то за целостностью данных следит сам TCP/IP. Иначе бы полная чушь приходила бы. А для контроля полей ещё при отправке можно использовать валиданцию по XSD схеме. Правда XML несёт некую избыточность в виде дублирования тегов. Но можно и JSON юзать.
А как там соединение устанавливается? Просто сокет по tcpip?
Да, попробовал сейчас telnet'ом стукнутся по этому IP и порту… к-тото там слушает… блин… без авторизации )
Их же задедосят так бедных )
А протокол стандартный, не нами созданный. Они только переняли опыт и немного адаптировали.