Перейти к основному содержимому

Стакан

WebSocket API позволяет получать стакан котировок (Order Book) в реальном времени с глубиной до 20 уровней.


🔌 WebSocket URL

wss://ws.broker.ru/trade-api-market-data-connector/api/v1/market-data/ws

🔐 Аутентификация

Перед установкой WebSocket-соединения клиент должен передать access-token в HTTP-заголовке:

Authorization: Bearer <ACCESS_TOKEN>

Подробнее об авторизации см. раздел Авторизация.


🧱 Общий формат сообщений

Все сообщения в WebSocket передаются в формате JSON.

  • Клиент → сервер: команды подписки / отписки.
  • Сервер → клиент: подтверждения подписки, данные стаканов, ошибки.

📤 Сообщения client → server

Подписка на стакан

{
"subscribeType": 0,
"dataType": 0,
"depth": 20,
"instruments": [
{
"ticker": "SBER",
"classCode": "TQBR"
}
]
}

Поля запроса

ПолеГдеТипОбяз.Описание
subscribeTypeТелоnumber (enum)даТип сообщения:
0 — Подписка
1 — Отписка
dataTypeТелоnumberдаТип данных:
0 — Стакан
depthТелоnumberнетГлубина стакана (1–20). По умолчанию: 20
instrumentsТелоarrayдаСписок инструментов
instruments[].tickerТелоstringдаБиржевой тикер
instruments[].classCodeТелоstringдаКод класса бумаги

Отписка

{
"subscribeType": 1,
"dataType": 0,
"instruments": [
{ "ticker": "SBER", "classCode": "TQBR" }
]
}

📥 Сообщения server → client

Успешный ответ о подписке

{
"responseType": "OrderBookSuccess",
"subscribeType": 0,
"ticker": "SBER",
"classCode": "TQBR",
"depth": 20,
"dateTime": "2024-10-30T09:01:00.000Z"
}

Структура данных успешной подписки

ПолеТипОписание
responseTypestring (enum)OrderBookSuccess – успешная подписка на стакан
subscribeTypenumber (enum)Тип сообщения:
0 — Подписка
1 — Отписка
tickerstringТикер
classCodestringКласс
depthnumberГлубина стакана
dateTimestring (datetime)Дата и время обновления стакана

Успешный ответ

{
"responseType": "OrderBook",
"ticker": "SBER",
"classCode": "TQBR",
"depth": 20,
"dateTime": "2024-10-30T09:01:00.000Z",
"bidVolume": "59851",
"askVolume": "90339",
"bids": [
{ "price": 244.30, "quantity": 100 },
{ "price": 244.25, "quantity": 90 }
],
"asks": [
{ "price": 244.35, "quantity": 120 },
{ "price": 244.40, "quantity": 50 }
]
}

Структура данных ответа с данными

ПолеТипОписание
responseTypestring (enum)OrderBook – данные стакана
tickerstringТикер
classCodestringКласс
depthnumberГлубина стакана
bidVolumenumberОбъем покупателей в шт.
askVolumenumberОбъем продавцов в шт.
bidsarrayПредложения покупки
bids[].pricenumberЦена
bids[].quantitynumberКоличество
asksarrayПредложения продажи
asks[].pricenumberЦена
asks[].quantitynumberКоличество
dateTimestring (datetime)Дата и время обновления стакана

Пример ответа с ошибкой

{
"responseType": "OrderBook",
"errors": [
{
"message": "Input JSON structure does not match structure, 'instruments' field is undefined.",
"code": "INCORRECT_JSON"
}
]
}

Структура данных ошибки

ПолеТипОписание
responseTypestring (enum)Тип сообщения. Для ошибок по сделкам — OrderBook
errors[].messagestringТекст ошибки
errors[].codestring (enum)Код ошибки:
NO_DATE — нет данных
NOT_FOUND — инструмент не найден
INCORRECT_JSON – невалидный json
BAD_REQUEST — ошибка выполнения
UNAUTHORIZED — клиент не авторизован

💻 Примеры использования

import WebSocket from "ws";

const URL = "wss://ws.broker.ru/trade-api-market-data-connector/api/v1/market-data/ws";

const ws = new WebSocket(URL, {
headers: {
Authorization: "Bearer YOUR_ACCESS_TOKEN",
},
});

ws.on("open", () => {
const subscribeMessage = {
subscribeType: 0,
dataType: 0,
depth: 20,
instruments: [{ ticker: "SBER", classCode: "TQBR" }],
};

ws.send(JSON.stringify(subscribeMessage));
});

ws.on("message", (event) => {
const payload = JSON.parse(event.toString());
console.log(payload);
});

ws.on("error", (error) => {
console.error("WebSocket error:", error);
});

❗ Ошибки

HTTPТекстОписание
400BadRequestНеверные параметры
500Internal Server ErrorВнутренняя ошибка сервера