bybit WebSocketに接続してデータ取得&管理を行います.
pip install -U -r requirements.txt
コンストラクタ引数にAPI情報, 接続先, 通貨ペア, 購読するチャンネルリスト, チャンネル別のコールバック関数dictを指定してインスタンスを生成してください.
# Bybit WebSocketインスタンス生成
bybit_ws = BybitWS('API_KEY', 'API_SECRET', is_testnet=False, symbol='BTCUSD', channel=[], callback={})
購読するチャンネルリストには使用するチャンネルを指定してください.
(省略すると以下のdefaultチャンネルを購読します.)
channel_list = [
'trade.' + symbol,
'instrument_info.100ms.' + symbol,
'orderBook_200.100ms.' + symbol,
'klineV2.' + period + '.' + symbol,
'position',
'execution',
'order',
]
チャンネル別のコールバック関数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インスタンス, 受信データを設定してください.
#-------------------------------------------------------------------------------
# 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)
BybitWSインスタンスで受信したデータは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':{},
}
orderbookは更新頻度が高いため, 取得する場合はget_orderbooks関数を使用してください.
排他制御にて安全にデータ取得します.
#---------------------------------------------------------------------------
# orderbook取得
#---------------------------------------------------------------------------
def get_orderbooks(self):
with self.__lock:
bids = copy.copy(self.data['board_snapshot']['bids'])
asks = copy.copy(self.data['board_snapshot']['asks'])
return {'bids':bids, 'asks':asks}
bybit_ws_notify.pyの1ファイルで完結しています.
(シンプルに使用できるようBybitWSや必要なクラス, 設定情報をあえて1ファイルに含めています.)
pythonスクリプト内の冒頭にある設定パラメータに必要情報を設定して起動してください.
#===============================================================================
# 設定パラメータ
#===============================================================================
# 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)
#===============================================================================