Модель коммуникации¶
Введение ¶
FIX API использует сессионную коммуникацию. Сессия определяется как коммуникация между двумя сторонами: инициатором (клиентом), стороной, которая инициирует коммуникацию, и акцептором (сервером), стороной, которая получает запрос на соединение от инициатора.
Сервер проверяет запросы клиента, используя сообщение Logon.
Протокол сессии FIX ¶
Каждая сессия поддерживает двунаправленный обмен сообщениями между клиентом и сервером cTrader. Сессия может включать несколько физических соединений и поддерживается с использованием порядковых номеров.
Каждое новое сообщение в рамках одной сессии получает уникальный порядковый номер, начиная с 1 (единицы). Обе стороны полагаются на порядковые номера для поддержания упорядоченной коммуникации. Пропущенные сообщения повторно передаются по двустороннему соглашению между обеими сторонами.
Типичный поток сессии:
- Клиент начинает сессию с сообщения Logon.
- Клиент обменивается прикладными сообщениями с сервером.
- Сессия заканчивается сообщением Logout.
Категории сообщений протокола cTrader FIX ¶
Как определено в протоколе FIX, сервер cTrader FIX использует 2 различных уровня данных: системный и прикладной.
Обратите внимание, что это минимальный набор сообщений, необходимых для поддержки требуемых рабочих процессов, и он может изменяться со временем по мере развития как бизнес-потребностей, так и стандарта FIX.
Системные (административные) сообщения ¶
- Heartbeat (клиент ↔ cTrader) – используется для проверки канала связи между двумя сторонами.
- Test request (клиент ↔ cTrader) – используется для проверки работоспособности канала связи.
- Logon (клиент → cTrader) – сообщение аутентификации клиента.
- Logon (клиент → cTrader) – нормальное завершение сессии.
- Resend request (клиент ↔ cTrader) – запрос на повторную передачу определенных прикладных сообщений.
- Reject (клиент ↔ cTrader) – ошибка проверки на уровне сессии.
- Sequence reset (клиент ↔ cTrader) – в случае проблем со связью восстанавливаются пропущенные сообщения или последовательность сбрасывается, чтобы игнорировать пропущенные сообщения.
Прикладные сообщения ¶
- Market data request (клиент → cTrader) – общий запрос рыночных данных.
- Market data incremental refresh (клиент ← cTrader) – ответы на сообщение запроса рыночных данных.
- New order single (клиент → cTrader) – используется для электронной отправки ордеров брокеру для исполнения.
- Execution report (клиент ← cTrader) – используется для отправки информации о статусе ордера FIX-клиенту, такой как подтверждения, исполнения и незапрошенные изменения.
- Business message reject (клиент ← cTrader) – используется для отклонения запроса FIX-клиента по причинам, не связанным с сессией.
Структура сообщения FIX ¶
В этом разделе объясняется, как составляется сообщение FIX API, описывается формат сообщения FIX и помогает пользователям понять концепцию пары тег-значение.
Каждое сообщение должно содержать 3 части:
- Заголовок – каждому административному или прикладному сообщению предшествует стандартный заголовок. Заголовок определяет тип сообщения, версию FIX, длину сообщения, назначение, порядковый номер, источник и время.
- Тело – содержимое тела сообщения определяется типом сообщения, указанным в заголовке.
- Окончание – каждое сообщение, административное или прикладное, завершается стандартным окончанием. Окончание используется для разделения сообщений и содержит трехзначное символьное представление значения
CheckSum <10>.
Формат сообщения FIX ¶
Сообщение FIX представляет собой набор полей. Каждое поле - это пара тег-значение, отформатированная как {тег}={значение}. Например, 54=2, что означает тип ордера - продажа.
Тег ¶
- FIX использует предопределенные теги.
- Каждый тег представляет определенное поле.
- Каждому тегу присваивается предопределенный номер.
- Спецификация cTrader FIX предоставляет список полей и соответствующих номеров тегов.
Значение ¶
- Значения представляют значение, присвоенное тегу.
- Значения могут быть только одного из следующих типов данных: целое число, число с плавающей запятой, символ, время, дата, данные или строка.
Все сообщения в cTrader FIX API начинаются с 8=FIX.x.y, где x.y - это версия протокола FIX. В конце каждого сообщения должно быть поле 10=xyz, где xyz представляет собой сумму всех двоичных значений в сообщении, называемую контрольной суммой.
Контрольная сумма помогает выявить любые проблемы при передаче, в частности потерю пакетов, позволяя получателю узнать, отсутствует ли какая-либо часть сообщения.
Если в FIX-сообщении для cTrader/cServer используется тег Symbol(55), необходимо указать FIX ID инструмента. Это значение может отличаться у разных брокеров. Вы можете найти поле FIX ID инструмента в приложении cTrader этого брокера в окне информации об инструменте.
Пример сообщения ¶
8=FIX.4.4|9=126|35=A|34=1|49=theBroker.12345|57=TRADE|50=any_string|52=20170117-08:03:04|56=CSERVER|98=0|108=30|553=12345|554=passw0rd!|10=131|
| # Тег | Название тега | Значение | Описание |
|---|---|---|---|
| 8 | BeginString | 4.4 | Версия FIX |
| 9 | BodyLength | 102 | Длина тела сообщения составляет 102 символа |
| 35 | MsgType | A | Тип сообщения — Logon |
| 34 | MsgSeqNum | 1 | Порядковый номер сообщения — 1 |
| 49 | SenderCompI | D | broker.1047 ID торговой стороны, где broker" — это уникальный BrokerUID, предоставленный cTrader, а "1047" — это числовой идентификатор торгового счета." |
| 57 | TargetSubID | TRADE | Дополнительный квалификатор сеанса. Возможные значения: "QUOTE","TRADE". |
| 50 | SenderSubID | QUOTE | Присвоенное значение, используемое для идентификации конкретного отправителя сообщения |
| 52 | SendingTime | 20131129- 15:40:10.276 | Время передачи сообщения — 29 ноября 2013 г. (YYYYMMDD) в 15:40:10 и 276 миллисекунд |
| 56 | TargetCompID | CSERVER | Получатель сообщения — CSERVER. Это единственное допустимое значение в cTrader FIX API. |
| 98 | EncryptMethod | 0 | В настоящее время единственное допустимое значение — "0" (ноль) = NONE_OTHER (шифрование не используется) |
| 108 | HeartBtInt | 30 | Интервал контрольного сигнала в секундах. Значение задается в файле 'config.properties' (на стороне клиента) как SERVER.POLLING.INTERVAL'. 30 секунд — интервал по умолчанию. Если HeartBtInt установлен в 0, сообщение контрольного сигнала не требуется. |
| 553 | Имя пользователя | 1047 | Числовой ID пользователя |
| 554 | Пароль | MyPassword1 | Пароль пользователя |
| 10 | CheckSum | 000 | Контрольная сумма вычисляется следующим образом: суммируются все байты сообщения до поля контрольной суммы (не включая его), затем результат преобразуется в число по модулю 256 с префиксом "0" для получения трехзначного числа. |