[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には
のように「GET /v2/private/position/list」という項目があります。
かたや、CCXTにも
のように「private: get: position/list」という定義があります。
CCXTのbybitのソースコード中に
と「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を作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。