websocket深堀り4回シリーズ
- そもそもwebsocketとは
- ビットコインのデータをwebsoketで受信 → クラス化
- websocket受信クラス → threadingでマルチタスク化
- websocketクラスをマルチタスクでビットフライヤーとバイナンスの同時受信
高速受信のwebsoketを複数取引所でマルチタスク
複数の取引所のデータを同時受信しながら取引のための準備データ受信編1
ビットコインの価格情報受信をwebsocketでストリーリミング受信する
それをクラス化して使いやすくする
それをマルチスレッド化してマルチタスクの準備をする
ビットフライヤーを料理する
バイナンスを料理する
両方を盛り付ける
bitflyerのデータ(前後に空行有り)がほとんど流れてこない。悲しいほど過疎。
Binance&Bitflyer receive websocket ソースコード
#pip install websocket-client
from datetime import datetime
import json
from threading import Thread
import websocket
#バイナンスwebsocket受信クラス
class BinanceWebSocket(Thread):
def __init__(self):
Thread.__init__(self)#コレしないと怒られるが?
self.URL = 'wss://stream.binance.com:9443/ws'
self.CHANNEL = "btcusdt@trade"#約定データ
#self.CHANNEL = "btcusdt@ticker" #ティッカーらしい
#self.CHANNEL = "!miniTicker@arr" # All Market Mini Tickers Stream
def run(self):
# note: reconnection handling needed.
ws = websocket.WebSocketApp(self.URL, on_message=self.on_message, on_open=self.on_open)
ws.run_forever()
def on_message(self,ws, msg):
'''
https://qiita.com/penta2019/items/b50bab59c72ace2722f4
Author: penta #データ処理を参考にしたページ
'''
msg = json.loads(msg)
if msg['e'] == 'trade' and msg['M']:
ts = datetime.fromtimestamp(msg['T']/1000).strftime("%Y-%m-%d %H:%M")
price = float(msg['p'])
size = float(msg['q'])
if msg['m']:
side ='SELL'#*= -1
else :
side='BUY'
print(f'binance_BTC {ts} {price} {side} {size}')
def on_open(self,ws):
ws.send(json.dumps({"method": "SUBSCRIBE","params":[self.CHANNEL,"btcusdt@depth"],"id": 1}))
#ビットフライヤーのwebsocket受信のクラス
class BfWebSocket(Thread):
def __init__(self):
Thread.__init__(self)
self.CHANNEL = "lightning_executions_BTC_JPY"
self.url = "wss://ws.lightstream.bitflyer.com/json-rpc"
def run(self):
# note: reconnection handling needed.
ws = websocket.WebSocketApp(self.url, on_message=self.on_message, on_open=self.on_open)
ws.run_forever()
def on_message(self,ws, message):
self.message = json.loads(message)
if self.message["method"] == "channelMessage":
self.last1=self.message["params"]["message"][0]
print(f'\nBitfler_BTC {self.last1["exec_date"][:19]} {int(self.last1["price"]):,.0f} {self.last1["side"]:4} {self.last1["size"]:.2f}\n')
def on_open(self,ws):
ws.send(json.dumps({"method": "subscribe",
"params": {"channel": self.CHANNEL}}))
#main クラスを呼んでstartするだけ
bnc = BinanceWebSocket()
BF = BfWebSocket()
bnc.start()
BF.start()
bnc.join()#ただの受信だと有っても無くても変わらない。
BF.join()
どうせコピペで動かす人もいないと思うので、ctrl+Cでストップしないのは黙っていよう。
いや、まずいな。
pyscrypterだとコレで止まる(ctrl+F2)
anaconda promptの場合は右上をバツするしかなかった。
VScodeやpycharmは試してないです
コメント