Bybit向けBotのAPI修正で気をつけたほうが良い点

この記事は約6分で読めます。
スポンサーリンク

古いBybit APIの停止が発表されたため、自分のBotのコードを修正しました。

少し想定外のところが変わっていたりしたので、私が把握したレベルの情報を共有します。

まだ終わってない人は急いだ急いだほうがいいかと思います。

V1は12月17日に止まるらしいよ!

簡単に言うと「BybitのAPIを使用しているツールを使ってる人は、マジで気をつけたほうが良い」です。

今回はマジで、気がついたらBotが異常終了してたりがありえる。

ことの発端は、Bybitから来た以下のメールでした。

The following REST API will be upgraded. The older version of API will be deprecated on December 10, 2020. Effective immediately, the rate limit will be reduced by half before being completely removed from service on December 17, 2020. 

Bybitからのめーる

「completely removed from service on December 17」!!!

つまり、いくつかのAPIは12月17日に停止されるので、そのAPIを使用している人は新しいAPIに変更する必要があるのです。

丁寧にも、変更されるAPIのリストも付けてくれていました。

a) /open-api/order/list (please replace with /v2/private/order/list)

b) /open-api/stop-order/create (please replace with /v2/private/stop-order/create)

c) /open-api/stop-order/list (please replace with /v2/private/stop-order/list)

d) /open-api/stop-order/cancel (please replace with /v2/private/stop-order/cancel)

e) /open-api/order/replace (please replace with /v2/private/order/replace)

f) /open-api/stop-order/replace (please replace with /v2/private/stop-order/replace)

g) /open-api/order/create (please replace with /v2/private/order/create)

h) /open-api/order/cancel (please replace with /v2/private/order/cancel)

i) /position/list (please replace with /v2/private/position/list)

j) /user/leverage (please replace with /v2/private/position/list)

上記の「/position/list」はポジションを取得するAPIです。「/open-api/order/create」は実際にエントリーする時のAPIです(つまり売ったり買ったり)。

なので、一般的なBotの殆どが実装されていると想定されます。

私のケースでは、半年前にBybitのロジックを実装し始めたので、上記の「/position/list」がバッチリ当てはまっていました。具体的にはswaggerを使っていたので、Bybitのswagger.txtが「/position/list」を使用していました。

幸いにも「/open-api/order/create」は影響ありませんでした。というのも、初期のswagger.txtには「Order.Order_new」と「Order.Order_newV2」という2つのメソッドがラップされており、後者を使っていたら新しい「 /v2/private/order/create」を使うように仕向けられていたからです。で、私のBotははじめから「Order.Order_newV2」を使っていたので影響はなかったと。

とにもかくにも、Botを使用している人は上記のリストとBybitのAPI Referenceに目を通して、変更点の修正を行う必要が出てきます。

・・・と、ここまでが前書きでして、修正に少しハマりました。

というのも、API Referenceと違う戻り値が返ってきたり、変数タイプが変わっていたりしからです。

・・・結局全ての変更したAPIに関係するメソッドの単体テストは必須だということを強く強調するのですが、今回は私が発見したポイントを紹介します。

API Referenceが間違ってるって・・・本当にテストした結果しか信じられませんね。

それでええんか!?Bybit!

/v2/private/position/listの戻り値が若干Referenceと違う

API Referenceを見ると、/v2/private/position/listの戻り値が

{
    "ret_code": 0,
    "ret_msg": "OK",
    "ext_code": "",
    "ext_info": "",
    "result": {
        "id": 27913,

みたいになっているのですが、実際の戻り値が

{'ext_code': '',
 'ext_info': '',
 'rate_limit': 120,
 'rate_limit_reset_ms': 1605321696036,
 'rate_limit_status': 117,
 'result': [{'data': {'auto_add_margin': 1,
    'bust_price': '0',

って感じで{‘data’:が間に挟まっていたのです。

API Referenceの記述フォーマットでDictを解釈していたので、私のBotがエラーとなりました。

これ、Bybitに問い合わせたところ「APIの応答が正しいから、そっちを信じてくれ」とのこと・・・

そんなのありかよ・・・

Botを改修することで対応しましたが、いつ元に戻るかが若干不安です。

V1と戻り値のフォーマットが違う箇所がある

私が見つけた限りでは、例えば以下みたいな感じです。

  • 上記APIの「[‘result’][0][‘wallet_balance’]」が元々はfloatだったのにstrで返っている
  • 同じく「[‘result’][0][‘entry_price’])」が元々はintだったのにstrで返っている

いずれもコードの中では「float/intで返ってくること前提」でコーディングしているので、エラーが発生しました(厳密にはタイプはチェックしていて、通常のタイプと違うメッセージを吐いていた)。

この辺、パラメータによって返る値がまちまちだったり、APIバージョンが変わったことで値が変わったり、これは本当にカジュアル開発者キラーです・・・

まとめ

とりあえず全てのAPIのテストが終わったので、これで大丈夫だと思います。

開発環境で24時間連続で稼働して問題が発生していないのですが、追加で更に1週間ほど問題なければ本番環境に移行しようと考えています。

やはり、テストは大事です!Bot開発は自己責任なので、ネットの情報を鵜呑みにせずに、しっかりテストでバグを追い出しましょう!

コメント

タイトルとURLをコピーしました