# Stream Research Protocol — marketData.subscribe

## Контроль документа

| Свойство | Значение |
|----------|----------|
| Документ | Stream Research Protocol — marketData.subscribe |
| Тип документа | Research Protocol |
| Версия | 2.0 |
| Статус | Draft |
| Проект | Dzentra |
| Подсистема | Market Intelligence |
| Биржа | Dzengi |
| Endpoint | `marketData.subscribe` |
| Транспорт | WebSocket Stream |
| Основан на | Market Intelligence Stream Research Standard |
| Язык | Русский |

---

# 1. Исследование подключения

## 1.1 Подключение

### 1.1.1 Корректность подключения

- [x] корректность подключения — подтверждена.

#### Журнал исследования

Получено успешное подключение к WebSocket API Dzengi.

Получено подтверждение подписки.

После подтверждения подписки начинают поступать сообщения `internal.quote`.

---

### 1.1.2 Требования к соединению

- [x] URL подключения — соответствует документации.
- [x] используемый транспорт (WS/WSS) — соответствует документации.

#### Журнал исследования

**URL подключения**

Production: `wss://api-adapter.dzengi.com/connect`
Demo: `wss://demo-api-adapter.dzengi.com/connect`

**Используемый транспорт**

`WSS (WebSocket Secure)`

---

### 1.1.3 Требования к авторизации

- [x] требуется ли авторизация — соответствует документации.
- [x] механизм авторизации — соответствует документации.
- [x] обязательные заголовки авторизации — соответствует документации.
- [x] возможность работы без авторизации — соответствует документации.

#### Журнал исследования

Публичный поток `marketData.subscribe` доступен без передачи данных авторизации.

---

### 1.2 Подписка

- [x] формат подписки — частично соответствует документации;
- [x] подтверждение подписки — соответствует документации;
- [x] сообщения об ошибках — определено экспериментально;
- [х] повторная подписка — определено экспериментально;
- [x] подписка на несколько инструментов — определено экспериментально.

#### Журнал исследования

**Формат подписки**

Документация описывает только содержимое `payload`:

```
{
  "symbols": [
    "string"
  ]
}
```

Фактический формат сообщения, передаваемого через WebSocket /connect:

```
{
  "correlationId": "...",
  "destination": "marketData.subscribe",
  "payload": {
    "symbols": [
      "BTC/USD_LEVERAGE"
    ]
  }
}
```

**Подтверждение подписки**

```
{
    "destination": "marketData.subscribe",
    "status": "OK",
    "payload": {
        "subscriptions": {
            "BTC/USD_LEVERAGE": "PROCESSED"
        }
    }
}
```

**Сообщения об ошибках**

Экспериментально зафиксированы варианты ошибок:

- `INVALID/SYMBOL` возвращает `status = OK`, но в `payload.subscriptions` указывается `ERROR: INVALID/SYMBOL not found`.
- пустой `symbols` возвращает `status = ERROR`, `code = -1128`.
- отсутствующий `symbols` возвращает `status = ERROR`, `code = -1128`.
- отсутствующий `payload` возвращает `status = ERROR`, `code = -1128`.
- неверный `destination` возвращает `status = ERROR`, `errorCode = BAD_REQUEST`.

**Повторная подписка**

- первая подписка получает статус `PROCESSED`;
- повторные подписки получают статус `ALREADY_SUBSCRIBED`;
- сообщения об ошибке не формируются;
- повторная подписка работает без предварительной отмены;
- в проведенных экспериментах признаков дублирования сообщений `internal.quote` не обнаружено.

**Подписка на несколько инструментов**

Экспериментально установлено:

- команда `marketData.subscribe` принимает несколько торговых инструментов;
- подтверждение подписки содержит отдельный статус для каждого инструмента;
- поток `internal.quote` передает сообщения для всех подписанных инструментов через одно WebSocket-соединение;
- принадлежность сообщения к инструменту определяется полем `payload.symbolName`.

---

# 2. Исследование структуры потока

## 2.1 Типы сообщений

- [ ] назначение;
- [ ] содержит ли рыночную информацию;
- [ ] содержит ли служебную информацию;
- [ ] содержит ли ошибки;
- [ ] содержит ли подтверждение подписки;
- [ ] содержит ли подтверждение отписки.

#### Журнал исследования

---

## 2.2 Структура сообщений

- [ ] обязательные поля;
- [ ] необязательные поля;
- [ ] тип каждого поля;
- [ ] допустимые значения;
- [ ] диапазоны значений;
- [ ] ограничения.

#### Журнал исследования

---

# 3. Классификация сообщений

- [ ] рыночное сообщение;
- [ ] служебное сообщение;
- [ ] сообщение управления;
- [ ] сообщение об ошибке;
- [ ] сообщение подтверждения.

#### Журнал исследования

---

# 4. Исследование семантики полей

- [ ] фактическое назначение;
- [ ] источник происхождения;
- [ ] обязательность;
- [ ] изменяемость;
- [ ] диапазон допустимых значений;
- [ ] взаимосвязь с другими полями;
- [ ] ограничения использования;
- [ ] степень подтверждения семантики.

#### Журнал исследования

---

# 5. Исследование информационных фактов

- [ ] какие информационные факты содержит сообщение;
- [ ] какие информационные факты могут быть вычислены непосредственно из сообщения;
- [ ] какие информационные факты отсутствуют;
- [ ] какие информационные факты являются первичными;
- [ ] какие информационные факты являются производными.

#### Журнал исследования

---

## 5.1 Первичные информационные факты

- [ ] источник происхождения;
- [ ] поле сообщения;
- [ ] степень подтверждения;
- [ ] ограничения использования.

#### Журнал исследования

---

## 5.2 Производные информационные факты

- [ ] формула вычисления;
- [ ] необходимые исходные данные;
- [ ] ограничения вычисления;
- [ ] степень достоверности.

#### Журнал исследования

---

# 6. Исследование поведения потока

## 6.1 Частота сообщений

- [ ] минимальная частота;
- [ ] максимальная частота;
- [ ] средняя частота;
- [ ] пиковая частота;
- [ ] условия изменения частоты.

#### Журнал исследования

---

## 6.2 Последовательность сообщений

- [ ] порядок поступления сообщений;
- [ ] последовательность timestamp;
- [ ] наличие пропусков;
- [ ] наличие повторяющихся сообщений;
- [ ] возможность нарушения порядка.

#### Журнал исследования

---

## 6.3 Полнота сообщений

- [ ] полный снимок состояния;
- [ ] инкрементальные изменения;
- [ ] смешанный режим передачи;
- [ ] обязательность всех полей;
- [ ] возможность частичных обновлений.

#### Журнал исследования

---

# 7. Исследование поведения данных

- [ ] условия появления;
- [ ] условия изменения;
- [ ] условия исчезновения;
- [ ] частота изменения;
- [ ] взаимосвязь с другими фактами.

---

## Дополнительно определить

- [ ] какие факты изменяются одновременно;
- [ ] какие факты никогда не изменяются одновременно;
- [ ] какие факты являются независимыми;
- [ ] какие факты являются производными от других.

#### Журнал исследования

---

# 8. Проверка эквивалентности

- [ ] существует ли аналогичный источник;
- [ ] полностью ли совпадает значение;
- [ ] совпадает ли семантика;
- [ ] совпадает ли точность;
- [ ] совпадает ли момент обновления;
- [ ] имеются ли расхождения.

#### Журнал исследования

---

## 8.1 Альтернативные источники

- [ ] REST endpoint;
- [ ] WebSocket Request;
- [ ] другие Stream;
- [ ] внутренние вычисления.

#### Журнал исследования

---

## 8.2 Приоритет источников

- [ ] основной источник;
- [ ] резервный источник;
- [ ] допустимые альтернативы;
- [ ] причины выбора приоритетного источника.

#### Журнал исследования

---

# 9. Исследование производительности

- [ ] средний размер сообщения;
- [ ] максимальный размер сообщения;
- [ ] средняя скорость передачи;
- [ ] максимальная скорость передачи;
- [ ] объём данных в минуту;
- [ ] объём данных в час.

#### Журнал исследования