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

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

by i.got.it 2022. 2. 12.

 

 

2024.09.08 추가 

현재 시점 최신버전 API v5 에서의 실시간 시세 수신 코딩 방법 

https://igotit.tistory.com/5831

 

암호화폐 실시간 틱 데이터 수신 코딩 방법 . 파이썬

개요 암호화폐 거래소 바이비트 API 통신 위한 공식 파이썬 패키지 pybit 이용하여 파이썬에서  실시간 틱 데이터 수신 위한 가장 쉬운 기본적인 형태에서 출발하여 점진적으로 더 유용한 형

igotit.tistory.com

 

 

 

 

아래 내용은 이전 버전의 것이라 도움 안됨. 

 

 

 

 

 

 

개요. 

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

 

사전필수 준비사항

- 파이썬 개발 환경 구축. 

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

 

2022.02.18 추가

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

 

 

코드. - Python

 

 

 

 

################ bybit WebSocket example.
import asyncio
import websockets
import json
async def my_loop_WebSocket_bybit():
# 2021.09.04 error websockets version 9.1 only available version 8.1 async with websockets.client.Connect("wss://stream.bybit.com/realtime") as websocket:
async with websockets.connect("wss://stream.bybit.com/realtime") as websocket:# OK websockets version 9.1
print("Connected to bybit WebSocket");
await websocket.send('{"op":"subscribe","args":["trade.BTCUSD"]}');
data_rcv_response = await websocket.recv();
print("response for subscribe req. : " + data_rcv_response);
while True:
data_rcv_strjson = await websocket.recv();
data_rcv_dict = json.loads(data_rcv_strjson); # convert to Pyhton type dict
data_trade_list = data_rcv_dict.get('data',0);
if data_trade_list == 0:
continue
num_data_trade_list = len(data_trade_list);
print("Num List : " + str(num_data_trade_list));
for data_trade_dict in data_trade_list : ## variable number of element(dictionary) in List per one packet.
print("timestamp : " + data_trade_dict.get('timestamp',0)
+ ", price : " + str(data_trade_dict.get('price',0))
+ ", size : " + str(data_trade_dict.get('size',0))
);
##### main exec
my_loop = asyncio.get_event_loop();
my_loop.run_until_complete(my_loop_WebSocket_bybit()); # loop for connect to WebSocket and receive data.
my_loop.close();

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 무기한 종목의 것으로 하면 된다. 

 

 

 

 

################ bybit WebSocket example. USDT perpetual ETHUSDT
import asyncio
import websockets
import json
async def my_loop_WebSocket_bybit():
# 2021.09.04 error websockets version 9.1 only available version 8.1 async with websockets.client.Connect("wss://stream.bybit.com/realtime") as websocket:
async with websockets.connect("wss://stream.bybit.com/realtime_public") as websocket:# OK websockets version 9.1
print("Connected to bybit WebSocket");
await websocket.send('{"op":"subscribe","args":["trade.ETHUSDT"]}');
data_rcv_response = await websocket.recv();
print("response for subscribe req. : " + data_rcv_response);
while True:
data_rcv_strjson = await websocket.recv();
data_rcv_dict = json.loads(data_rcv_strjson); # convert to Pyhton type dict
#print(data_rcv_strjson)
data_trade_list = data_rcv_dict.get('data',0); #arg2=0 mean return 0 if no 'data'
if data_trade_list == 0:
continue
num_data_trade_list = len(data_trade_list);
print("Num List : " + str(num_data_trade_list));
for data_trade_dict in data_trade_list : ## variable number of element(dictionary) in List per one packet.
print("timestamp : " + data_trade_dict.get('timestamp',0)
+ ", price : " + str(data_trade_dict.get('price',0))
+ ", size : " + str(data_trade_dict.get('size',0))
);
##### main exec
my_loop = asyncio.get_event_loop();
my_loop.run_until_complete(my_loop_WebSocket_bybit()); # loop for connect to WebSocket and receive data.
my_loop.close();

 

 

웹소켓 서버 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

최종 수정 : 2024.09.08

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

 


 

 

 



비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5