見出し画像

[Puppeteer] Bybit API探訪

BitMEX日本撤退

BitMEXが日本から撤退するとの情報が流れた後、Twitterのタイムラインをチラチラみていると

BitMEXの次はどこにするか?

的な情報が流れてきています。
で、その中にBybitなる取引所の情報があり、少し調べてみることに

BitMEXクローンとの呼び声もあるので、API仕様やレバレッジ/手数料の考え方はBitMEXにかなり近い感じです。

私が作っているPuppeteerはBitMEXをターゲットにしていたので、

BitMEXの仕様に近いのであれば移植も簡単に出来るはず

ということで何もすることが無いゴールデンウィーク中にAPIの中身を色々と覗いてみました。

Bybit API探訪

さて、仮想通貨取引のためのライブラリとして名高いCCXTにBybitがサポートされているかを調べます。

上記の情報によると CCXTのバージョン 1.24.4以降であればBybitがサポートされているようなので、さっそくPython版のCCXT v1.24.4をインストールしてみます。

pip install ccxt==1.24.4

これでCCXTのBybitサポートバージョンがインストールされました。
(condaを使ってインストールしようとしましたが、condaではサポートがされていないようなので、pipで入れました)

CCXTサポート状況

さて、どんなAPIがCCXTにサポートされているでしょうか。
次のプログラムでCCXTの「has」プロパティを覗いてみましょう。

import ccxt
import pprint as pp

o = ccxt.bybit()

pp.pprint(o.has)

結果は

{'CORS': True,
'cancelAllOrders': True,
'cancelOrder': True,
'cancelOrders': False,
'createDepositAddress': False,
'createLimitOrder': True,
'createMarketOrder': True,
'createOrder': True,
'deposit': False,
'editOrder': True,
'fetchBalance': True,
'fetchClosedOrders': True,
'fetchCurrencies': False,
'fetchDepositAddress': False,
'fetchDeposits': False,
'fetchFundingFee': False,
'fetchFundingFees': False,
'fetchL2OrderBook': True,
'fetchLedger': True,
'fetchMarkets': True,
'fetchMyTrades': True,
'fetchOHLCV': True,
'fetchOpenOrders': True,
'fetchOrder': True,
'fetchOrderBook': True,
'fetchOrderBooks': False,
'fetchOrderTrades': True,
'fetchOrders': True,
'fetchStatus': 'emulated',
'fetchTicker': True,
'fetchTickers': True,
'fetchTime': True,
'fetchTrades': True,
'fetchTradingFee': False,
'fetchTradingFees': False,
'fetchTradingLimits': False,
'fetchTransactions': False,
'fetchWithdrawals': True,
'privateAPI': True,
'publicAPI': True,
'withdraw': False}

でした。意外と多くのAPIが揃っていますね。
BitMEXクローンらしく、editOrderがemulatedではなく、Trueなのは嬉しいです。

Bybitサイト側には結局のところどんなAPIがあるかについては、次のサイトで調べられます。

全編英語ですが、小説とは違ってお決まりのパターンの英語が多いのでそれほど難しくないです。(Google翻訳もありますし)

生APIをCCXTから呼び出す

話をCCXTに戻して、CCXTがBybitのAPIとして認識しているものはどれか?を調べてみましょう。

import ccxt
import pprint as pp

o = ccxt.bybit()

pp.pprint(o.api)

結果は

{'openapi': {'get': ['order/list',
                    'stop-order/list',
                    'wallet/risk-limit/list',
                    'wallet/risk-limit',
                    'funding/prev-funding-rate',
                    'funding/prev-funding',
                    'funding/predicted-funding',
                    'api-key',
                    'wallet/fund/records',
                    'wallet/withdraw/list'],
            'post': ['order/replace',
                     'stop-order/create',
                     'stop-order/cancel',
                     'stop-order/replace',
                     'position/trading-stop']},
'position': {'post': ['change-position-margin']},
'private': {'get': ['order',
                    'stop-order',
                    'position/list',
                    'wallet/balance',
                    'execution/list'],
            'post': ['order/create',
                     'order/cancel',
                     'order/cancelAll',
                     'stop-order/cancelAll']},
'public': {'get': ['orderBook/L2',
                   'kline/list',
                   'tickers',
                   'trading-records',
                   'symbols',
                   'time',
                   'announcement']},
'user': {'get': ['leverage'], 
         'post': ['leverage/save']}
}

のようになりました。
これは、BybitのAPIの説明にあるものとおおよそ対応していようです。
例えば、Positionについて、BybitのAPIDOCには

スクリーンショット 2020-04-30 15.56.11

のように「GET /v2/private/position/list」という項目があります。
かたや、CCXTにも

スクリーンショット 2020-04-30 15.57.50

のように「private: get: position/list」という定義があります。
CCXTのbybitのソースコード中に

スクリーンショット 2020-04-30 15.59.31

と「version: 'v2'」とありますから、APIのバージョン2に対応しているということでしょう。

では、「GET /v2/private/position/list」というAPIをCCXT経由で呼び出すにはどうすればいいか?

それはそれぞれの文字をキャメルケースもしくはスネークケースで連結して呼び出して上げれば良いようです。
キャメルケース(ラクダ)の場合

ret = o.privateGetPositionList(
   {
       'symbol' : 'BTCUSD'
   }
)

スネークケース(蛇)の場合

ret = o.private_get_position_list(
   {
       'symbol' : 'BTCUSD'
   }
)

のようにです。
注意点としては、symbolに与える文字列は「BTC/USD」ではなく、「BTCUSD」になることです。
この点はBitMEXのCCXTでも同じでしたね。BTC/USDではなく、XBTUSDでしたから。

今日のところはこの辺で。

楽しいbotライフを!



ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。