본문 바로가기
IT - 코딩/유용한 코드

바이낸스 가격데이터 websoket으로 받기 with node.js python

by 조기정 2022. 11. 27.
const WebSocket = require('ws');
const pd = require("node-pandas");
var symbol_list = ['btcusdt',"xrpusdt"]
var dic_list = []

for (var i = 0 ; i < symbol_list.length; i++) {
    dic_list[i] = {'symbol':symbol_list[i].toLocaleUpperCase(), 'TIME':NaN, 'bid_p':NaN, 'bid_q':NaN,'ask_p':NaN,'ask_q':NaN}
}

var url_bin  = "wss://stream.binance.com:9443/ws"

for (var i = 0 ; i < symbol_list.length; i++){
    url_bin = url_bin + "/"+symbol_list[i] +"@bookTicker"
}

let socket = new WebSocket(url_bin);
var dic = {} 

socket.onmessage = function(event){

    var data_1 = JSON.parse(event.data);
    for (var i = 0 ; i < dic_list.length; i++){
        if (dic_list[i]['symbol'] == data_1["s"]){ //심볼명이 같다면.
            dic_list[i]["TIME"] = data_1["u"];
            dic_list[i]["bid_p"] = data_1["b"];
            dic_list[i]["bid_q"] = data_1["B"];
            dic_list[i]["ask_p"] = data_1["a"];
            dic_list[i]["ask_q"] = data_1["A"];
        }
    }
    pd.DataFrame(dic_list).toCsv("E:/ATZ/price_data.csv",index = false);
    console.log(dic_list);
};
# 모든 심볼 (개별 지정 )티커 스트림.
# 심볼 한개 깊이 를 준 호가창. 심볼명이 없네.
import websocket, json
import pandas as pd
from IPython.display import display, clear_output
url = f'wss://stream.binance.com:9443/ws'

symbol_list = ['btcusdt',"xrpusdt"]


###########
dic_list = [{'symbol':symbol_list[i].upper(), 'TIME':None, 
             'bid_p':None, 'bid_q':None,'ask_p':None,'ask_q':None}
            for i in range(len(symbol_list))]
###########
for i in range(len(symbol_list)):
    url = url + f'/{symbol_list[i]}@bookTicker'
    
def on_message(ws, message):
    data = json.loads(message)
#     print(data)
#     dic = {
#     "symbol": data["s"],
#     "TIME": data["E"],
#     "bid_p": data["b"][0][0],
#     "bid_q": data["b"][0][1],
#     "ask_p": data["a"][0][0],
#     "ask_q": data["a"][0][1]
#     }
    ###############
    for i in range(len(dic_list)):
        if dic_list[i]['symbol'] == data["s"]:
            dic_list[i]['TIME'] = data["u"]
            dic_list[i]["bid_p"] = data["b"]
            dic_list[i]["bid_q"] = data["B"]
            dic_list[i]["ask_p"] = data["a"]
            dic_list[i]["ask_q"] = data["A"]
    ##

    pd.DataFrame(dic_list).to_csv("price_data.csv",index = False)
    
    statuses = (dic_list)
    if (len(statuses) != 0):
        clear_output(wait=True)
        display(statuses)
    ################
        
        
def on_close(ws):
    print("close")
    
ws = websocket.WebSocketApp(url, on_message=on_message, on_close=on_close)
ws.run_forever()
# 심볼명 받을 갯수에 따라서 딕셔너리를 만들어 데이터 프레임으로 바로 계속 저장하는 형식.

booktiker로 원하는 심볼명 소문자로 추가만 하면 100ms마다  orderbook(호가창 상단)값의 데이터를 가공해서 csv에 저장한다.