見出し画像

BybitのPython自動取引用モジュール - PyBybit 2.0

更新履歴

2020/5/7 v2.0 オーバーホールし大幅に機能をアップデートしました!
※前バージョンとの互換はありません

最新API、リニア契約(BTCUSDT)に対応
データストアクラスを実装
2019/6/3 v1.0 初期バージョンリリース

こんにちは、まちゅけん(@MtkN1BXt)です。
Pythonで簡単にBybit APIを叩けるモジュールを作ってみました。
こちらはいわゆる仮想通貨界隈の「botter」な人向けの記事です。
技術的な意味を理解できる方のみ読み進めてください。

何ができるの?

・Bybit REST API への接続
・Bybit WebSocket API への接続
・API取得データを保管・利用できるデータストアクラス

もっと分かりやすく

フルマネージドを目指した自動取引モジュールです
リニア契約(BTCUSDT)対応、テスト環境(testnet)対応、WebSocket完備
汎用ライブラリの ccxt とは違い、Bybitが提供しているAPIを全て利用できます。
(注文送信・キャンセル、ポジション取得、残高参照、ファンディングレート取得、マーク価格取得...)
つまり、このモジュールをインストールすればBybitで自動取引する事が可能です。
使いにくい 公式APIサンプル とは違い、モジュール1つでリアルタイムデータ(WebSocket)の受信に対応してるのでマーケットメイキングbotのような高速取引も可能です。
さらに付属のデータストアクラスを利用すれば、板情報やオーダー、ポジションのデータなどを独自に加工する必要はありません。
板のベスト値を取得したり、アクティブオーダーの有無の確認を簡単に行うことができます。

動作環境

Python 3.8以上を推奨 (Python 3.8.2 Ubuntu 20.04上で開発・テスト)

インストール方法

githubリポジトリにソースコードを公開しています。
https://github.com/MtkN1/pybybit
gitが入っていれば下記コマンドでpip installできます。

pip install git+https://github.com/MtkN1/pybybit.git

使い方

サンプルコードです。
(マークダウン記法に慣れていないのでコメント付きコードを書きました)

公式APIドキュメント

各API呼び出しメソッドの命名は、各APIエンドポイント(URL)名と分かるように対応付けています。
BybitのAPI仕様をよく理解してから当モジュールを利用してください。
インバース契約
https://bybit-exchange.github.io/docs/inverse
リニア契約
https://bybit-exchange.github.io/docs/linear

タイムスタンプエラーについて

{'ret_code': 10002, 'ret_msg': 'invalid request, please check your timestamp and recv_window param. req_timestamp: 1588825438280 server_timestamp: 1588825436908 recv_window: 5000', 'ext_code': '', 'ext_info': '', 'result': None, 'time_now': '1588825436.908361'}

プライベート用REST API でこのようなエラーが発生する事があります。
これは「無効なリクエストです。タイムスタンプと有効時間を確認してください」と言っています。
コンピューターのローカル時刻の誤差がBybitのサーバー時刻と比べて以下の範囲に収まっている必要があります。(公式ドキュメント参照)
サーバー時刻-5秒 ≦ ローカル時刻 < サーバー時刻+1秒
つまり1秒以上未来にずれていたらアウトでエラーになって返ってきます。
お使いのコンピューターの時刻を調整する方法をググってみてください。

外部モジュール

PyBybitは requests websocket_client モジュールを利用しているので一部外部モジュールを理解する必要があります。
リクエスト結果には requests.Response クラスを返します。

余談

モジュールを作るにあたってBybit APIを探究しましたが、API設計がかなり中途半端です・・・。WebSocketの初期データが配信されない、しかしRESTとWebSocketでデータが統一されてない、さらにインバース契約/リニア契約それぞれでデータ型が違ったりハマりまくりました(マジです)。付属データストアはデータをPython型として保管できるように設計していますが、罠があるデータは罠のあるまま保管されますので注意してください。
その点、BitMEXのAPIは全て初期データを配信してくれるし、データ型の相違も全くなかったので非常に使いやすかったな~と思います。
BybitのAPIアップデートもリリース後多くあると思うのでメンテする気力がどこまで持つか😇

アーカイブ

v1.0 のソースとサンプルコード
https://gist.github.com/MtkN1/50923f4366c3390a1cf4310f77ea7440
https://gist.github.com/MtkN1/9eb91cbf306f10e2396177eaebfdf29f

おわり

モジュールの説明は以上です。
不具合を発見した場合はTwitterにリプかDMを下さい🙂
質問などもお気軽にどうぞ!
もしこのモジュールで儲かって良い気分になった方は、noteのサポートで投げて頂けると励みになります。

Bot関連の情報を発信しているのでフォローよろしくお願いします!


この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

82

この記事が入っているマガジン

仮想通貨
仮想通貨
  • 193本
コメント (3)
愛用しています

ところでこれはpybybitのエラーではなくサーバー側のエラー(だと思われる)のですが
POSTメソッドでboolの返り値が要求される項目(reduce_only等)でbool文を書くと'ret_code': 10004, 'ret_msg': 'error sign!とでてPOST出来ません。解決策はv1のほうのplace_active_orderで{'reduce_only':'true'}というふうに文字列の'true'を入力することです

ちなみにv2のplace_active_orderで実行すると丁寧にも型違いエラーが出力されます。しかし要求されるbool型(True等)を書いてもerror signが返ってきます。多分bybitRESTAPIがpythonのbool型を認識していないような気がします
不具合報告ありがとうございます!
本日新バージョンをリリースしましたが、認証ロジックにurllib.parse.urlencodeの使用をやめurlエンコードなしの単純ジョインに変更したところv2でも上手くいっています。
こんばんは。
私もBybit版のBotとBotフレームワークを作っていますが、BybitのWebsocketは結構使いづらいですね。初期データを戻して来ないし、BitMEXに比べて機能が不足。
おまけに通常注文と条件付き注文でID管理が別って言うのがちょっとね。。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。