import asyncio
import websockets
import json
from pprint import pprint
async def Partial_Book_Depth():
symbol = 'btcusdt' # 이름
levels = '@depth20' # 불러올 주문 수. 5, 10, 20 단위
US = '@1000ms' # 업데이트 속도. 1000ms, 100ms
uri = f'wss://stream.binance.com:9443/ws/{symbol}{levels}{US}'
async with websockets.connect(uri) as websocket:
try:
while True:
data = json.loads(await websocket.recv())
pprint(data)
except asyncio.CancelledError:
print("Partial_Book_Depth 작업이 취소되었습니다.")
except Exception as e:
print(f"Partial_Book_Depth 예외가 발생했습니다: {e}")
finally:
print("Partial_Book_Depth 웹소켓 연결을 종료합니다.")
await websocket.close()
async def main():
tasks = [asyncio.create_task(Partial_Book_Depth())]
try:
await asyncio.gather(*tasks)
except asyncio.CancelledError:
print("메인 작업이 취소되었습니다.")
for task in tasks:
task.cancel()
await asyncio.gather(*tasks, return_exceptions=True)
except Exception as e:
print(f"메인 함수에서 예외가 발생했습니다: {e}")
finally:
print("메인 함수의 작업이 종료되었습니다.")
if __name__ == '__main__':
try:
asyncio.run(main())
except KeyboardInterrupt:
print("프로그램을 종료합니다.")
Partial Book Depth Streams – Binance API Documentation (binance-docs.github.io)
호가창에 대한 데이터를 가져오는 방식 중 Partial Book Depth Streams 웹소켓은
호가창의 전체 데이터가 아닌 현재가격에서 가장 가까운 매수, 매도 주문의 일부분만 가져옵니다.
아래는 바이낸스의 공식 설명입니다.
Stream Names: <symbol>@depth<levels> OR <symbol>@depth<levels>@100ms.
Top bids and asks, Valid are 5, 10, or 20. // 주문 개수
Update Speed: 1000ms or 100ms // 업데이트 속도
출력 결과 입니다.
{'asks': [['93243.82000000', '4.46399000'],
['93244.00000000', '0.09250000'],
['93244.02000000', '0.00012000'],
['93245.03000000', '0.35953000'],
['93245.04000000', '0.21533000'],
(...중략)
'bids': [['93243.81000000', '1.61196000'],
['93243.63000000', '0.00023000'],
['93243.62000000', '0.00107000'],
['93243.25000000', '0.00006000'],
['93243.24000000', '0.03015000'],
(...중략)
],
'lastUpdateId': 55000770559}
asks는 매도 주문, bids는 매수 주문입니다.
symbol = 'btcusdt' # 이름
levels = '@depth20' # 불러올 주문 수. 5, 10, 20 단위
US = '@100ms' # 업데이트 속도. 1000ms, 100ms
uri = f'wss://stream.binance.com:9443/ws/{symbol}{levels}{US}'
다른 종목으로 변경하고 싶을 경우
symbol = 'btcusdt' -> 'ethusdt', 'dogeusdt'
등으로 변경하시면 됩니다.
가져오는 주문의 수를 변경하고 싶다면
levels = '@depth20' -> '@depth5' 혹은 '@ depth10'
입력한 숫자 만큼의 주문 정보를 가져옵니다. (5, 10, 20 이외엔 지원하지 않습니다)
업데이트 속도를 변경하고 싶다면
US = '@1000ms' -> @100ms'
100ms는 0.1초, 1000ms는 1초에 에 한 번 데이터를 전달받습니다.
포맷하면서 실수로 소스들을 날려버린 김에
백업 겸 블로그에 올림