Перейти до вмісту

Стрімінг

Стежте наживо за угодами, цінами, стаканом, рахунком, розкладкою й налаштуваннями через один 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.fillsseq пропускає номерПрочитати виконання ще раз із since_ts
settingsseq пропускає номерПрочитати налаштування ще раз
Усі іншіНемаєНічого. Наступний кадр — найновіший стан, а пропущені номери 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. Трохи зачекайте й спробуйте знову. Див. Ліміти.

На цій сторінці