こんにちは、mabuiです。
Bitflyerのapiを使用してシストレを行う場合、一番早く取引処理をするために
使用するのがrealtime apiですが、その中でこれまで使用していた
PubNubが廃止を検討中のステータスに変わってしまったため、
新しく登場したSocket.IOとJSON-RPCのうち、
JSON-RPCを使用してみたいと思います。
ビットコイン取引所【bitFlyer Lightning】
上記ドキュメントを参考に、直前取引の約定金額・数量の
簡単な出力処理を行いました。
ソースコード
json_rpc_test.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# pip install websocket-client import websocket import json import pandas as pd CHANNEL = "lightning_executions_FX_BTC_JPY" def on_message(ws, message): message = json.loads(message) if message["method"] == "channelMessage": # print("{} {}".format(message["params"] # ["channel"], message["params"]["message"])) params_message = message["params"]["message"] df = pd.DataFrame(params_message) # 直前の約定金額 price = int(df.ix[[len(df) - 1], ["price"]].values.flatten()) # 直前の約定数量 size = float(df.ix[[len(df) - 1], ["size"]].values.flatten()) print("price:{} size:{}".format(price, 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() |
on_messageメソッド内でチャンネルから流れてくる情報(message)を整形して
出力しています。
messageをそのままprintで出力すると下記のようなjson形式になります。
1 |
{'jsonrpc': '2.0', 'method': 'channelMessage', 'params': {'channel': 'lightning_executions_FX_BTC_JPY', 'message': [{'id': 226240171, 'side': 'BUY', 'price': 944540, 'size': 0.2, 'exec_date': '2018-05-16T06:30:57.8664145Z', 'buy_child_order_acceptance_id': 'JRF20180516-153100-131886', 'sell_child_order_acceptance_id': 'JRF20180516-063057-303234'}, {'id': 226240172, 'side': 'BUY', 'price': 944542, 'size': 0.01, 'exec_date': '2018-05-16T06:30:57.8664145Z', 'buy_child_order_acceptance_id': 'JRF20180516-153100-131886', 'sell_child_order_acceptance_id': 'JRF20180516-153057-032357'}, {'id': 226240173, 'side': 'BUY', 'price': 944550, 'size': 0.79, 'exec_date': '2018-05-16T06:30:57.8664145Z', 'buy_child_order_acceptance_id': 'JRF20180516-153100-131886', 'sell_child_order_acceptance_id': 'JRF20180516-153050-708230'}]}} |
そこからparams、messageをキーに値を取得(message["params"]["message"])
すると、リスト形式で帰ってきますのでpandasのDataFrameに突っ込んで整形しやすくしています。
実行時の出力イメージは下記のようになります。
1 2 3 4 5 6 7 |
% python json_rpc_test.py [16:24:03] price:944320 size:0.0142 price:944309 size:0.20735 price:944317 size:0.133 price:944302 size:0.00937987 price:944319 size:0.09535 |