CCXTライブラリを色々叩いてみた

こんにちは、Taiyoです。
ccxtなるライブラリを知ったので、触ってみました

CCXTとは

各取引所のAPIのラッパーライブラリ
取引所ごとの差をいい感じにそろえて扱いやすくしてくれる便利なやつ
今の所 JavaScript, PHP, Python 対応、他の言語もcomming soon らしい

公式: https://github.com/ccxt/ccxt
ドキュメント: https://github.com/ccxt/ccxt/wiki/Manual

インストール

pythonです

pip install ccxt

以上。もちろんpip3も可。色々叩いてみましょう

対応取引所のシンボルを確認

exchangesプロパティで対応している取引所のシンボルのリストが取れます

>>> import ccxt
>>> print(ccxt.exchanges)
['_1btcxe', 'acx', 'adara', 'allcoin', 'anxpro', 'bcex',
 'bequant', 'bibox', 'bigone', 'binance', 'binanceje',
 'binanceus', 'bit2c', 'bitbank', 'bitbay', 'bitfinex',
 'bitfinex2', 'bitflyer', 'bitforex', 'bithumb', 'bitkk',
 'bitlish', 'bitmart', 'bitmax', 'bitmex', 'bitso',
 'bitstamp', 'bitstamp1', 'bittrex', 'bitz', 'bl3p',
 'bleutrade', 'braziliex', 'btcalpha', 'btcbox', 'btcchina',
 'btcmarkets', 'btctradeim', 'btctradeua', 'btcturk', 'buda',
 'bw', 'bytetrade', 'cex', 'chilebit', 'cobinhood', 'coinbase',
 'coinbaseprime', 'coinbasepro', 'coincheck', 'coinegg', 'coinex',
 'coinfalcon', 'coinfloor', 'coingi', 'coinmarketcap', 'coinmate',
 'coinone', 'coinspot', 'coolcoin', 'coss', 'crex24', 'deribit',
 'digifinex', 'dsx', 'exmo', 'exx', 'fcoin', 'fcoinjp', 'flowbtc',
 'foxbit', 'ftx', 'fybse', 'gateio', 'gemini', 'hitbtc', 'hitbtc2',
 'huobipro', 'huobiru', 'ice3x', 'idex', 'independentreserve',
 'indodax', 'itbit', 'kkex', 'kraken', 'kucoin', 'kuna', 'lakebtc',
 'latoken', 'lbank', 'liquid', 'livecoin', 'luno', 'lykke',
 'mercado', 'mixcoins', 'oceanex', 'okcoincny', 'okcoinusd',
 'okex', 'okex3', 'paymium', 'poloniex', 'rightbtc', 'southxchange',
 'stex', 'stronghold', 'surbitcoin', 'theocean', 'therock',
 'tidebit', 'tidex', 'timex', 'upbit', 'vaultoro', 'vbtc',
 'whitebit', 'xbtce', 'yobit', 'zaif', 'zb']

すごい...当然のように bitflyer , liquid も対応してます

取引所のアクセサ作成

bitFlyerで試してみます

bf = ccxt.bitflyer()

対応している関数の確認

hasプロパティで取引所アクセサが対応している機能を確認できます

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

True: 対応済み
False: 使用できない
emulated: 公式のAPIには対応する機能が提供されていないが、ccxtライブラリ側の処理で実装済み

板情報取得

fetch_order_book関数で今の板情報を取れます

order_book = bf.fetch_order_book('FX_BTC_JPY')
>>> order_book['bids'][0]
[967019.0, 0.06]
>>> order_book['asks'][0]
[967077.0, 0.04850636]

指値は最良気配に近い順にリストに入っているようです。
逆に一番最良気配から遠い情報も見てみました。


>>> order_book['bids'][-1]
[418114.0, 0.2]
>>> order_book['asks'][-1]
[2000000.0, 0.2]

なるほど。

注文してみる

取引所でアカウントを作成し、API KeyとSecret Keyを発行しておく必要があります。アクセサに2つともセットし、create_limit_buy_orderです。

>>> bf.apiKey="DUMMYAPIKEY"    #文字列はダミーです。取引所から取得したAPI Keyを渡します
>>> bf.secret="DUMMYSECRETKEY" #文字列はダミーです。取引所から取得したSecret Keyを渡します。
>>> bf.create_limit_buy_order('FX_BTC_JPY',0.01,968421)
{'info': {'child_order_acceptance_id': 'JRF20200122-122524-445944'},
 'id': 'JRF20200122-122524-445944'}

指値で買い注文を出せました。
注文のidは"JRF20200122-122524-445944"の部分ですね

約定を確認する

>>> trades = bf.fetch_my_trades('FX_BTC_JPY')
>>> trades[-1]
{'id': '1535810109',
 'info': {'id': 1535810109,
 'side': 'BUY',
 'price': 968421.0,
 'size': 0.01,
 'exec_date': '2020-01-22T12:25:51.673',
 'child_order_id': 'JFX20200122-122524-951598F',
 'commission': 0.0,
 'child_order_acceptance_id': 'JRF20200122-122524-445944'
},
 'timestamp': 1579695951673,
 'datetime': '2020-01-22T12:25:51.673Z',
 'symbol': 'FX_BTC_JPY',
 'order': 'JRF20200122-122524-445944',
 'type': None,
 'side': 'buy',
 'takerOrMaker': None,
 'price': 968421.0,
 'amount': 0.01,
 'cost': 9684.210000000001,
 'fee': None}

orderの文字列"JRF20200122-122524-445944"が先程のidと一致しています。先の注文が約定していたことが確認できました。

未約定の注文を確認する

>>> open_order = bf.fetch_open_orders('FX_BTC_JPY')
>>> open_order[-1]
{'id': 'JRF20200122-083922-001893',
 'info': {'id': 0, 'child_order_id': 'JFX20200122-083923-761461F',
 'product_code': 'FX_BTC_JPY',
 'side': 'SELL',
 'child_order_type': 'LIMIT',
 'price': 978390.0,
 'average_price': 0.0,
 'size': 0.2,
 'child_order_state': 'ACTIVE',
 'expire_date': '2020-02-21T08:39:22',
 'child_order_date': '2020-01-22T08:39:22',
 'child_order_acceptance_id': 'JRF20200122-083922-001893',
 'outstanding_size': 0.2,
 'cancel_size': 0.0,
 'executed_size': 0.0,
 'total_commission': 0.0
},
 'timestamp': 1579682362000,
 'datetime': '2020-01-22T08:39:22.000Z',
 'lastTradeTimestamp': None,
 'status': 'open',
 'symbol': 'FX_BTC_JPY',
 'type': 'limit',
 'side': 'sell',
 'price': 978390.0,
 'cost': 0.0,
 'amount': 0.2,
 'filled': 0.0,
 'remaining': 0.2, 
 'fee': {'cost': 0.0, 'currency': None, 'rate': None}
}

約定・未約定に関わらず全注文のステータスを確認する

>>> all_orders = bf.fetch_orders('FX_BTC_JPY')
>>> all_orders[-1]
{'id': 'JRF20200122-123644-850462',
 'info': {'id': 0,
 'child_order_id': 'JFX20200122-123644-691535F',
 'product_code': 'FX_BTC_JPY',
 'side': 'SELL',
 'child_order_type': 'LIMIT',
 'price': 998421.0,
 'average_price': 0.0,
 'size': 0.01,
 'child_order_state': 'ACTIVE',
 'expire_date': '2020-02-21T12:36:44',
 'child_order_date': '2020-01-22T12:36:44',
 'child_order_acceptance_id': 'JRF20200122-123644-850462',
 'outstanding_size': 0.01,
 'cancel_size': 0.0,
 'executed_size': 0.0,
 'total_commission': 0.0
},
 'timestamp': 1579696604000,
 'datetime': '2020-01-22T12:36:44.000Z',
 'lastTradeTimestamp': None,
 'status': 'open',
 'symbol': 'FX_BTC_JPY',
 'type': 'limit',
 'side': 'sell',
 'price': 998421.0,
 'cost': 0.0,
 'amount': 0.01,
 'filled': 0.0,
 'remaining': 0.01,
 'fee': {'cost': 0.0, 'currency': None, 'rate': None}} 

出力はこれまでと同様です。
status プロパティが open なら未約定、closedであれば約定済みです。

■注文をキャンセルする

>>> bf.cancel_order('JRF20200122-123644-850462', 'FX_BTC_JPY')
b''

---

大体こんなところでしょうか。
他にもまだまだ機能はあるみたいですが、これだけあれば簡単な取引なら実装できそうです。


この記事が気に入ったらサポートをしてみませんか?