Last active
August 10, 2020 10:20
-
-
Save MtkN1/6fbdf8e6629e52b36bb3b72ecaea2ebc to your computer and use it in GitHub Desktop.
Try PyBybit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# pybybitのインポート | |
import pybybit | |
# (当説明スクリプト上で使うインポート) | |
from pprint import pp | |
import time | |
# API情報を入力 | |
apis = [ | |
'YOUER_API_KEY', | |
'YOUER_API_SECRET' | |
] | |
# APIクラスを生成 | |
# :testnet: | |
# テスト環境に接続するか指定 | |
# Trueの場合はテスト環境に接続されます。 | |
# Falseまたは省略した場合は本番環境に接続にされます。 | |
# ※本番環境(www.bybit.com)とテスト環境(testnet.bybit.com)のアカウント及びAPIキーは別々です! | |
bybit = pybybit.API(*apis, testnet=True) | |
# データストアクラスを生成 | |
# pybybit付属のデータストアクラスを生成します。 | |
# ※データストアとは | |
# APIで取得したデータを格納しておくデータクラスのこと。 | |
store = pybybit.DefaultDataStore() | |
# コールバック関数を追加 | |
# 各APIからデータ受信時にデータを受け取るコールバック用関数を指定します。 | |
# サンプルでは付属データストアのコールバック用関数を指定しています。 | |
# DBに接続したい場合などは独自クラス・コールバック用関数を用意して使用してください。 | |
bybit.rest.add_callback(store.onresponse) | |
bybit.ws.add_callback(store.onmessage) | |
# データ初期化リクエスト | |
# [オーダー情報, ストップオーダー情報, ポジション情報, ウォレット残高] を取得します。 | |
# インバース契約とリニア契約それぞれ別のメソッドを使用します。 | |
# サンプルではコールバック用関数がデータ処理をするので戻り値を変数に格納していません。 | |
# :symbol: | |
# 対象のシンボルを指定 | |
bybit.rest.initialize_request_inverse(symbol='BTCUSD') | |
bybit.rest.initialize_request_linear(symbol='BTCUSDT') | |
# WebSocket API の使い方 | |
# 購読するトピックを指定してWebSocket APIに接続します。 | |
# 接続とデータ受信はバックグラウンドで行われます。 | |
# インバース契約、リニア契約(認証なし/あり)それぞれ別のメソッドを使用します。 | |
# ※説明の為存在する全てのトピック・シンボルを指定しています。 | |
bybit.ws.run_forever_inverse( | |
topics=[ | |
'orderBookL2_25.BTCUSD|ETHUSD|EOSUSD|XRPUSD', | |
'trade.BTCUSD|ETHUSD|EOSUSD|XRPUSD', | |
'insurance.BTC|ETH|EOS|XRP', | |
'instrument_info.100ms.BTCUSD|ETHUSD|EOSUSD|XRPUSD', | |
'klineV2.1.BTCUSD|ETHUSD|EOSUSD|XRPUSD', | |
'position', | |
'execution', | |
'order', | |
'stop_order', | |
]) | |
bybit.ws.run_forever_linear_public( | |
topics=[ | |
'orderBookL2_25.BTCUSDT', | |
'trade.BTCUSDT', | |
'instrument_info.100ms.BTCUSDT', | |
'candle.1.BTCUSDT', | |
]) | |
bybit.ws.run_forever_linear_private( | |
topics=[ | |
'position', | |
'execution', | |
'order', | |
'stop_order', | |
'wallet' | |
]) | |
# Optional | |
# WebSocket のデータ(板情報とシンボル情報)を受信するまで待機... | |
while not all((store.orderbook.getlist(), | |
store.instrument.getlist())): | |
time.sleep(1.0) | |
# REST API の使い方 | |
# APIエンドポイントごとに対応するメソッドを定義しています。 | |
# 出来る限り エンドポイント名 = メソッド名 となとるように命名されています。 | |
# またインバース契約とリニア契約ごとのクラスを定義しています。 | |
# 各メソッドで取得できるデータやパラメーター(引数)などについては | |
# Bybit 公式 API ドキュメントを参照し理解の上使用してください。 | |
# https://bybit-exchange.github.io/docs/inverse | |
# https://bybit-exchange.github.io/docs/linear | |
# インバース契約 パブリックAPI | |
bybit.rest.inverse.public_announcement | |
bybit.rest.inverse.public_kline_list | |
bybit.rest.inverse.public_orderbook_l2 | |
bybit.rest.inverse.public_symbols | |
bybit.rest.inverse.public_tickers | |
bybit.rest.inverse.public_time | |
bybit.rest.inverse.public_tradingrecords | |
# インバース契約 プライベートAPI | |
bybit.rest.inverse.private_apikey | |
bybit.rest.inverse.private_changepositionmargin | |
bybit.rest.inverse.private_execution_list | |
bybit.rest.inverse.private_lcp | |
bybit.rest.inverse.private_leverage | |
bybit.rest.inverse.private_leverage_save | |
bybit.rest.inverse.private_order_cancel | |
bybit.rest.inverse.private_order_cancelall | |
bybit.rest.inverse.private_order_create | |
bybit.rest.inverse.private_order_list | |
bybit.rest.inverse.private_order_replace | |
bybit.rest.inverse.private_order_search | |
bybit.rest.inverse.private_position_list | |
bybit.rest.inverse.private_predictedfunding | |
bybit.rest.inverse.private_prevfunding | |
bybit.rest.inverse.private_prevfundingrate | |
bybit.rest.inverse.private_risklimit | |
bybit.rest.inverse.private_risklimit_list | |
bybit.rest.inverse.private_stoporder_cancel | |
bybit.rest.inverse.private_stoporder_cancelall | |
bybit.rest.inverse.private_stoporder_create | |
bybit.rest.inverse.private_stoporder_list | |
bybit.rest.inverse.private_stoporder_replace | |
bybit.rest.inverse.private_stoporder_search | |
bybit.rest.inverse.private_tradingstop | |
bybit.rest.inverse.private_wallet_balance | |
bybit.rest.inverse.private_wallet_fund_records | |
bybit.rest.inverse.private_wallet_withdraw_list | |
# リニア契約 パブリックAPI | |
bybit.rest.linear.public_announcement | |
bybit.rest.linear.public_kline | |
bybit.rest.linear.public_markpricekline | |
bybit.rest.linear.public_prevfundingrate | |
bybit.rest.linear.public_recenttradingrecords | |
bybit.rest.linear.public_risklimit | |
bybit.rest.linear.public_time | |
# リニア契約 プライベートAPI | |
bybit.rest.linear.private_addmargin | |
bybit.rest.linear.private_closedpnl_list | |
bybit.rest.linear.private_execution_list | |
bybit.rest.linear.private_order_cancel | |
bybit.rest.linear.private_order_cancelall | |
bybit.rest.linear.private_order_create | |
bybit.rest.linear.private_order_list | |
bybit.rest.linear.private_order_search | |
bybit.rest.linear.private_position_list | |
bybit.rest.linear.private_prevfunding | |
bybit.rest.linear.private_setautoaddmargin | |
bybit.rest.linear.private_setleverage | |
bybit.rest.linear.private_stoporder_cancel | |
bybit.rest.linear.private_stoporder_cancelall | |
bybit.rest.linear.private_stoporder_create | |
bybit.rest.linear.private_stoporder_list | |
bybit.rest.linear.private_stoporder_search | |
bybit.rest.linear.private_switchisolated | |
bybit.rest.linear.private_tradingstop | |
# 使用例 | |
# メソッドの戻り値は requests.Response クラスで返されます。 | |
# サンプルの場合は、 | |
# r.json() でデータの取得 | |
# r.status でHTTPステータスコードの確認 等ができます。 | |
# 詳しくはrequests モジュールのドキュメントを参照ください。 | |
# 日本語ドキュメント https://requests-docs-ja.readthedocs.io/en/latest/user/quickstart/#id3 | |
# 英語ドキュメント(詳細) https://requests.readthedocs.io/en/master/api/#requests.Response | |
# ※スクリプト上で実行されないよう関数にまとめています。 | |
def limitorder_sample(): | |
# インバース契約 BTCUSD 7000USD 10契約 PostOnly 買い で指値注文送信 | |
r = bybit.rest.inverse.private_order_create(side='Buy', symbol='BTCUSD', order_type='Limit', qty=10, price=7000, time_in_force='PostOnly') | |
pp(r.json()) | |
# リニア契約 BTCUSDT 7000USD 0.001枚 PostOnly 買い で指値注文送信 | |
r = bybit.rest.linear.private_order_create(side='Buy', symbol='BTCUSDT', order_type='Limit', qty=0.001, price=7000, time_in_force='PostOnly', reduce_only=False, close_on_trigger=False) | |
pp(r.json()) | |
def marketorder_sample(): | |
# インバース契約 BTCUSD 10契約 売り で成行注文送信 | |
r = bybit.rest.inverse.private_order_create(side='Sell', symbol='BTCUSD', order_type='Market', qty=10, time_in_force='GoodTillCancel') | |
pp(r.json()) | |
# リニア契約 BTCUSDT 7000USD 0.001枚 売り で成行注文送信 | |
r = bybit.rest.linear.private_order_create(side='Sell', symbol='BTCUSDT', order_type='Market', qty=0.001, time_in_force='GoodTillCancel', reduce_only=False, close_on_trigger=False) | |
pp(r.json()) | |
# 付属データストアの使い方 | |
# データストアを利用するには以下の2つを行う必要があります。(説明上部で実施済み) | |
# ・データ初期化リクエスト | |
# ・WebSokcet 接続 | |
# データストアは WebSocket 用トピックレベルにクラス化されています。 | |
# 板情報用メソッド | |
store.orderbook.getbest # 板のベスト値の辞書を取得(シンボル指定) | |
store.orderbook.getbook # 板のリストを取得(シンボル指定) | |
store.orderbook.getlist # 板のリストを取得(全量) | |
# トレードレコード用メソッド | |
store.trade.gettrade # トレードのリストを取得(シンボル指定) | |
store.trade.getlist # トレードのリストを取得(全量) | |
# 保険基金用メソッド | |
store.insurance.get # 保険基金の辞書を取得(通貨指定) | |
store.insurance.getlist # 保険基金のリストを取得(全量) | |
# シンボル情報用メソッド | |
store.instrument.get # シンボル情報の辞書を取得(シンボル指定) | |
store.instrument.getlist # シンボル情報のリストを取得(全量) | |
# ローソク足用メソッド | |
store.kline.get # ローソク足の辞書を取得(シンボル、時間指定) | |
store.kline.getlist # ローソク足のリストを取得(全量) | |
# ポジション用メソッド | |
store.position.get # インバース用、ポジションの辞書を取得(シンボル指定) | |
store.position.getboth # リニア用、ポジションの辞書を取得(シンボル指定) | |
store.position.getlist # ポジションのリストを取得(全量) | |
# 約定履歴用メソッド | |
store.execution.getexecutions # 約定履歴のリストを取得(シンボル指定) | |
store.execution.getlist # 約定履歴のリストを取得(全量) | |
# オーダー情報用メソッド | |
store.order.get # オーダー情報の辞書を取得(シンボル、オーダーID指定) | |
store.order.getactive # 未約定のオーダー情報のリストを取得(シンボル指定) | |
store.order.getlist # オーダー情報のリストを取得(全量) | |
# ストップオーダー情報用メソッド | |
store.stoporder.get # ストップオーダー情報の辞書を取得(シンボル、オーダーID指定) | |
store.stoporder.getactive # 未トリガーのストップオーダー情報のリストを取得(シンボル指定) | |
store.stoporder.getlist # ストップオーダー情報のリストを取得(全量) | |
# 残高情報用メソッド | |
store.wallet.get # ウォレット残高の辞書を取得 | |
# コールバック関数について | |
# 独自のコールバック関数を実装する場合は以下の引数を定義してください。 | |
# REST API用 | |
""" | |
def rest_api_callback(resp, session): | |
resp: requests.Response | |
session: requests.Session | |
""" | |
# WebSocket API用 | |
""" | |
def websocket_api_callback(msg, ws): | |
msg: str | |
ws: websocket.WebSocket | |
""" | |
# Note | |
# Bybitの仕様の話 | |
# | |
# ①残高情報は別々に存在します... | |
# リニア契約の残高(USDT) → wallet | |
# インバース契約の残高(BTC,ETH,XRP,EOS) → position | |
# | |
# ②時々「数値文字列」が存在します... | |
# 板情報の {'price': '8000.5'} など、文字列になってる数字が存在します。 | |
# 基本的(※)に手当していないので計算する場合は注意してください。 ※ orderbook.getbest は計算の為変換済み | |
# データ形式の確認は pprint モジュールの pp メソッドが便利(スクリプト上でインポートしている) | |
# おまけ | |
# REST API のURLとリクエスト結果をprintしてくれるデバッグ用簡易コールバックです。 | |
# 注文のエラーレスポンスなどがよく分かります(初めて使う場合おすすめ) | |
""" | |
bybit.rest.add_callback(lambda resp, session: print(resp.request.path_url, resp.json(), '', sep='\n')) | |
""" | |
# WebSocket API 用(トピックによっては大量に出力されるので気を付けてください) | |
"""" | |
bybit.ws.add_callback(lambda msg, ws: print(msg)) | |
""" | |
# pybybit を試す場合はこのスクリプトをダウンロードして | |
# Pythonインタラクティブモードから始めると便利です! | |
""" | |
> python3 -i try_pybybit.py | |
""" | |
""" | |
説明は以上です🙂 | |
不具合や質問等がありましたら連絡してください↓ | |
https://twitter.com/MtkN1XBt | |
""" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment