Стрімінг
Стежте наживо за угодами, цінами, стаканом, рахунком, розкладкою й налаштуваннями через один WebSocket.
Стрім — це одне з’єднання WebSocket, яке несе всі живі оновлення. Щоб
його відкрити, потрібне право market:read.
Підключитися й читати події
import asyncio
from spectre_terminal import Event, Gap, SubscriptionError, Terminal
async def main():
terminal = Terminal.discover()
async with terminal.stream() as stream:
trades = await stream.subscribe("trades", "binance:futures:BTCUSDT")
async for frame in stream:
match frame:
case Event(sub=trades.sub):
for trade in frame.data:
print(trade.side, trade.price, trade.qty)
case Gap():
print("lost trades", frame.from_seq, frame.to_seq)
case SubscriptionError():
print("subscription removed", frame.code)
asyncio.run(main())Цикл видає події, пропуски й помилки підписок. Подія несе sub, seq,
ts і data. sub — це id підписки, а форма data залежить від топіка.
Усі кадри й поля описано в довіднику стріму.
Підписатися на топік
trades = await stream.subscribe("trades", "binance:futures:BTCUSDT")
book = await stream.subscribe("book.top", "binance:futures:BTCUSDT", depth=5, interval_ms=200)
fills = await stream.subscribe("account.fills", connection_id=12)| Топік | Що несе подія | Що потрібно |
|---|---|---|
trades | Нові угоди, по порядку | Інструмент, market:read |
ticker | Добовий тікер | Інструмент, market:read |
mark_price | Ціна маркування | Інструмент, market:read |
book.top | Верх стакана | Інструмент, market:read |
clusters | Бакет кластерів обсягу, що змінився | Інструмент, market:read |
account.orders | Заявки й тригерні заявки одного інструмента | Id підключення, account:read |
account.positions | Позиція одного інструмента | Id підключення, account:read |
account.balances | Баланс однієї валюти | Id підключення, account:read |
account.fills | Одне виконання | Id підключення, account:read |
workspace | Уся розкладка вікон | workspace:read |
settings | Один записаний рядок налаштувань | settings:read |
Відхилений запит викидає StreamRequestError з кодом зі сторінки
Помилки. Дані Московської біржі (MOEX) не надаються.
book.top приймає два необов’язкові параметри. depth — кількість
рівнів з кожного боку: від 1 до 200, типово 50. interval_ms —
найкоротший час між двома кадрами: 50 або більше, типово 100. Значення
поза діапазоном відхиляються з invalid_request.
workspace надсилає поточну розкладку першим кадром. Топіки рахунку й
settings надсилають лише зміни, тож спершу прочитайте поточний стан.
Див. Рахунок і Налаштування.
Обробити пропуск
Коли ваша програма читає повільніше, ніж надходять дані, термінал відкидає кадри, які не вміщаються.
| Топік | Ознака втрати | Що робити |
|---|---|---|
trades | Кадр пропуску перед наступною подією | Прочитати угоди ще раз із since_ts |
account.fills | seq пропускає номер | Прочитати виконання ще раз із since_ts |
settings | seq пропускає номер | Прочитати налаштування ще раз |
| Усі інші | Немає | Нічого. Наступний кадр — найновіший стан, а пропущені номери seq — це нормально |
Передайте час останньої угоди або останнього виконання, які у вас є.
Аргумент — since_ts у Python і sinceTs у TypeScript.
Обробити зняту підписку
Термінал знімає підписку, коли біржа її відхиляє або її підключення
вимкнено. Тоді цикл видає помилку підписки з sub, code і message.
Підпишіться знову, коли причина зникне.
Підключитися знову
import asyncio
from spectre_terminal import StreamClosed, Terminal
async def main():
terminal = Terminal.discover()
while True:
try:
async with terminal.stream() as stream:
await stream.subscribe("trades", "binance:futures:BTCUSDT")
async for frame in stream:
print(frame)
except StreamClosed as closed:
print("stream closed", closed.code)
await asyncio.sleep(1)
asyncio.run(main())Коли термінал закриває стрім, цикл викидає StreamClosed у Python і
StreamClosedError у TypeScript. Підписки не зберігаються, тож після
нового підключення підпишіться знову.
Код закриття показує, чому стрім закрито, див. Коди закриття стріму.
Відписатися й закрити
await stream.unsubscribe(trades)
await stream.close()unsubscribe одразу знімає одну підписку. Закриття стріму знімає їх усі
й завершує цикл без помилки.
Ліміти
Один токен може тримати 8 з’єднань стріму, а одне з’єднання — 100 підписок. API може відкрити 50 інструментів, не відкритих у вікні термінала, і не більш як 5 нових за секунду.
Понад ліміт subscribe завершується помилкою rate_limited. Трохи
зачекайте й спробуйте знову. Див. Ліміти.