Skip to content

Instantly share code, notes, and snippets.

@MtkN1
Last active August 10, 2020 10:20
Show Gist options
  • Save MtkN1/6fbdf8e6629e52b36bb3b72ecaea2ebc to your computer and use it in GitHub Desktop.
Save MtkN1/6fbdf8e6629e52b36bb3b72ecaea2ebc to your computer and use it in GitHub Desktop.
Try PyBybit
# 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