websocket深堀り4回シリーズ-4 クラスのwebsocketでビットフライヤーとバイナンスのデータを同時に受信する

websocket深堀り4回シリーズ

  1. そもそもwebsocketとは
  2. ビットコインのデータをwebsoketで受信 → クラス化
  3. websocket受信クラス → threadingでマルチタスク化
  4. websocketクラスをマルチタスクでビットフライヤーとバイナンスの同時受信

高速受信のwebsoketを複数取引所でマルチタスク

複数の取引所のデータを同時受信しながら取引のための準備データ受信編1

ビットコインの価格情報受信をwebsocketでストリーリミング受信する

それをクラス化して使いやすくする

それをマルチスレッド化してマルチタスクの準備をする

ビットフライヤーを料理する

バイナンスを料理する

両方を盛り付ける

pyscrypter4.0で実行

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は試してないです

コメント

タイトルとURLをコピーしました