[일상] websocket으로 업빗 실시간 시세 받기

in SCT.암호화폐.Crypto6 years ago (edited)

그동안 defi에 투자하느라 트레이딩에 소홀했었는데요. 결국 trading을 해야 할 것 같아서 기존 코드를 다시 review하고 있습니다만, 벌써 몇달이 지나서인지 기억이 가물가물하군요.

아무래도 암호화폐 시장이 변동성도 좋고, 거래도 24시간 지속되기 때문에 트레이딩에 적합할 것 같습니다. 국내에서 가장 거래량이 많은 곳은 upbit죠. 그래서 시세를 받을 수 있는 방법을 찾아보았습니다.

최근 체결 내역을 알려주는 REST API가 있지만 조회 회수 제한이 걸려있기 때문에 무한정 사용할 수는 없습니다. 이런 경우에는 websocket을 이용하여 데이터를 받을 수 있습니다.

관련 사항은 upbit 개발자센터 Guides 부분을 참고하였습니다.

websocket으로는 현재가, 체결가, 호가 정보를 실시간으로 확인이 가능합니다. 일단 체결가를 알아보는 방법에 대하여 기술합니다.


websocket을 이용하여 실시간 체결가를 얻는 방법에 대하여 기술합니다.

우선 아래 두 패키지를 import합니다.

import websockets
import asyncio

만약 처음 사용하는 경우라면 pip 명령어를 사용하여 설치하시기 바랍니다.

pip install websockets

pip install asyncio

socket을 이용한 네트워크 프로그램 경험이 없더라도 간단하게 구현이 가능합니다.

우선 connect() 함수를 이용하여 upbit의 websocket 서버에 접속합니다.

websockets.connect('wss://api.upbit.com/websocket/v1')

접속이 성공하였다면 시세를 받을 코인명을 전달합니다. 이때 ticket은 임의의 문자열 사용하시면 되고, code에 시세를 받고 싶은 코인명을 기술하면 됩니다.

ss = '[{"ticket":"test1243563456"},{"type":"trade","codes":["KRW-BTC", "KRW-ETH"]}]'

websocket.send(ss)

send가 성공적으로 이루지면 등록한 코인에 대하여 체결이 이루어지면 체결 정보가 전달됩니다.

data_rev = websocket.recv()

recv() 함수로 받은 데이터를 json 형태로 변환하면 원하는 정보를 추출할 수 있습니다.

프로그램 동작 중에 coin을 추가하거나 삭제하면 바로 반영이 됩니다.

이것을 모두 모아서 만든 sample 프로그램입니다. 우선 KRW-BTC만 시세만 받다가 5개를 받았으면 KRW-ETH를 추가하여 BTC, ETH를 받다가 받은 시세 수량이 20개를 넘으면 마지막 코인(ETH)을 지우고 TRX를 추가하여 받는 방식으로 동작합니다.

UPBIT_WEB_SOCKET_ADD = 'wss://api.upbit.com/websocket/v1'
async def do_async_loop(trading_coins) :
    async with websockets.connect(UPBIT_WEB_SOCKET_ADD) as websocket:
        # ss format ex : '[{"ticket":"test1243563456"},{"type":"trade","codes":["KRW-BTC", "KRW-ETH"]}]'
        ss = '[{"ticket":"test1243563456"},{"type":"trade","codes":' + str(trading_coins).replace("'", '"') +'}]'
        await websocket.send(ss)
        cnt = 1
        while(1) :
            data_rev = await websocket.recv()
            my_json = data_rev.decode('utf8').replace("'", '"')
            data = json.loads(my_json)
            if len(data) > 0 :
                print(data['code'], data['trade_time'], data['ask_bid'], data['trade_price'], data['trade_volume'])
            if (cnt == 5) :  # adding the new coin, KRW-ETH after receiving 5 trs
                trading_coins.append('KRW-ETH')
                print('== adding KRW-ETH ==')
                ss = '[{"ticket":"test1243563456"},{"type":"trade","codes":' + str(trading_coins).replace("'", '"') +'}]'
                await websocket.send(ss)
            elif (cnt == 20) : # delete the last coin and adding the new coin, KRW-TRX after receiving 20 trs
                print('== deleting KRW-ETH ==')
                del trading_coins[-1]
                print('== adding KRW-TRX ==')
                trading_coins.append('KRW-TRX')
                ss = '[{"ticket":"test1243563456"},{"type":"trade","codes":' + str(trading_coins).replace("'", '"') +'}]'
                await websocket.send(ss)
            cnt += 1

소스코드는 아래 github에 있습니다.

github.com/multizone-quant/upbit/blob/main/upbit-websocket-ex

Sort:  

[US$49.00](▼14%)[Nespresso]스타벅스 네스프레소 호환 캡슐 7종 / 120 캡슐 골라담기 / 20개씩 총 6종류 교차 선택 가능 / 중복 선택 가능 / 재고 확보 / 무료배송 / 개당 약 486원 최저가★

WWW.QOO10.COM

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.082
BTC 60573.65
ETH 1550.46
USDT 1.00
SBD 0.47