websocketで約定を連続的に取得し続ける bitcoin bitflyer websocket.json-rpc API python

シンプルにWebsocketから最終約定を取得するコード全体



#pip install websocket-client
import websocket
import json

CHANNEL = "lightning_executions_BTC_JPY"

def on_message(ws, message):
    message = json.loads(message)
    if message["method"] == "channelMessage":
        last1=message["params"]["message"][0]
        #print(last1['price'])
        print('BTC {:,.0f} {:4} {:.2f}'.format(int(last1["price"]),last1["side"],last1["size"]))
        
def on_open(ws):
    ws.send(json.dumps({"method": "subscribe",
                        "params": {"channel": CHANNEL}}))

if __name__ == "__main__":
    # note: reconnection handling needed.
    ws = websocket.WebSocketApp("wss://ws.lightstream.bitflyer.com/json-rpc",
                                on_message=on_message, on_open=on_open)
    ws.run_forever()

BTC 6,595,245 BUY  0.00
BTC 6,595,246 BUY  0.10
BTC 6,593,205 SELL 0.03
BTC 6,594,743 BUY  0.00
BTC 6,595,874 SELL 0.00
BTC 6,594,743 SELL 0.00
BTC 6,594,608 BUY  0.05

各関数と変数を解説

基本的なWebSocket関数を作成する

WebSocket接続を維持するには、さまざまな目的に役立ついくつかの機能が必要です。この基本的なフレームから始めることができます。

def on_message(ws, message):
    pass  
def on_error(ws, error): 
    pass  
def on_close(ws): 
    pass  
def on_open(ws): 
    pass  
  • on_open() 接続が開いているときにタスクを実行する
  • on_message() サーバーから返送されたメッセージを処理する
  • on_error() エラーを処理する
  • on_close() 接続が閉じられたときに何が起こるかを判断する

main

main内でwsグローバルオブジェクトを作成します。このオブジェクトwsに、新しいWebSocketインスタンスを割り当て、そのパラメーターを設定し、他の関数とリンクして、正しく実行できるようにします。全体として、関数には以下に示すコードが含まれています。

if __name__ == "__main__":
    # note: reconnection handling needed.
    ws = websocket.WebSocketApp("wss://ws.lightstream.bitflyer.com/json-rpc",
                                on_message=on_message, on_open=on_open)
    ws.run_forever()
  • WebSocketインスタンス(サーバーアドレスパラメーターを使用)ws = websocket.WebSocketApp("wss://ws.lightstream.bitflyer.com/json-rpc",は作成され、他の関数は適切なパラメーター(on_message … etc)にリンクされます。
  • ws.run_forever() 接続を開始します

on_open()

接続が開かれると、関数on_openが呼び出されます。これは、接続が正常に開かれたことを示すステートメントを印刷するのに適した場所です。また、認証とチャネルへのサブスクリプションを処理する場所でもあります(これらは、サーバーからデータを受信するための方法です)。

    ws.send(json.dumps({"method": "subscribe",
                        "params": {"channel": CHANNEL}}))
  • 生成されたすべての入力を使用して、辞書を作成し、JSONとして送信します

error()で

この関数を使用して、WebSocketセッション中に発生するエラーを処理できます。簡単にするために、エラーを出力するprintステートメントを配置します。

def on_error(ws, error): 
print(error)

on_close()

この関数を使用して、接続が閉じたときに何が起こるかを判別します。ここでは、簡単にするために、printステートメントでユーザーに通知してから、スクリプトを終了します。

def on_close(ws): 
print("### API connection closed ###") os._exit(0)

on_message()

WebSocket接続が開かれるとすぐに、メッセージを送受信できます。このスクリプトでは、最初に受信する必要のあるメッセージは、サーバーに送信した認証要求から、認証ステータス(成功または失敗)を通知するメッセージになります。

これを処理し、成功したかどうかを判断するためのコードが必要です。この関数は、サブスクライブするデータチャネルの詳細、およびそれらのチャネルが提供するデータを含むメッセージも受信します。すべてがこの関数によって処理されます。関数全体のコードを以下に示します。ここでは、そのコンポーネントを分解します。

def on_message(ws, message):
    message = json.loads(message)
    if message["method"] == "channelMessage":
        last1=message["params"]["message"][0]
        #print(last1['price'])
        print('BTC {:,.0f} {:4} {:.2f}'.format(int(last1["price"]),last1["side"],last1["size"]))

上記のコードは、上記で定義したグローバル変数チャネルティッカーを宣言しています。ifステートメントの組み合わせにより成功した認証シナリオが除外され、正常にサブスクライブされたチャネルがキャプチャされ、チャネル変数に保存されます。

コメント

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