Избранное трейдера Jurdumbay

по

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

Вступление

     Никогда не увлекался скоростным трейдингом. Всегда хватало терминала. Изучать этот протокол меня побудил набор вакансий. Надо отметить, что я неспешно перебираю хорошие вакансии на рынке. Частному трейдеру очень сложно развиваться в одиночку — психологически, эмоционально, физически. Создавать и развиваться постоянно хочется, поэтому принял решение вливаться в коллектив. За несколько месяцев, мне удалось провести несколько собеседований. На втором этапе я проваливался именно из за не знаний протокола.  Предметную область я примерно представлял. Ну что там сложного? Соединился с биржей по сокетам и начинай обмен сообщениями. Надо отметить, что в этой области есть уже готовые разработки в виде quickfix или готового API от StockSharp (правда платные). Но я принял решение разбираться с нуля, чтобы вникнуть в детали.

Технические аспекты протокола


     Итак. Любой протокол, какой бы он сложный не был, работает примерно одинаково. Мы создаем у себя соединение с сервером, устанавливаем некий туннель между нами и сервером, посредством которого будем обмениваться сообщениями. Протокол — это как раз и есть набор правил, по которым строятся сообщения нужного формата. Если говорить технически, то мы должны создать сокет соединение с сервером на указанный порт.
Сообщение в FIX, как и в любом другом протоколе, состоит из нескольких блоков:
  • <Заголовок сообщения>
  • <Сообщение>
  • <Концовка сообщения>
     Наша задача, правильно заполнить эти блоки и отправить на сервер. Заголовок сообщения в свою очередь состоит из следующих данных:
  • <Начало сообщения, версия протокола>
  • <Длина (размер) сообщения>
  • <Тип сообщения>
  • <Идентификатор отправителя>
  • <Идентификатор получателя>
  • <Номер сообщения>
  • <Время отправки>
     Обращу ваше внимание, что я перечисляю обязательные поля. Есть еще и дополнительные. Концовка сообщения должна выглядеть так:
  • <Контрольная сумма сообщения>
     Сами данные заполняются достаточно легко. В виде: <тип поля> = <значение>. Например, <длина сообщения> = 78, то есть мы серверу говорим, что размер передаваемого нами сообщения составляет 78 байт. Стоит обратить внимание, что в протоколе FIX, типы полей кодируются в виде числовых значений. Например,  <длина сообщения> в протоколе передается как цифра 9. Исходя из выше сказанного, наш заголовок сообщения, выглядел бы следующим образом:
  • 8=FIX.4.4 _____ начало сообщения, протокол версии 4.4
  • 9=78 _____ размер сообщения 78 байт
  • 35=A _____ тип сообщения А, что означает попытка на соединение с сервером
  • 49=<ваш идентификатор выдается биржей>
  • 56=FG _____ идентификатор получателя, раздел Forts на бирже
  • 34=1 _____ первое сообщение
  • 52=20160212-11:42:51.812 _____ время отправки сообщения

Организационные вопросы

  1. Наша биржа дает тестовый контур для отработки своих алгоритмов по данному протоколу. Надо всего лишь написать запрос на доступ. Надо признать, тех служба работает отменно. Очень все быстро было организовано. Подробности http://moex.com/s442
  2. Обязательно понадобится описание протокола для нашей биржи ftp://ftp.moex.com/pub/FIX/Spectra/test/docs/spectra_fixgate_ru.pdf
  3. Чтобы вникнуть в тонкости передачи, мне очень помогла эта программа от биржи (позже я покажу как помогла) ftp://ftp.moex.com/pub/FIX/Spectra/Utils/fix_client.zip
  4. Описание самого протокола от создателей (на английском). Мне помог сильно wiki. http://fixwiki.org/fixwiki/FIXwiki
  5. Чтобы найти свои ошибки, мне приходилось перехватывать сообщения рабочего клиента биржи и сверять со своими. Для этого мне понадобился tcp/ip сниффер — программа перехвата сетевого трафика.
  6. Разработку я веду на c#.

К бою. Немного теоретической практики

     На момент изучения протокола, я уверен, многие столкнуться со следующими вопросами:
  • как именно считать длину сообщения
  • как разделять между собой данные
  • как считать контрольную сумму

     Если говорить образно. То, чтобы отправить сообщение на сервер, нам просто нужно сформировать нужную строку со всеми данными и отправить ее на биржу. Ну например:

8=FIX.4.4
;9=78;35=A;49=FG;56=tgFhcfx901U05;34=1;52=20160212-11:42:51.812
;98=0;108=3000;141=Y;10=047;

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

     Если быть внимательным, то мы увидим, что кол-во символов в строке у нас 100, а в заголовке сообщения мы передаем, что 78 (9 = 78). По правилам протокола FIX, длину сообщения нужно считать без учета концовки и первых двух полей заголовка. А именно:

Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#     С длиной сообщения разобрались. Теперь про разделитель. Пока в моем скрине это ";". В документациях западных написано что это символ SOH. Чтобы однозначно ответить на этот вопрос, я запустил прилагаемого клиента биржи и сниффером стал перехватывать сообщения между клиентом и биржей. Кстати, программа ведет логи, и их общение выглядит так (зеленое — передача запроса на биржу, красное — ответ от биржи):
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#
     Зачеркнул свой идентификатор, прошу понять правильно. Ну а перехват сообщения выглядит так:
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#     Зеленым я отметил именно разделители. Как вы уже видите, это просто в шестнадцатеричном виде код 01. То есть, в нашу строку в виде разделителей, нужно вставлять код 01. Также я отметил для себя последовательность полей в сообщении. Почему то в другом порядке у меня вызывало ошибки (возможно тут я не прав)
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#     Ну и контрольная сумма. Контрольная сумма считается над всем сообщением, за исключением концовки. То есть в расчет берется только заголовок и само сообщение. Для этого, мы переводим каждый символ в его Ascii код и вычисляем их сумму. Полученную сумму делим по модулю 256. Это и будет контрольной суммой сообщения. При этом, значение должно быть трехзначным. Если мы получаем 2 знака, то подставляем 0 слева (например, если контрольная сумма = 68, то должны передать значении 068).

К бою. Начало программирования

     В законченном виде, разработка будет составлять готовый класс, для работы с протоколом. Теперь начинаю строить его по кирпичикам. Для начала, я создал несколько классов:
  • класс для работы с заголовками
  • класс для работы с сообщением подключения к серверу (onLogon)
  • класс для работы с концовкой
    Каждый класс включает в себя поля, которые передаются и некоторые методы для их обработки.
    Класс для работы с заголовками. Пока просто выглядит так: 
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#

Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#     Как видим, первый метод строит нужную строку из полей. Обратите внимание, там присутствует наш разделитель в виде спец символа \u0001. Второй метод вычисляет размер заголовка (чтобы потом высчитывать размер сообщения). Надо обратить внимание, что при передачи времени, миллисекунды должны указываться в трехзначном формате (даже если миллисекунды = 52, то передаем 052). Следующие классы строятся по аналогии.
Класс создания сообщения на подключение (инициализация сессии)
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#
Класс создания концовки сообщения
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#

Попробую привести код консольной программы для теста в виде цитаты. Картинки вставляются плохого качества. Подробно комментирую.

//Получаем ip сервера
IPAddress ipAddr = IPAddress.Parse(server);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
//Создаем заголовк
HeaderMessage msHeader = new HeaderMessage
{
BeginString = «FIX.4.4»,
MsgType = «A», //Тип сообщения на установку сессии
SenderCompID = "",
TargetCompID = «FG»,
MsgSeqNum = 1
};
//Создаем сообщение на подключение onLogon
LogonMessage msLogon = new LogonMessage
{
EncryptMethod = 0,
HeartBtInt = 3000,
ResetSeqNumFlag = true
};

//Вычисляем длину сообщения
msHeader.BodyLength = msHeader.GetHeaderSize() + msLogon.GetMessageSize();
//Создаем концовку сообщения
TrailerMessage msTrailer = new TrailerMessage(msHeader.ToString() + msLogon.ToString());

//Формируем полное готовое сообщение
string fullMessage = msHeader.ToString() + msLogon.ToString() + msTrailer.ToString();
Console.WriteLine(«Сообщение для отправки {0}»,fullMessage);

//Создаем сокет для подключения
sSender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//Подключаемся
sSender.Connect(ipEndPoint);
Console.WriteLine(«Сокет соединился с {0} », sSender.RemoteEndPoint.ToString());


byte[] msg = Encoding.UTF8.GetBytes(fullMessage);
//Отправляем сообщение
int bytesSent = sSender.Send(msg);
Console.WriteLine(«Отправил {0} байт», bytesSent.ToString());


//Получаем ответ от сервера
byte[] bytes = new byte[1024];
int bytesRec = 0;
bytesRec = sSender.Receive(bytes);
Console.WriteLine(«Ответ от сервера: {0}», Encoding.UTF8.GetString(bytes, 0, bytesRec));


Все таки приложу и в виде картинок. Так наглядней. Кликабельно.
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#
В результате мы запросили у сервера подключение с нашим логином. И получили от него ответ.
Изучаю FIX протокол с нуля. Разбор протокола, первый код на c#
По мере развития, буду продолжать с теоретической частью. Если модераторы перенесут в раздел «Алго», я не против.

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

Корабли лавировали, лавировали, да не вылавировали. Обзор на предстоящую неделю от 31.01.2016

    • 31 января 2016, 23:40
    • |
    • Kitten
      Популярный автор
  • Еще
По ФА…

На уходящей неделе:
Корабли лавировали, лавировали, да не вылавировали. Обзор на предстоящую неделю от 31.01.2016
— Заседание ФРС

ФРС порадовала рынки тремя заявлениями:
— Обычным сопроводительным заявлением;
— Решением по денежно-кредитной политике;
— Заявлением о целях и стратегии денежно-кредитной политики в долгосрочной перспективе.

Решение по денежно-кредитной политике полностью соответствует декабрьскому тексту.
В заявление о целях и стратегии в долгосрочной перспективе было внесено изменение:
«Комитет будет обеспокоен, если инфляция будет постоянно двигаться выше или ниже цели ФРС 2%».
Голосование относительно изменений в долгосрочную политику, в отличие от голосования по ставке, не было единогласным: Буллард голосовал против, отметив, что риторика поправки к заявлению недостаточно акцентирует внимание на ожидаемых отклонениях инфляции от цели ФРС.

( Читать дальше )

Фунт стерлингов. GBP/USD. 6B. Действия крупных игроков и ситуация на рынке валютных фьючерсов на сегодняшний момент, согласно отчетам СОТ.

Фунт стерлингов. GBP/USD. 6B. Действия крупных игроков и ситуация на рынке валютных фьючерсов на сегодняшний момент, согласно отчетам СОТ.

Сегодня я хотел бы обратить ваше внимание на ситуацию, сложившуюся в таком, интересном для многих инструменте, как фунт стерлингов. Это важно, как для работающих с валютными фьючерсами на CME, так и торгующими на рынке FOREX.

Уважаемый лично мной за очень грамотную аналитичку, Михаил Мирошниченко относительно недавно опубликовал пост, в котором выразил мысль, что торгующим на форексе особо не стоит брать в расчет данные по валютным фьючерсам с CME, в частности, по объемам, т. к. объемы глобального межбанковского рынка FOREX значительно превосходят таковые на фьючерсном рынке. Да, это действительно так, но фьючерсный валютный рынок, не смотря на свои меньшие размеры, все же очень тесно связан с межбанковским рынком, и движения, происходящие на этих рынках, по сути, одинаковые. Конечно, всегда будут возникать нюансы, касающиеся удобства для хеджирования и спекуляций, но сильного дисбаланса между этими рынками не может быть по определению, т. к. возникший дисбаланс мгновенно устраняют арбитражеры.



( Читать дальше )

ЕЦБ: миссия невыполнима? Обзор на предстоящую неделю от 17.01.2016

    • 17 января 2016, 23:58
    • |
    • Kitten
      Популярный автор
  • Еще
По ФА…

На предстоящей неделе:
ЕЦБ: миссия невыполнима? Обзор на предстоящую неделю от 17.01.2016
1. Заседание ЕЦБ, 21 января

На уходящей неделе участников рынка порадовали очередной порцией информации о намерениях ЕЦБ, невзирая на неделю тишины.
Виллерой, глава ЦБ Франции, перед промежуточным заседанием ЕЦБ сообщил, что мандат ФРС вынуждает ЕЦБ увеличить усилия для достижения цели по инфляции, а не уменьшить их.
Глава ЦБ Франции отметил, что пространство для снижения ставок ограничено, т.к. «ультра низкие» ставки могут привести к образованию пузырей, но до окончания периода мягкой монетарной политики ещё далеко.
Как правило, подобные заявления от лидеров проблемных стран Еврозоны говорят как минимум об обсуждении дополнительных мер на предстоящем заседании ЕЦБ.

В четверг, после промежуточного заседания ЕЦБ, Рейтер опубликовал инсайд от 5 анонимных членов ЕЦБ.

( Читать дальше )

Прогнозы на 2016 год. Глобальный взгляд от 27.12.2015

    • 27 декабря 2015, 22:47
    • |
    • Kitten
      Популярный автор
  • Еще
Каким будет 2016 год для финансовых рынков?
Прогнозы на 2016 год. Глобальный взгляд от 27.12.2015
ФРС в декабре 2015 года повысила ставку впервые за 9 лет, что, согласно истории, означает окончание периода супер мягкой политики во всем мире.
Монетарная политика ФРС опережающая, другие ЦБ мира следуют в кильватере ФРС с временным лагом.
Согласно этой логике, 2016 год должен стать стартовым для расцвета мировой экономики, период мягкой монетарной политики развитых стран будет завершен.
Подтверждением данной теории являются декабрьские решения ЕЦБ и ВоЯ, которые больше похожи на окончательную коррекцию программ QE, чем на готовность к расширению этих программ в будущем.

Конечно, не стоит исключать риск ошибки членов ФРС при оценке перспектив роста экономики США.
ФРС впервые повысила ставку при инфляции значительно ниже 2% и при падении PMI промышленности ниже водораздела рецессии в 50 пунктов.

( Читать дальше )

Бедность это воровство

    • 26 декабря 2015, 18:52
    • |
    • alexKa
  • Еще
Посмотрел недавно интервью одного немецкого автора, проживающего в Швейцарии, он также жил раньше на Кубе.

www.youtube.com/watch?v=rG3PfzkJ-vU

В своем интервью он рассказал о своей книге «бедность это воровство» (Armut ist Diebstahl).
Он приводит простейшие логические размышления о причинах бедности. Об этом люди задумывались уже давно, и существуют различные работы со времен средневековья.
В общем он пытается развеять несколько общепринятых в обществе заблуждений.
Одно из них, то, что богатые как то виноваты в существовании бедных… Но вот допустим если в Колумбии или Бразилии есть богатые люди, если взять их состояние и поделить среди остальных, то получится примерно 1000 долларов на человека. Это вряд ли как то победит бедность.
Другое заблуждение, что если помогать бедным, то это как то поможет победить бедность. Это тоже не так, на примере Африки, если посылать туда бесплатную еду и одежду, то местные фермеры и производители не смогут поднять голову, ибо зачем кому то трудиться, если можно пойти и взять где то за бесценок.

( Читать дальше )

Курс на новый кризис. Обзор на предстоящую неделю от 20.12.2015

    • 20 декабря 2015, 22:10
    • |
    • Kitten
      Популярный автор
  • Еще
По ФА…

На уходящей неделе:
Курс на новый кризис. Обзор на предстоящую неделю от 20.12.2015
— Заседание ФРС

ФРС повысил диапазон ставки по федеральным фондам до 0,25%-0,50%.
В сопроводительном заявлении указано, что члены ФРС ожидают рост экономики, который будет служить основанием «только для постепенного увеличения ставки».
Решение было принято единогласно.

Основной акцент сопроводиловки касался инфляции: «учитывая текущий недостаточный рост инфляции, ФРС будет внимательно следить за фактическим и ожидаемым прогрессом роста инфляции к ориентиру 2%».
Более широкие условия для повышения ставки остались неизменными:
«При определении сроков и размера предстоящих повышений ставки, ФРС будет оценивать фактический и ожидаемый прогресс по отношению к своим целям максимальной занятости и 2% инфляции.

( Читать дальше )

Только начал читать, но впечатлен - От фермы к фабрике. Новая интерпретация советской промышленной революции

www.ozon.ru/context/detail/id/24939717/

От издателя

Сказать, что величайший экономический эксперимент в истории — коммунизм в СССР — стал и крупнейшим провалом, означает лишь очередную попытку выразить мысль, которая для многих является очевидной. Однако Роберт Аллен в своей работе приводит совершенно иную, поразительную интерпретацию этого исторического феномена, утверждая, что экономика Советского Союза стала одной из наиболее успешных развивающихся систем XX века. К столь провокационному выводу его приводит пересчет показателей национального уровня потребления, а также использование в рамках проведенного анализа экономических, демографических и компьютерных имитационных моделей, позволяющих спрогнозировать альтернативные варианты экономического развития страны, то есть дать ответ на основополагающий вопрос истории «а что, если?». Кроме того, сопоставление советских экономических показателей не только с передовыми экономиками, но и с рядом менее развитых стран мира позволяет автору дать более полный контекст для проведения анализа.

( Читать дальше )

Шоу на ФРС гарантировано. Обзор на предстоящую неделю от 13.12.2015

    • 14 декабря 2015, 00:02
    • |
    • Kitten
      Популярный автор
  • Еще
По ФА…

На предстоящей неделе:
Шоу на ФРС гарантировано. Обзор на предстоящую неделю от 13.12.2015
1. Заседание ФРС, 16 декабря.

Рынок уверен в повышении ставки ФРС на заседании 16 декабря.
Экономисты, аналитики банков подавляющим большинством считают, что ФРС повысит ставки на следующей неделе, т.к. в противном случае доверие рынка к ФРС будет окончательно подорвано.
Некоторые члены иностранных ЦБ, ВоЯ в частности, уже поздравили ФРС с предстоящим повышением ставки в этом месяце, что говорит либо в пользу их осведомленности либо непроходимой глупости.
Но так ли однозначен исход декабрьского заседания ФРС?

В протоколе ФРС от заседания 28 октября были расширены условия для повышения ставки:
«На заседании в декабре Комитет примет решение по ставке основываясь на широком спектре информации, в том числе данных по рынку труда, инфляции и инфляционных ожиданий, а также учтет финансовую и международную ситуацию»

( Читать дальше )

Повышение ставок ФРС: механика и последствия

Повышение ставок ФРС: механика и последствияПриведу полный перевод статьи с сайта seekingalpha.com. Мне понравилось написанное и с точки зрения выводов, и с точки зрения грамотности писавшего, и с точки зрения чтения для общего развития. В принципе, не так много материалов (особенно на русскоязычной стороне интернета), которые бы объясняли в деталях механизмы функционирования Федеральной резервной системы, особенно в вопросе о взаимодействии и взаимовлиянии ставок. Поэтому публикую перевод полностью, даже не вставляя собственных комментариев и ремарок. Советую прочитать целиком, а если что-то непонятно — перечитать. Я постарался сделать так, чтобы все иностранные аббревиатуры были понятны, и для этого практически везде вставил пояснения.
  • Статья начинается с тщательного обзора механизма, с помощью которого будет происходить повышение ставок ФРС (обсуждая IOER и ставку RRP).
  • Анализ процентных ставок ФРС в отношении рынка казначейских бумаг даст более полное представление о том, как новые инструменты ФРС будут влиять на реакции рынка.
  • В обзоре будет рассмотрено, как акции и облигации будет зависеть от последующего решения ФРС.


( Читать дальше )

....все тэги
UPDONW
Новый дизайн