스트리밍
하나의 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 | 24시간 티커 | 종목, 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 번호가 건너뛰는 것은 정상입니다 |
가지고 있는 마지막 체결이나 체결 내역의 시각을 전달합니다. 인자는
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로 실패합니다. 잠시 기다렸다가
다시 시도합니다. 제한을 참고하십시오.