見出し画像

[python] bybit WebSocketクラス&Discord状態通知bot

bybitのWebSocketに接続し、データ取得&管理を行う「BybitWS」クラスを公開しました。
このクラスはOneさんの[Python]Bybit websocketをベースとして購読するチャンネルの追加やデータ受信をトリガーとしたコールバックなどを拡張したものになります。(Oneさんに感謝!)

BybitWSクラスのコンストラクタで各種設定を行うだけでWebSocket接続からデータ受信、格納、コールバックまで行います。
詳細な解説はGitHubのREADMEを参照ください。

なお、クラスの構造や機能に興味はなく、Discord状態通知botを手っ取り早く使いたい方は4. Discord状態通知botを参照ください。

全て無料パートで公開していますので、購入しなくても全編閲覧可能です。
もし、有益と感じて投げ銭してくださる方は購入して頂けると嬉しいです。

【免責事項】
当noteやプログラムコードの利用により被る損失や被害について、筆者は一切の責任を負うことはできません。
その他、noteご利用規約の「禁止事項」に準拠します。
https://note.mu/terms


以下は概要になります。

1. 購読チャンネルリストを作成

受信したいチャンネルをリストにします。
(省略した場合、以下のdefaultチャンネルが購読されます。)

channel_list = [
   'trade.' + symbol,
   'instrument_info.100ms.' + symbol,
   'orderBook_200.100ms.' + symbol,
   'klineV2.' + period + '.' + symbol,
   'position',
   'execution',
   'order',
]


​2. コールバック関数dictを作成

各チャンネルのデータ受信をトリガーとして呼び出される関数を設定します。
dictのkeyチャンネルを示すtopic, valueコールバック関数を指定します。
(dictに未設定またはvalueがNoneのチャンネルはコールバックされません。)

callback = {
   'trade'     : None,               # Noneはコールバックなし
   'instrument': None,               # Noneはコールバックなし
   'ohlcv'     : callback_ohlcv,     # ohlcv受信でcallback_ohlcv関数を呼び出し
   'position'  : callback_position,  # position受信でcallback_position関数を呼び出し
   'execution' : callback_execution, # execution受信でcallback_execution関数を呼び出し
   'order'     : callback_order,     # order受信でcallback_order関数を呼び出し
}

なお、ここで設定しているコールバック関数は引数にBybitWSインスタンス, 受信データを設定してください。
以下はexecution受信時のコールバック関数例です。
受信データから約定情報文字列を作成して出力しています。

#-------------------------------------------------------------------------------
# ex) 自注文の約定データ受信時に呼び出される関数
#-------------------------------------------------------------------------------
# [@param]
#     ws           BybitWSインスタンス
#     data         受信data
# [return]
#-------------------------------------------------------------------------------
def callback_execution(ws:BybitWS, data:dict):
   msg = f'[execution]\n'
   for o in data:
       price = float(o['price'])
       qty = int(o['exec_qty'])
       odr = int(o['order_qty'])
       lvs = int(o['leaves_qty'])
       fee = float(o['exec_fee'])
       msg += f"  Type   : {o['exec_type']}\n"
       msg += f"  Side   : {o['side']}\n"
       msg += f"  Price  : {price:.1f}\n"
       msg += f"  Qty    : {qty} ({odr-lvs} / {odr})\n"
       msg += f"  Fee    : {fee:.8f}\n"
       msg += f"  Time   : {o['trade_time']}\n"
       msg += '\n'
   print(msg)


3. BybitWSインスタンスを生成

API情報, 接続先, 通貨ペア, 購読するチャンネルリスト, コールバック関数dictを指定してインスタンスを生成します。

# Bybit WebSocketインスタンス生成
bybit_ws = BybitWS('API_KEY', 'API_SECRET', is_testnet=False, symbol='BTCUSD', channel=channel_list, callback=callback)

インスタンスを生成するとWebSocket接続を行い、受信データはdataに格納されます。
必要に応じて参照してください。

# 受信データ格納dict
data = {
   'connection':False,
   'last_price':0,
   'timestamp':{},
   'ohlcv':deque(maxlen=1000),
   'execution':deque(maxlen=200),
   'instrument':{},
   'board_snapshot':{
           'asks':[],
           'bids':[]
           },
   'position':{},
   'my_execution':deque(maxlen=50),
   'my_order':deque(maxlen=50),
   'my_open_order':{},
}

WebSocketが切断されてもpythonスクリプトを停止するまで自動で再接続を行います。

コールバックの使用有無は自由ですので不要であれば未設定でOKです。
WebSocketのデータ受信はメイン処理とは別スレッドで行われます。
コールバックを応用することでメインループとは異なるイベント稼働な処理を行うこともできます。
 ・注文が約定したら〇〇する
 ・スプレッドが〇〇以上になったら△△する
 ・指値が〇〇乖離したら調整する
etc.
興味やアイデアがあれば、本クラスのコールバック以外にも独自のトリガーで呼び出されるコールバックを実装してみてください。


4. Discord状態通知bot

BybitWSを使ったDiscord状態通知botはGitHubのSample内にある「bybit_ws_notify.py」の1ファイル完結botです。
以下の初期設定を行い、pythonスクリプトを実行することで通知が開始されます。

4.1. 初期設定

本ツールの動作環境はPython3.6以降となります。
もしない場合は、以下を参考にPython3.6以降の環境構築を行ってください。
(参考までに筆者の本ツール開発環境はPython3.8.1となります。)

python 開発環境構築手順(Windows)
python 開発環境構築手順(Mac)
python 開発環境構築手順(AWS)

4.2. GitHubからファイル取得

コンソールにてgit cloneでファイルを取得します。

git clone https://github.com/nagishin/BybitWebSocket.git

4.3. 必要なパッケージをインストール

コンソールにて作成された「BybitWebSocket」ディレクトリに移動し、以下のコマンドで一括インストールします。
(必要なパッケージはrequirements.txtを参照してください。)

cd BybitWebSocket
pip install -U -r requirements.txt

4.4. 設定パラメータを入力

bybit_ws_notify.py」を開き、スクリプト冒頭の設定パラメータに必要な情報を入力します。

#===============================================================================
# 設定パラメータ
#===============================================================================
# Discord送信
DISCORD_NOTIFY      = False   # True:送信する, False:送信しない
DISCORD_WEBHOOK_URL = ''

# bybit設定
BYBIT_API_KEY    = ''
BYBIT_API_SECRET = ''
BYBIT_IS_TESTNET = False      # True:testnet, False:real
BYBIT_SYMBOL     = 'BTCUSD'   # 通貨ペア

# 通知設定
BYBIT_ORDER_NOTIFY     = True # 注文に変更があると通知
BYBIT_EXECUTION_NOTIFY = True # 注文が約定すると通知
BYBIT_POSITION_NOTIFY  = True # ポジションや残高に変更があると通知
BYBIT_OHLCV_NOTIFY     = True # OHLCVに変更があると通知
BYBIT_PERIOD           = '1'  # ohlcv時間足 (1 3 5 15 30 60 120 240 360 D W M)
#===============================================================================

Discord通知のWebHook URLが分からない場合は以下を参照ください。Discord Webhook URLの発行

4.5. Discord状態通知bot起動

コンソールにて「Sample」ディレクトリに移動し、「bybit_ws_notify.py」を実行します。

cd Sample
python bybit_ws_notify.py

以下はDiscord通知情報のキャプチャ画像サンプルです。
各チャンネルのデータ受信とほぼ同時にリアルタイムに通知が送信されます。

画像1

画像2


〈おわりに〉
最後までお読みいただき、ありがとうございました。

本ツールや解説記事などが、「参考になった」「有益だった」と感じて頂けましたら、サポートやスキ、コメントなど頂けるとうれしいです。

BTCでのサポートも歓迎しております。
どんなに少額でもとても励みになりますので、よろしければお願いします。
17N6P9eGs5Y2nyeZJxNzefKxMwKWwZZkkF

今後も役に立つツールや有益な解説記事などを提供していきたいと考えておりますので、興味があればチェックして頂けると幸いです。


ここから先は

0字

¥ 500

この記事が気に入ったらサポートをしてみませんか?