본문 바로가기
트레이딩/암호화폐

암호화폐. API. bybit. 실시간 시세수신. WebSocket. Python

by 리치굿맨 2022. 2. 12.

 

개요. 

- 암호화폐 거래소 바이빗 에서 제공하는 WebSocket 기반 실시간 시세수신(= 실시간 체결 틱 데이터) 파이썬 코드. 

 

사전필수 준비사항

- 파이썬 개발 환경 구축. 

- 처음으로 파이썬 개발환경 구축하는 경우라면 Visual Studio 2019 의 파이썬 개발환경 강력 추천. 2가장 심플하고 지속가능한 개발환경 유지가능. ( 여타 다른 파이썬 개발환경은 산만하고 개발자로 하여금 환경 셋팅에 시간낭비 많이 시켰음. 설치좀 그만하고 코딩좀 하자.. )

 

2022.02.18 추가

VS2022 출시 상태, 신규 도입한다면 VS2022 에서  파이썬 개발환경 추천.  

 

 

코드. - Python

 

 

 

2021년 9월4일 코드 수정함. 라인 9 를 주석처리하고 라인 10으로 변경함.  

- 사유 : 파이썬 websockets 버전 8.1 에서는 라인 9가 정상작동하였으나, 버전 9.1 (21년9월 시점 최신 버전)에서는 오류 생긴다. 라인 10처럼 해야 정상 작동함. 

 

실행 영상. 

 

 

코드 구현 요점 설명.

코드에서 함수 websocket.send('{"op":"subscribe","args":["trade.BTCUSD"]}'); 호출하여 수신된 데이터 (아래 박스)보면 첫수신된 데이터는 성공여부 알려주고 있고, 이후부터는 체결시마다 동일형식으로 데이터 수신된다.

{"success":true,"ret_msg":"","conn_id":"b4c485b1-e03a-4196-a43b-3e692ff164e1","request":{"op":"subscribe","args":["trade.BTCUSD"]}}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421306462,"timestamp":"2020-03-17T05:01:46.000Z","symbol":"BTCUSD","side":"Buy","size":82,"price":5294,"tick_direction":"ZeroPlusTick","trade_id":"1e2ed56a-b1e0-5615-beb5-84b833aa2cba","cross_seq":1285784559},{"trade_time_ms":1584421306462,"timestamp":"2020-03-17T05:01:46.000Z","symbol":"BTCUSD","side":"Buy","size":4,"price":5295,"tick_direction":"PlusTick","trade_id":"18a5fd54-3fb7-5c75-9116-5272a4d6638c","cross_seq":1285784559},{"trade_time_ms":1584421306462,"timestamp":"2020-03-17T05:01:46.000Z","symbol":"BTCUSD","side":"Buy","size":914,"price":5295,"tick_direction":"ZeroPlusTick","trade_id":"45b2643e-8f91-59f5-a7b5-23dd7317be84","cross_seq":1285784559}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421306529,"timestamp":"2020-03-17T05:01:46.000Z","symbol":"BTCUSD","side":"Buy","size":20,"price":5296,"tick_direction":"PlusTick","trade_id":"d9eddfb6-f5ae-5bee-b48f-43d186f0bf54","cross_seq":1285784674}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421306685,"timestamp":"2020-03-17T05:01:46.000Z","symbol":"BTCUSD","side":"Buy","size":20,"price":5298,"tick_direction":"PlusTick","trade_id":"6c030547-d800-5fff-979e-b0c5a3d683bc","cross_seq":1285784778},{"trade_time_ms":1584421306685,"timestamp":"2020-03-17T05:01:46.000Z","symbol":"BTCUSD","side":"Buy","size":415,"price":5298,"tick_direction":"ZeroPlusTick","trade_id":"42e36f30-20d9-51ae-a550-d478a5c8bf5c","cross_seq":1285784778}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421307799,"timestamp":"2020-03-17T05:01:47.000Z","symbol":"BTCUSD","side":"Sell","size":62,"price":5297.5,"tick_direction":"MinusTick","trade_id":"83053408-717f-5a8a-841b-deb8a409f41d","cross_seq":1285784863}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421308271,"timestamp":"2020-03-17T05:01:48.000Z","symbol":"BTCUSD","side":"Buy","size":20900,"price":5298,"tick_direction":"PlusTick","trade_id":"3fd727ea-055e-5cdd-a424-cf73c9b72c78","cross_seq":1285784894}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421309240,"timestamp":"2020-03-17T05:01:49.000Z","symbol":"BTCUSD","side":"Sell","size":10,"price":5297,"tick_direction":"MinusTick","trade_id":"bf215523-738e-50d9-887a-2ac499aac008","cross_seq":1285784984}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421317372,"timestamp":"2020-03-17T05:01:57.000Z","symbol":"BTCUSD","side":"Buy","size":3,"price":5297,"tick_direction":"ZeroMinusTick","trade_id":"57ef0e59-0b74-5a2d-a6ee-0741fc35db0c","cross_seq":1285785468},{"trade_time_ms":1584421317372,"timestamp":"2020-03-17T05:01:57.000Z","symbol":"BTCUSD","side":"Buy","size":247,"price":5297,"tick_direction":"ZeroMinusTick","trade_id":"d262909d-d96a-5442-93f2-f8b5e12963b6","cross_seq":1285785468}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421318880,"timestamp":"2020-03-17T05:01:58.000Z","symbol":"BTCUSD","side":"Sell","size":15,"price":5297,"tick_direction":"ZeroMinusTick","trade_id":"92d7b6a8-e8e9-54c0-8a4d-3dfdd2a7bf2d","cross_seq":1285785576}]}
{"topic":"trade.BTCUSD","data":[{"trade_time_ms":1584421321007,"timestamp":"2020-03-17T05:02:01.000Z","symbol":"BTCUSD","side":"Sell","size":485,"price":5297,"tick_direction":"ZeroMinusTick","trade_id":"68776ea2-a778-54d8-b9c4-d6240589eeb8","cross_seq":1285785772},{"trade_time_ms":1584421321007,"timestamp":"2020-03-17T05:02:01.000Z","symbol":"BTCUSD","side":"Sell","size":149,"price":5297,"tick_direction":"ZeroMinusTick","trade_id":"f13b653f-4dd9-5bbc-ac6a-03c41e4622f1","cross_seq":1285785772}]}

참고 체결데이터 자료형식. - json

주의사항 : data list의 {} 로 감싼 요소 수는 매번의 전송시 마다 다름. 1개의 {} 가 송신되는 경우도 있고, 여러개 의 {} 이 송신되는 경우도 있음. 수량 체크하여 처리하는 루틴 필수 마련할것.

{
    "topic": "trade.BTCUSD",
    "data": [
        {
            "timestamp": "2020-01-12T16:59:59.000Z",
            "trade_time_ms": 1582793344685, // trade time in millisecond
            "symbol": "BTCUSD",
            "side": "Sell",
            "size": 328,
            "price": 8098,
            "tick_direction": "MinusTick",
            "trade_id": "00c706e1-ba52-5bb0-98d0-bf694bdc69f7",
            "cross_seq": 1052816407
        }
    ]
}

from : https://bybit-exchange.github.io/docs/inverse/#t-websockettrade



 

USDT 무기한 종목 실시간 시세 받기 

 

종목예 : ETHUSDT   

USDT 무기한 종목인 경우에도 위에서 보인 인버스 무기한 종목과 코드 구조는 완전히 동일하며, 주소부분과 종목을 USDT 무기한 종목의 것으로 하면 된다. 

 

 

 

 

 

 

웹소켓 서버 3개 동시 접속 하는 코드 예. 

 

별도 정리. 

 

bybit. API. WebSocket 서버 3개 동시 접속 파이썬 코드.

개요 - bybit 의 USD 종목용 websocket 서버 1개와 , USDT 종목용 websocket 서버 2개에 동시 접속하여 코드 작동방식. 1. 파이썬 코드 실행되면 파일 apikey_url_bybit.txt 를 읽어서 접속서버주소와 api key, se..

igotit.tistory.com

 

 

 

 

 

 

 

 

 

 

연관. 

 

상기 코드 상태에서 보안접속 하는 코드. 

 

bybit. API. 보안접속 코드 . 파이썬

개요 - 암호화폐 거래소 bybit API 이용하여 접속시 api key, secrete 로 보안접속 파이썬 코드. - 이전 작업했던 파이썬 코드 에서 아래 코드 추가한다. 즉, 접속첫자리에서 본인의 보안정보 송신하면

igotit.tistory.com

 

상기 코드와 유사한데, websocket 서버 3개에 동시접속하는것. 

 

bybit. API. WebSocket 서버 3개 동시 접속 파이썬 코드.

개요 - bybit 의 USD 종목용 websocket 서버 1개와 , USDT 종목용 websocket 서버 2개에 동시 접속하여 코드 작동방식. 1. 파이썬 코드 실행되면 파일 apikey_url_bybit.txt 를 읽어서 접속서버주소와 api key, se..

igotit.tistory.com

 

 

 

거래소. bybit. 바이빗. 개요. 가입방법. 암호화폐

바이빗 거래소 주요특징. - 거래가능 종목 : - BTCUSD , ETHUSD , EOSUSD , XRPUSD - 최대 레버리지 100 까지 가능 매매자가 레버리지 사용 유무 선택가능. - - 장점 : 레버리지 1에서 거래하여 수익 10% 날것이..

igotit.tistory.com

 

 

암호화폐. API. 바이빗. REST , WebSocket

bybit API 개요 - 형식 : REST , WebSocket - bybit 거래소 가입 하여 API 키 발급 받아야 API 적용된 클라이언트 앱에서 활용가능. - 개발가능한 언어 : REST, WebSocket 구현가능한 모든 언어 - C++, 자바스크립..

igotit.tistory.com

 

 

 

파이썬. 웹소켓. WbeSocket 구현.

파이썬 WebSocket 코딩 사전 준비. - 모듈 WebSockets 설치하기. - 코드에서 import websockets 하고 실행시켜서 모듈 없다는 메시지 보이면 websockets 모듈 설치하면됨. - 아래 영상에서 websocket 아닌 websock..

igotit.tistory.com

 

 

Python. asyncio. 비동기 모듈.

Python asyncio 모듈. - event loop 에서 실행할 것들을 schedule(등록) 하고 작업들을 실행, 취소, 일시 중지 가능. - 파이썬 3.4 부터 첫배포, 버전에 따라 기능 추가. - 파이썬 3.6 에서의 기능 상태. - - asyn..

igotit.tistory.com

 

 

Python. 딕셔너리.

get() . 키에 해당하는 값 받기. my_dict = {'a': 1, 'b': 2, 'c': 3}; my_dict.get('a'); # 키 a 의 값 1 반환됨. my_dict.get('a',0); # 2번째 인자에 0을 기록하면 키없다면 0 반환됨. my_dict.get('d',0); #..

igotit.tistory.com

 

아래 링크의 내용은 bybit 공식 배포되는 웹소켓 라이브러리인데.. 현재(2020.10.31) USDT 종목은 완전하게 구현안되어있어서.. 별로 활용도가 높지 않음. 

 

암호화폐. API. bybit. WebSocket. bybit-ws. Python

bybit-ws 개요 - 파이썬에서 암호화폐 거래소 바이빗 의 웹소켓 통신 간편하게 구현가능한 라이브러리. - 바이빗에서 공식 배포 (지속가능성 보장됨 ). - USD종목과 USDT 종목에서 모두 사용가능. - - US

igotit.tistory.com

 

 

 

 

 

 

Visual Studio 2022. 파이썬 개발환경 설치

사전 준비 : Visual Studio 2022 설치된 상태. 파이썬 개발 환경 설치 방법 Visual Studio 실행하여 메뉴 : Tools -> Get Tools and Featues... 클릭하여 뜬 아래 창에서 상단 탭 워크로드 에서 Python 개발 선택..

igotit.tistory.com

 

 

 

 


첫 등록 : 2020.03.17

최종 수정 : 2022.02.19

단축 주소 : https://igotit.tistory.com/2490

 


 

 

 

댓글14

  • Favicon of https://gry1994.tistory.com BlogIcon 주식투자 2020.03.25 23:46 신고

    감사합니다 ^^
    답글

  • 감사합니다 2021.01.11 10:29

    실시간 호가를 받을 수 있는 부분은 어디인지 알 수 있을까용?
    답글

  • 주문은 2021.03.13 00:42

    주문은 웹소켓으로 못하나요?

    https://github.com/bybit-exchange/api-connectors/blob/master/official-ws/python/BybitWebsocket.py
    여기서 보면 주문 넣는 함수는 안보이는것 같아서요.
    답글

    • Favicon of https://igotit.tistory.com BlogIcon 리치굿맨 2021.03.13 02:18 신고

      네 거래소 API 들이 websocket 형식과 rest 형식 2종이 제공되고 있고, 주문 송신은 rest 형식(http request ) 으로만 가능합니다. websocket 은 실시간 수신 받을 데이터에 사용됩니다. rest api 기반 주문 관련 정리 글 https://igotit.tistory.com/2493 에 개괄적으로 정리되어있습니다.

  • 굿맨_최고입니다 2021.04.09 11:50

    좋은정보 감사합니다.
    BTCUSD 실시간 조회는 잘 작동합니다.
    혹시 BTCUSDT 는 실시간 조회 불가능 한가요? 가능하다면 어디를 수정해야 하는것인지 여쭤봅니다 ㅎ
    답글

    • Favicon of https://igotit.tistory.com BlogIcon 리치굿맨 2021.04.09 13:08 신고

      BTCUSDT 는 BTCUSD 와는 다른 서버 주소로 접속해야 합니다.

      bybit 거래소 서버 주소 정리글 : https://igotit.tistory.com/2674


      BTCUSDT 와 BTCUSD 동시 실시간 조회 코드예제 https://igotit.tistory.com/2676

  • 익명 2021.06.04 19:02

    비밀댓글입니다
    답글

  • abst@nate.com 2021.07.26 16:48

    블로그를 보면서 bybit에 대한자동 매매를 만들어 보려고 하고 있어요 5분 봉을 받아서 그것을 기준으로 매인 매도을 하려고 하는데
    async with websockets.client.Connect("wss://stream.bybit.com/realtime") as websocket: 이부분에서 부터 에러가 되더라구요
    그래서 print(client.Kline.Kline_markPrice(symbol="BTCUSD", interval="30",limit=200, **{'from':1600544880}).result()) 바이비트에서 제공하는것으로 값을 받으니 시가,고가,저가,종가로만 나오는데 5분봉이나 30분봉의 기준이 되는걸 보려면 어디서 보면 될까요?

    그리고 저기서 값을 받아보니 현제가가 38,311.00$ 인데 받은값에서는 비슷한 수치가 하나도 없는건 달러가 아니라 다른 환율로 나오는것인가요?

    'BTCUSD', 'period': '30', 'start_at': 1600547400, 'open': 11058.8603515625, 'high': 11095.1103515625, 'low': 11058.830078125, 'close': 11093.990234375
    답글

    • Favicon of https://igotit.tistory.com BlogIcon 리치굿맨 2021.07.27 00:32 신고

      위 포스팅에서 설명하고 있는 것은 웹소켓으로 실시간 체결 데이터 수신 코딩예 입니다.

      웹소켓으로 실시간 캔들데이터 관련.
      웹소켓으로 현재의 캔들 데이터 실시간으로 확보가능하고요.
      상세 : https://igotit.tistory.com/2678

      rest api 로 과거 캔들데이터 요청 하여 캔들 여러개 확보 방법.
      상세 : https://igotit.tistory.com/2514

      님의 코드 client.Kline.Kline_markPrice(symbol="BTCUSD", interval="30",limit=200, **{'from':1600544880}).result())

      가 rest api 로 요청하여 캔들 데이터 확보하는 것입니다. 위 코드에서 from 은 캔들의 시작시간을 지정하는 부분인데 초단위 의 에포크 타임 이라는 걸로 지정합니다. 에포크 타임이란 1970년 1월 1일 0시0분0초를 0으로 하여 초단위로 계산된 특정일의 시간입니다.

      1970년 1월 1일 0시0분0초 이후 1600544880초 이후 시점은 2020년 입니다. ( 제가 이 시간에 해당하는 월, 일은 정확하게 파악하지 못했으나 2020년 인건 확실합니다.)

      따라서 코드에서 확보된 캔들데이터는 2020년의 비트코인 시세다 보니 현재시세랑 다르게 보입니다.

      연관정보

      C 언어에서의 에포크 타임 핸들링 하는 함수 예 : https://igotit.tistory.com/673

      파이썬에서는 구글에서 파이썬 시간 으로 검색하면 관련 처리 방법 확인 가능합니다.


  • Favicon of https://darkwhite.tistory.com BlogIcon 다크화이트 2021.11.02 03:40 신고

    오래전 부터 많은 도움을 받았지만 이제서야 감사 인사 드립니다.
    저는 파이썬을 이용한 바이비트 그리드매매를 만들려 하는데 워낙 초보라 남의것 따라하고 필요한 부분을 바꿔가며 배우고 있는 중입니다.
    지금은 파이썬 업그레이드 때문인지 위 프로그램이 실행이 되지 않습니다. ㅠㅠ
    pybit bybit-ws 등은 사용은 편한거 같은데 매매가 않되고 길어질때 접속이 끊어지고 비동기적인 async 문이 먹히지 않아 애먹고 있습니다.
    위에 처럼 작동이 되면 좋겠는데 websockets을 다운그레이드해도 에러만 생깁니다. 어찌해야 할까요? ㅠㅠ
    답글

    • Favicon of https://igotit.tistory.com BlogIcon 리치굿맨 2021.11.02 13:11 신고


      디버깅 시작점은 파이썬 실행 커맨드 창에서 보여주는 오류 내용부터 보면서 하나씩 각개 격파.. 특히 오류 내용의 주요문구를 복사해서 구글에서 검색해보면 보통은 해결책을 찾을 수 있습니다.

      사족.
      프로그램 만드는 과정은 통상 코딩 그자체보다 훨씬 많은 시간이 디버깅에 투자됩니다. 다들 그래요... 디버깅을 빠르게 해내는게 코딩 전문가라고 해도 될 정도입니다. ^^

  • 코인봇 2022.06.22 19:05

    한동안 개발을 놓다가 다시 해보려고 하는데요,
    혹시 웹소켓 실시간 수신 데이터를 차트로 출력하고 싶은데, 해보신적 있으실까요?
    답글

    • Favicon of https://igotit.tistory.com BlogIcon 리치굿맨 2022.06.24 02:50 신고

      저의 경우엔, 파이썬으로 작업하는 경우는 대부분 사전 시험용 프로토타입 구현시 사용하게 되는데요.. 그러다보니 파이썬으로 구현되는 앱의 완성도나 챠트 등의 시각적 요소에는 크게 집중하질 않습니다.

      저 개인적으로는 , 본격 실전투입 실행 앱은 visual c++ 구현을 선호하고요 챠팅 라이브러리는 ChartDirector (상세 : https://igotit.tistory.com/553 ) 를 주로 이용합니다. chartdirector 는 MFC 용 뿐만 아니라 파이썬용 라이브러리도 무료로 기능 제한없이 사용가능합니다.

      한편, 파이썬에서 챠팅은 많은 분들이 matplotlib (상세 : https://igotit.tistory.com/2126 ) 을 이용하는것 같습니다. 저의 경우엔 실시간 표현목적등에서는 matplotlib 보다는 chartdirector 가 더 편했기에 matplotlib 가 그닥 좋은 것처럼 여겨지지는 않았습니다. 그런데 matplotlib 는 구글 검색해보면 넘쳐나는 많은 정보들이 있어서 개발시 빠른 구현이 가능할 것으로 보입니다.


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT