본문으로 건너뛰기

스트리밍

하나의 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
ticker24시간 티커종목, 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 번호가 건너뛰는 것은 정상입니다

가지고 있는 마지막 체결이나 체결 내역의 시각을 전달합니다. 인자는 Python에서 since_ts, TypeScript에서 sinceTs입니다.

제거된 구독 처리

터미널은 거래소가 구독을 거부하거나 그 구독의 연결이 꺼지면 구독을 제거합니다. 이때 루프는 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())

터미널이 스트림을 닫으면 루프는 Python에서 StreamClosed를, TypeScript에서 StreamClosedError를 발생시킵니다. 구독은 유지되지 않으므로, 다시 연결한 뒤 다시 구독합니다.

종료 코드는 스트림이 닫힌 이유를 알려 줍니다. 스트림 종료 코드를 참고하십시오.

구독 해제와 닫기

await stream.unsubscribe(trades)
await stream.close()

unsubscribe는 구독 하나를 즉시 제거합니다. 스트림을 닫으면 모든 구독이 제거되고 루프가 오류 없이 끝납니다.

제한

토큰 하나는 스트림 연결을 8개까지, 연결 하나는 구독을 100개까지 가질 수 있습니다. API는 터미널 창에 열려 있지 않은 종목을 50개까지 열 수 있으며, 새 종목은 초당 최대 5개입니다.

제한을 넘으면 subscribe가 rate_limited로 실패합니다. 잠시 기다렸다가 다시 시도합니다. 제한을 참고하십시오.

이 페이지의 내용