파이썬/바이낸스 현물 웹소켓

[현물 WS] 호가창 일부분 실시간 (Partial Book Depth Streams)

Eluv 2023. 6. 10. 03:11
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초에 에 한 번 데이터를 전달받습니다.

 

 

 

포맷하면서 실수로 소스들을 날려버린 김에

백업 겸 블로그에 올림