Описание
API к системе клиринга ОТС деривативов основывается на сообщениях стандарта FIX версии 5.0 SP2. Диаграммы взаимодействия, описанные ниже, также являются стандартными workflows для протокола FIX.
Авторизация
Работа со шлюзом через HTTP осуществляется в session-less режиме. Это означает, что при каждом обращении к сервису участник должен передать в HTTP-заголовке свой логин и пароль. Для этого нужно взять строку вида Логин:Пароль и конвертировать ее методом base64.
Строку с результатом указать в заголовке Authorization: Basic.
Сценарий взаимодействия
Получение списка подтвержденных сделок и сделок, ожидающих подтверждения
API к системе клиринга ОТС деривативов позволяет получать списки:
- заключенных Участником сделок, подтверждённых второй стороной
- заявок на регистрацию сделок, выставленных Участником, и пока не подтвержденных второй стороной
- заявок на регистрацию сделок, выставленных на Участника, и пока не подтвержденных им.
Также возможны и другие комбинации фильтров сделок и заявок по выбору Участника.
Для запроса любого списка сделок или заявок участник должен послать FIX сообщение TradeCaptureReportRequest (35=AD), указав в запросе правило отбора сделок (набор критериев, которым должны соответствовать сделки).
Биржа обязана ответить на это сообщение при помощи TradeCaptureReportRequestAck(35=AQ) в случае отсутствия сделок или заявок, соответствующих критериям запроса.
Также в ответ на запрос TradeCaptureReportRequest Биржа пришлет одну или несколько сделок, соответствующих критериям, указанным в запросе, в формате FIX сообщения TradeCaptureReport.
Состав полей этих сообщений и примеры их заполнения указаны в Таблицах 1, 2 и 3 ниже.
Дополнительные поля в сообщении TradeCaptureReport, специфичные для ответа на запрос списка сделок, выделены оранжевым цветом.
Таблица 1. TradeCaptureReportRequest – примеры запросов списков сделок или заявок
Tag No | Tag Name | Пример заполнения | Об. Поле? | Комментарии |
---|---|---|---|---|
35 | MsgType | AD | + | Тип сообщения TradeCaptureReportRequest |
34 | MsgSeqNum | 123 | + | Порядковый номер сообщения |
49 | SenderCompID | XXX | + | Уникальный идентификатор Участника |
56 | TargetCompID | MOEX | + | |
52 | SendingTime | 20140128-09:32:50 | Время отсылки запроса | |
568 | TradeRequestID | 87654321 | + | ID запроса на получение списка сделок |
263 | 0 | + | 0 - запрос данных без установления подписки на обновления | |
Правило отбора сделок или заявок (блок критериев) См. ниже примеры правил отбора для каждого из 3-х списков, описанных выше Также возможны и другие комбинации критериев отбора | ||||
10 | CheckSum | + |
Правило отбора для списка заключенных Участником сделок.
569 | TradeRequestType | 1 | + | Тип запроса: |
---|---|---|---|---|
453 | NoPartyIDs | 1 | + | |
448 | PartyID | «BROKERFIRM» | + | Запрашиваем все сделки Контрагента BROKERFIRM |
447 | PartyIDSource | D | + | |
452 | PartyRole | 1 | + | Код контрагента в поле 448 |
Правило отбора для списка заявок на регистрацию сделок, выставленных на Участника, и пока не подтвержденных им.
569 | TradeRequestType | 2 | + | Тип запроса: |
---|---|---|---|---|
453 | NoPartyIDs | 1 | + | |
448 | PartyID | «BROKERFIRM» | + | Запрашиваем все сделки, выставленные на Контрагента BROKERFIRM |
447 | PartyIDSource | D | + | |
452 | PartyRole | 17 | + | Код контрагента-второй стороны сделки в поле 448 |
Таблица 2. TradeCaptureReportRequestAck
Tag No | Tag Name | Пример заполнения | Об. Поле? | Комментарии |
---|---|---|---|---|
35 | MsgType | AQ | + | Тип сообщения TradeCaptureReportRequestAck |
34 | MsgSeqNum | 123 | + | Порядковый номер сообщения |
49 | SenderCompID | MOEX | + | |
56 | TargetCompID | XXX | + | Уникальный идентификатор Участника |
52 | SendingTime | 20140128-09:32:50 | Время отсылки запроса | |
568 | TradeRequestID | 87654321 | + | ID запроса на получение списка сделок |
569 | TradeRequestType | 1 | + | Тип запроса: |
263 | 0 | + | 0 - запрос данных без установления подписки на обновления | |
5 | + | Общее кол-во сделок, возвращаемых в ответ на запрос | ||
749 | TradeRequestResult | 0 | + | 0 - успех |
750 | TradeRequestStatus | 0 | + | 0 - запрос принят |
10 | CheckSum | + |
Таблица 3. TradeCaptureReport – одно или несколько сообщений, в ответ на запрос списка сделок
Tag No | Tag Name | Пример заполнения | Об. Поле? | Комментарии | |
---|---|---|---|---|---|
35 | MsgType | AE | + | Тип сообщения TradeCaptureReport | |
34 | MsgSeqNum | 123 | + | Порядковый номер сообщения | |
49 | SenderCompID | MOEX | + | ||
56 | TargetCompID | XXX | + | Уникальный идентификатор Участника | |
52 | SendingTime | 20140128-09:32:50 | Время отсылки сообщения | ||
60 | TransactTime | 20140128-09:32:50 | + | Время заключения сделки | |
75 | TradeDate | 20140128 | + | Дата заключения сделки | |
568 | TradeRequestID | 87654321 | + | ID запроса на получение списка сделок | |
571 | TradeReportID | 123456 | + | Уникальный идентификатор сообщения | |
1003 | TradeID | 6789123 | + если MatchStatus=0 | Идентификатор сделки на Бирже, если сделка уже была подтверждена | |
856 | TradeReportType | 0 | + |
| |
1123 | TradeHandlingInstr | 0 | + | 0 - подтверждение заявки на сделку от участника | |
150 | ExecType | F | + | F - Trade | |
573 | MatchStatus | 0 | + | 0 - matched | |
5 | + | Общее кол-во сделок, возвращаемых в ответ на запрос | |||
912 | N | + | Y - последнее сообщение в ответ на запрос | ||
32 | LastQty | 5000000 | + | Количество контрактов | |
31 | LastPx | 1 | + | Цена сделки | |
423 | PriceType | 1 | 1 - цена выражена в % | ||
55 | Symbol | N/A | не применимо в нашем случае | ||
541 | MaturityDate | 20140331 | + | Дата окончательных расчетов по сделке | |
22 | SecurityIDSource | I | + | I - описание контракта в формате FpML в поле 351 | |
347 | MessageEncoding | UTF-8 | |||
350 | EncodedSecurityDescLen | + | Длина описания контракта в поле 351 | ||
component | EncodedSecurityDesc | + | Описание контракта в формате FpML | ||
15 | Currency | + | Основная валюта контракта | ||
120 | SettlCurrency | Валюта поставки контракта | |||
552 | NoSides | 1 | + | Всегда 1 | |
54 | Side | 1 | + |
| |
453 | NoPartyIDs | 4 | + | ||
448 | PartyID | «CPTYFIRM» | + | ||
447 | PartyIDSource | D | + | ||
452 | PartyRole | 17 | + | Код контрагента– второй стороны сделки в поле 448 | |
448 | PartyID | «BROKERFIRM» | + | ||
447 | PartyIDSource | D | + | ||
452 | PartyRole | 1 | + | Код контрагента в поле 448 | |
448 | PartyID | «ACCOUNT» | + | ||
447 | PartyIDSource | D | + | ||
452 | PartyRole | 38 | + | Торговый счет контрагента в поле 448 | |
448 | PartyID | «JOHNDOE» | |||
447 | PartyIDSource | D | |||
452 | PartyRole | 11 | Код трейдера в поле 448 | ||
10 | CheckSum | + |
Получение справочных данных
Для получения Участником справочных данных (список собственных счетов, список контрагентов) используется запрос PartyDetailsListRequest (35=CF). API должен уметь обрабатывать запрос PartyDetailsListRequest и возвращать ответ на него в формате сообщения PartyDetailsListReport (35=CG).
Таблица 7. PartyDetailsListRequest – примеры запросов справочных данных
Tag No | Tag Name | Пример заполнения | Об. Поле? | Комментарии |
---|---|---|---|---|
35 | MsgType | CF | + | Тип сообщения PartyDetailsListRequest |
34 | MsgSeqNum | 123 | + | Порядковый номер сообщения |
49 | SenderCompID | XXX | + | Уникальный идентификатор Участника |
56 | TargetCompID | MOEX | + | |
52 | SendingTime | 20140128-09:32:50 | Время отсылки запроса | |
1505 | PartyDetailsListRequestID | 87654321 | + | Уникальный идентификатор сообщения |
263 | 0 | + | 0 - запрос данных без установления подписки на обновления | |
453 | NoPartyIDs | 1 | + Если RequestedPartyRole=24 | |
448 | PartyID | «OUR_FIRM» | ||
447 | PartyIDSource | D | ||
452 | PartyRole | 1 | Код Участника, для которого мы запрашиваем список счетов. Счета можно запрашивать только для собственной фирмы (Участника) | |
1508 | NoRequestedPartyRoles | 1 | + | |
1509 | RequestedPartyRole | 1 или 24 | + | 1 – запрашиваем список всех Участников 24 – запрашиваем список собственных торговых счетов (код Участника-собственника счетов указывается в поле 448) |
10 | CheckSum | + |
Таблица 8. PartyDetailsListReport – примеры ответов на запрос справочных данных
Tag No | Tag Name | Пример заполнения | Об. Поле? | Комментарии |
---|---|---|---|---|
35 | MsgType | CG | + | Тип сообщения PartyDetailsListReport |
34 | MsgSeqNum | 123 | + | Порядковый номер сообщения |
49 | SenderCompID | MOEX | + | |
56 | TargetCompID | XXX | + | Уникальный идентификатор Участника |
52 | SendingTime | 20140128-09:32:50 | Время отсылки запроса | |
1510 | PartyDetailsListReportID | 12345 | + | Уникальный идентификатор сообщения |
1505 | PartyDetailsListRequestID | 87654321 | + | ID запроса на получение справочных данных |
1511 | RequestResult | 0 | + | 0 – успех 1 – ошибка 3 – ошибка доступа, запрос списка чужих счетов |
1671 | NoPartyDetails | х | + | Количество участников или собственных торговых счетов (элементов PartyDetail), возвращаемых в сообщении |
1691 | PartyDetailID | «FIRM_1» | + | Идентификатор экземпляра объекта (счет, участник) |
1692 | PartyDetailIDSource | D | + | Источник идентификатора экземпляра объекта Какие значения? |
1693 | PartyDetailRole | 1 или 24 | + | 1 – код Участника в поле 1691 24 – собственный торговый счёт в поле 1691 |
1328 | RejectText | «описание ошибки» | + Если RequestResult <> 0 | |
10 | + |
Ниже представлена таблица с возможными условиями запроса и результатами: PtyId R=1 Наша сторона PtyId R=17 Сторона контрагент Возвращаем все подтвержденные сделки OUR_FIRM (PtyId R=1) Ошибка: "Ошибка, нельзя запрашивать сделки без указания Участника (Pty1)" Ошибка, "Нельзя запрашивать сделки, в которых я являюсь контрагентом" Ошибка, Нет доступа к сделкам участника (Pty с R=1 не соответствует логину) Ошибка, "Нет доступа к сделкам участника (Pty с R=1 не соответствует логину)" Ошибка, "Нельзя запрашивать сделки, в которых я являюсь контрагентом" Возвращаем все ордера, где контрагент OTHER_FIRM и инициатор MY_FIRMS Нельзя запрашивать чужие заявки# ReqTyp Результат Txt ReqRslt ReqStat Лог 1 any null null Ошибка: "ReqR must be specified" Pty not specified 3 2 SPFIAPI-10001 Сделки 2 1 OUR_FIRM null Only one ReqR is allowed SPFIAPI-10002 3 1 null OUR_FIRM Executing Party not specified 3 2 SPFIAPI-10003 4 1 OUR_FIRM OUR_FIRM Trades not found 3 2 SPFIAPI-10004 5 1 OTHER_FIRM null Pty not specified 3 2 SPFIAPI-10005 6 1 null OTHER_FIRM Возвращаем все подтвержденные сделки с контрагентом OTHER_FIRM для MY_FIRMS Executing Party not specified SPFIAPI-10006 7 1 OTHER_FIRM OTHER_FIRM Pty not specified 3 2 SPFIAPI-10007 8 1 OUR_FIRM OTHER_FIRM Возвращаем все подтвержденные сделки с контрагентом OTHER_FIRM SPFIAPI-10008 9 1 OTHER_FIRM OUR_FIRM Not correct Pty value 9 2 SPFIAPI-10009 10 R != 1 или R != 17 Requested PartyRole ({0}) is not supported for this request 3 2 SPFIAPI-10010 11 Неизвестное значение PtyId Not correct Pty value {0} 3 2 SPFIAPI-10011 12 Проверки пройдены успешно, но сделок нет No trades found 0 1 SPFIAPI-10012 13 Что-то пошло не так Undefined Error. Contact the administrator 99 2 SPFIAPI-10013 Заявки 14 2 OUR_FIRM null Возвращаем все выставленные ордера участником OUR_FIRM SPFIAPI-10014 15 2 null OUR_FIRM Возвращаем все ордера где контрагент OUR_FIRM SPFIAPI-10015 16 2 OUR_FIRM OUR_FIRM Заявки не будут возвращены No trades found 0 1 SPFIAPI-10016 17 2 OTHER_FIRM null Возвращаем все входящие ордера от OTHER_FIRM, и контрагент MY_FIRMS Not correct Pty value 9 2 SPFIAPI-10017 18 2 null OTHER_FIRM Executing Party not specified 3 2 SPFIAPI-10018 19 2 OTHER_FIRM OTHER_FIRM Not correct Pty value 9 2 SPFIAPI-10019 20 2 OUR_FIRM OTHER_FIRM Все ордера выставленные OUR_FIRM и ожидающие подтверждения от OTHER_FIRM SPFIAPI-10020 21 2 OTHER_FIRM OUR_FIRM Все ордера выставленные OTHER_FIRM и ожидающие подтверждения от OUR_FIRM SPFIAPI-10021
Схемы сообщений и примеры
Ниже представлены схемы сообщений для формирования сообщения FpML указанного в поле component и сообщения FIXML:
- FpML-over-FIX(SecXML element)-2.xml – пример успешно сформированного сообщения FIXML;
- spfi-xsd.zip – архив с XSD-схемами;
- spfi-1-4_SW_2.xsd – XSD-схема для формирования сообщений FIXML.