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

[선물 WS] 차트 데이터 실시간으로 받기 (Kline Stream)

Eluv 2023. 6. 18. 06:19
import asyncio
import websockets
import json
import pprint

async def BTC_Kline_Stream():
    symbol = 'btcusdt'
    interval = '1m' # 1m, 3m, 5m, 15m, 1h, 4h, 1d 등..
    uri = f'wss://fstream.binance.com/ws/{symbol}@kline_{interval}'
    async with websockets.connect(uri) as websocket:
        try:
            while True:
                data = json.loads(await websocket.recv())
                pprint.pprint(data)
        except asyncio.CancelledError:
            print("BTC_Kline_Stream 작업이 취소되었습니다.")
        except Exception as e:
            print(f"BTC_Kline_Stream 예외가 발생했습니다: {e}")
        finally:
            print("BTC_Kline_Stream 웹소켓 연결을 종료합니다.")
            await websocket.close()


async def main():
    tasks = [
        asyncio.ensure_future(BTC_Kline_Stream())
    ]
    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("프로그램을 종료합니다.")

Kline/Candlestick Streams – Binance API Documentation (binance-docs.github.io)

다른 코인으로 변경하고 싶다면 symbol의 값을 변경하면 됩니다.

symbol = 'ETHUSDT'

 

시간 단위를 번경하고 싶다면 interval의 값을 변경하면 됩니다.

interval = '5m'

아래는 제공되는 차트 시간 단위입니다.

  • 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M

 

 

출력 결과.

{"e":"kline",     // Event type
"E":1687036073589,   // Event time
"s":"ETHUSDT",    //  종목 이름
"k":{"t":1687036020000, //  캔들 시작 시간
       "T":1687036079999, //  캔들 종료 시간
       "i":"1m",      //  시간 단위
       "f":3069546730,       //  첫 주문 ID
       "L":3069547216,       // 마지막 주문 ID
       "o":"1728.41",  //  시가
       "c":"1728.51",  //  종가
       "h":"1728.60",  //  고가
       "l":"1728.40",  //  저가
       "v":"355.977",    //  거래량
       "n":487,       //  거래 횟수
       "x":false,     // Is this kline closed?, 공식 설명이 이렇게 써있는데 뭔지 모름
       "q":"615314.70568",  //  거래대금
       "V":"175.262",     //   Taker의 Buy 수량
       "Q":"302934.55984",   //   Taker의 Buy 거래대금
       "B":"0"   // Ignore
        }
}

 

 

가격에 대한 정보는 역시 문자열로 받게 됩니다.

사용할 땐 float으로 형변환 해야 합니다.