Trading/암호화폐2021. 9. 4. 18:02

 

개요. 

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

 

사전필수 준비사항

- 파이썬 개발 환경 구축. 

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

 

 

 

코드. - 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



 

 

연관. 

 

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

 

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 2019. 파이썬 개발환경 구축

Visual Studio 2019 에서 파이썬 개발환경 설치. - 사전준비 : Visual Studio 2019 기본설치된 상태 에서 하기 셋팅 진행 VS2019 에서 Python Interactive View 활용예. Visual Studio 에서의 파이썬 개발 설명 문..

igotit.tistory.com

 


첫 등록 : 2020.03.17

최종 수정 : 2021.09.04

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

 


 

 

 

Posted by 리치굿맨

댓글을 달아 주세요

  1. 감사합니다 ^^

    2020.03.25 23:46 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 감사합니다

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

    2021.01.11 10:29 [ ADDR : EDIT/ DEL : REPLY ]
  3. 주문은

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

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

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

      2021.03.13 02:18 신고 [ ADDR : EDIT/ DEL ]
  4. 굿맨_최고입니다

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

    2021.04.09 11:50 [ ADDR : EDIT/ DEL : REPLY ]
    • BTCUSDT 는 BTCUSD 와는 다른 서버 주소로 접속해야 합니다.

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


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

      2021.04.09 13:08 신고 [ ADDR : EDIT/ DEL ]
  5. 비밀댓글입니다

    2021.06.04 19:02 [ ADDR : EDIT/ DEL : REPLY ]
  6. abst@nate.com

    블로그를 보면서 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

    2021.07.26 16:48 [ ADDR : EDIT/ DEL : REPLY ]
    • 위 포스팅에서 설명하고 있는 것은 웹소켓으로 실시간 체결 데이터 수신 코딩예 입니다.

      웹소켓으로 실시간 캔들데이터 관련.
      웹소켓으로 현재의 캔들 데이터 실시간으로 확보가능하고요.
      상세 : 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

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


      2021.07.27 00:32 신고 [ ADDR : EDIT/ DEL ]