Skip to content
This repository was archived by the owner on Dec 19, 2022. It is now read-only.

DataStore

MtkN1 edited this page Apr 22, 2021 · 3 revisions

DataStore Class

[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_25
orderBook_200
store.orderbook getbest
getsorted
トレード trade store.trade
保険基金 insurance store.insurance
ティッカー insurance_info store.instrument
ローソク足 klineV2
candle
store.kline
ポジション(インバース) position store.position.inverse getone
getboth
ポジション(リニア) position store.position.linear getboth
約定履歴 execution store.execution
アクティブ注文 order store.order
アクティブ注文(条件付き) stop_order store.stoporder
残高 position
wallet
store.wallet

各データモデルではgetgetlistメソッドでデータを検索・取得できます。一先ず引数なしでgetlist()を表示してみると、全件データがみれて把握し易いでしょう。

格納されているデータ形式については、WSトピック名を元に Bybit API Docs - WebSocket Data を参照してください。

またいくつかのデータモデルでは専用メソッドがあり、扱いやすい形式のデータを取得できます。

補足

  • ポジションはインバース契約とリニア契約で仕様が異なる為、それぞれさらにサブクラスに分かれています。
  • 注文はアクティブな情報のみ保持します。約定済み、キャンセル済みの注文は自動的に削除されます。
  • インバース契約は残高がpositionトピックの一部で、リニア契約は残高がwalletトピックで配信される仕様となっており、それらをまとめたデータがstore.walletになっています。

共通メソッド

get(**kwargs)

getメソッドではキーワード引数を指定して、単一の辞書形式のデータを取得することができます。

  • キーワード引数にデータモデルの内部キーを指定する場合
    • 一致するキーの辞書を返します
    • 一致するキーが存在しない場合は、Noneを返します。
  • キーワード引数にデータモデルの内部キーに満たない値を指定する場合
    • データを走査し最初に一致する辞書を返します
    • 一致する辞書がない場合は、Noneを返します
  • キーワード引数を1つも指定しない場合
    • データの最初の辞書を返します
    • データが1つもない場合は、Noneを返します

データモデルの内部キーは _KEYS メンバで参照できます。

# BTCUSD のティッカーを取得
print(store.instrument.get(symbol='BTCUSD'))

# ティッカー(instrument)の内部キーを表示
print(store.instrument._KEYS)

getlist(**kwargs)

getlistメソッドではキーワード引数を指定して、辞書のリスト形式のデータを取得することができます。

  • キーワード引数を指定する場合
    • データを走査し一致する全ての辞書をリストで返します
    • 一致する辞書がない場合は、空のリストを返します
  • キーワード引数を1つも指定しない場合
    • 全てのデータをリストで返します
    • データが1つもない場合は、空のリストを返します
# BTCUSD の全てのアクティブ注文を取得
print(store.order.getlist(symbol='BTCUSD'))

専用メソッド

板情報 ベスト値 store.orderbook.getbest

引数symbolを指定して、板のベスト値を以下形式で取得できます。

print(store.orderbook.getbest(symbol='BTCUSD'))
"""
{
    'Sell': {'symbol': 'BTCUSD', price: 10000.5, ...},
    'Buy': {'symbol': 'BTCUSD', price: 10000.0, ...}
}
"""

板情報 価格ソート store.orderbook.getsorted

引数symbolを指定して、板情報を価格でソートされた結果を以下形式で取得できます。

print(store.orderbook.getbest(symbol='BTCUSD'))
"""
{
    'Sell': [{..., price: 10000.5, ...}, ..., price: 10001.0, ...}, ...], # 価格昇順
    'Buy': [{..., price: 10000.0, ...}, {..., price: 9999.5, ...}, ...] # 価格降順
}
"""

ポジション One-Way store.position.inverse.getone

引数symbolを指定して、One-Wayモードのポジション(単一の辞書形式)を取得できます。データが存在しない場合は、Noneを返します。

対象はインバース無期限、インバース先物のOne-Wayモード設定時のポジションです。

print(store.position.inverse.getone(symbol='BTCUSD'))
"""
{'symbol': 'BTCUSD', 'side': 'Buy', ...}
"""

ポジション Hedge store.position.{inverse,linear}.getboth

引数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()