-
Notifications
You must be signed in to change notification settings - Fork 10
DataStore
[WIP] データストアは暫定的な実装を含んでいる為、今後も仕様変更を行う可能性があります
データストアは主にWebSocket APIから受信したデータを処理して格納するクラスです。 データストアはWebSocket APIを利用する際、有用性を発揮します。
REST APIのみ利用する低頻度なbotの場合は、データストアを利用する必要性は低いです。 板やボリューム、自らの注文やポジションを頻繁に参照する高頻度なbotの場合は、REST APIの利用回数を削減しローカルに溜め込んだ情報を参照できるデータストアを利用した方が良いでしょう。
まずはインスタンスを生成します。
store = pybybit.DataStore()RESTとWebSocketのコールバックに関数を追加します。
client.rest.add_callback(store.onresponse)
client.ws.add_callback(store.onmessage)初期化リクエストを行い、WebSocketに接続します。 その後は自動的に受信データがデータストアに格納されます。
client.initialize_request_inverse(symbol='BTCUSD')
client.ws.run_forever_inverse(topics=[
'position', 'execution', 'order', 'stop_order',
])※初期化リクエストは、BybitのWebSocketでは注文・ポジション・残高の初期情報がない為REST APIで代用する為に行います。リニアの場合はinitialize_request_linear、インバース先物の場合はinitialize_request_futures。
データストアクラスには以下データモデルがあります。
| 名称 | WSトピック名 | メンバ名 | 専用メソッド |
|---|---|---|---|
| 板情報 |
orderBookL2_25orderBook_200
|
store.orderbook |
getbestgetsorted
|
| トレード | trade |
store.trade |
|
| 保険基金 | insurance |
store.insurance |
|
| ティッカー | insurance_info |
store.instrument |
|
| ローソク足 |
klineV2candle
|
store.kline |
|
| ポジション(インバース) | position |
store.position.inverse |
getonegetboth
|
| ポジション(リニア) | position |
store.position.linear |
getboth |
| 約定履歴 | execution |
store.execution |
|
| アクティブ注文 | order |
store.order |
|
| アクティブ注文(条件付き) | stop_order |
store.stoporder |
|
| 残高 |
positionwallet
|
store.wallet |
各データモデルではget、getlistメソッドでデータを検索・取得できます。一先ず引数なしでgetlist()を表示してみると、全件データがみれて把握し易いでしょう。
格納されているデータ形式については、WSトピック名を元に Bybit API Docs - WebSocket Data を参照してください。
またいくつかのデータモデルでは専用メソッドがあり、扱いやすい形式のデータを取得できます。
補足
- ポジションはインバース契約とリニア契約で仕様が異なる為、それぞれさらにサブクラスに分かれています。
- 注文はアクティブな情報のみ保持します。約定済み、キャンセル済みの注文は自動的に削除されます。
- インバース契約は残高が
positionトピックの一部で、リニア契約は残高がwalletトピックで配信される仕様となっており、それらをまとめたデータがstore.walletになっています。
getメソッドではキーワード引数を指定して、単一の辞書形式のデータを取得することができます。
- キーワード引数にデータモデルの内部キーを指定する場合
- 一致するキーの辞書を返します
- 一致するキーが存在しない場合は、
Noneを返します。
- キーワード引数にデータモデルの内部キーに満たない値を指定する場合
- データを走査し最初に一致する辞書を返します
- 一致する辞書がない場合は、
Noneを返します
- キーワード引数を1つも指定しない場合
- データの最初の辞書を返します
- データが1つもない場合は、
Noneを返します
データモデルの内部キーは _KEYS メンバで参照できます。
# BTCUSD のティッカーを取得
print(store.instrument.get(symbol='BTCUSD'))
# ティッカー(instrument)の内部キーを表示
print(store.instrument._KEYS)getlistメソッドではキーワード引数を指定して、辞書のリスト形式のデータを取得することができます。
- キーワード引数を指定する場合
- データを走査し一致する全ての辞書をリストで返します
- 一致する辞書がない場合は、空のリストを返します
- キーワード引数を1つも指定しない場合
- 全てのデータをリストで返します
- データが1つもない場合は、空のリストを返します
# BTCUSD の全てのアクティブ注文を取得
print(store.order.getlist(symbol='BTCUSD'))引数symbolを指定して、板のベスト値を以下形式で取得できます。
print(store.orderbook.getbest(symbol='BTCUSD'))
"""
{
'Sell': {'symbol': 'BTCUSD', price: 10000.5, ...},
'Buy': {'symbol': 'BTCUSD', price: 10000.0, ...}
}
"""引数symbolを指定して、板情報を価格でソートされた結果を以下形式で取得できます。
print(store.orderbook.getbest(symbol='BTCUSD'))
"""
{
'Sell': [{..., price: 10000.5, ...}, ..., price: 10001.0, ...}, ...], # 価格昇順
'Buy': [{..., price: 10000.0, ...}, {..., price: 9999.5, ...}, ...] # 価格降順
}
"""引数symbolを指定して、One-Wayモードのポジション(単一の辞書形式)を取得できます。データが存在しない場合は、Noneを返します。
対象はインバース無期限、インバース先物のOne-Wayモード設定時のポジションです。
print(store.position.inverse.getone(symbol='BTCUSD'))
"""
{'symbol': 'BTCUSD', 'side': 'Buy', ...}
"""引数symbolを指定して、Hedgeモードのポジション(辞書形式)を取得できます。データが存在しない場合は、中身はNoneを返します。
対象はリニア無期限、インバース先物のHedgeモード設定時のポジションです。
print(store.position.linear.getboth(symbol='BTCUSDT'))
"""
{
'Sell': {'symbol': 'BTCUSDT', 'side': 'Sell', ...},
'Buy': {'symbol': 'BTCUSDT', 'side': 'Buy', ...}
}
"""WebSocketは接続してからデータを受信するまでにいくらかの時間を要します。botで利用する際は、板情報などを受信してからロジックを開始したほうが良いでしょう。
store.wait() メソッドでWebSocketから何か情報が受信されるまで待機することができます。
こちらを利用することで、以下の例のように板情報とティッカーが受信されるまで待機することができます。
while any([
len(store.orderbook) == 0,
len(store.instrument) == 0,
]):
store.wait()また、wait() メソッドは各データモデル単位でも利用することができます。
while len(store.order) == 0:
store.order.wait()