bitmexのbot作りたいからccxtを触り始めた

bitmex用botを作りたくなってccxtを使おうと思ったので、やりながらメモ

python3.6.3 ipythonで見ながら

導入 github.com

  • 対応取引所の表示
In [1]: import ccxt

In [2]: print(ccxt.exchanges)
['_1broker', '_1btcxe', 'acx', 'allcoin', 'anxpro', 'bibox', 'binance', 'bit2c', 'bitbay', 'bitcoincoid', 'bitfinex', 'bitfinex2', 'bitflyer', 'bithumb', 'bitlish', 'bitmarket', 'bitmex', 'bitso', 'bitstamp', 'bitstamp1', 'bittrex', 'bitz', 'bl3p', 'bleutrade', 'braziliex', 'btcbox', 'btcchina', 'btcexchange', 'btcmarkets', 'btctradeim', 'btctradeua', 'btcturk', 'btcx', 'bxinth', 'ccex', 'cex', 'chbtc', 'chilebit', 'cobinhood', 'coincheck', 'coinegg', 'coinexchange', 'coinfloor', 'coingi', 'coinmarketcap', 'coinmate', 'coinsecure', 'coinspot', 'coolcoin', 'cryptopia', 'dsx', 'exmo', 'flowbtc', 'foxbit', 'fybse', 'fybsg', 'gatecoin', 'gateio', 'gdax', 'gemini', 'getbtc', 'hitbtc', 'hitbtc2', 'huobi', 'huobicny', 'huobipro', 'independentreserve', 'itbit', 'jubi', 'kraken', 'kucoin', 'kuna', 'lakebtc', 'liqui', 'livecoin', 'luno', 'lykke', 'mercado', 'mixcoins', 'nova', 'okcoincny', 'okcoinusd', 'okex', 'paymium', 'poloniex', 'qryptos', 'quadrigacx', 'quoinex', 'southxchange', 'surbitcoin', 'therock', 'tidex', 'urdubit', 'vaultoro', 'vbtc', 'virwox', 'wex', 'xbtce', 'yobit', 'yunbi', 'zaif', 'zb']
  • Bitmexアクセス用と買い板・売り板を見る
In [3]: exchange = ccxt.bitmex()

In [4]: orderbook = exchange.fetch_order_book('BTC/USD')

In [5]: orderbook
Out[5]:
{'asks': [[8704.5, 535915],
  [8705, 7928],
  [8706, 2523],
  [8706.5, 10000],
  [8707, 4116],
  [8708.5, 255],
  [8709, 9087],
  [8709.5, 52747],
略
  • テスト用にする?(よくわかってない)
In [6]: print(exchange.urls['api'], exchange.urls['test'])
https://www.bitmex.com https://testnet.bitmex.com

In [7]: exchange.urls['api'] = exchange.urls['test']

urlを見る限りはtestのほうを入れればテスト用のとこにAPIを投げれる…?のかな…?

  • apiKeyとsecretの設定方法
In [11]: exchange.apiKey = APIKEY

In [12]: exchange.secret = SECRET

In [18]: exchange.urls['api'] =  'https://www.bitmex.com'

In [19]: exchange.fetch_balance()
Out[19]:
{'BTC': {'free':  見せられないよ!

btc入金済みならfree以降に額が表示される。 exchange.urls['api']をtestのほうで上書きすると、balanceでダメなURLじゃん!といわれるので元に戻した。

  • 1分足のデータを得る
In [20]: exchange.fetch_ohlcv(symbol = 'BTC/USD', timeframe = '1h', since = 1462425900000, limit = 10)
Out[20]:
[[1462428000000, 447.2, 447.19, 446.67, 447, 8265],
 [1462431600000, 447, 446.82, 445.94, 446.82, 8069],
 [1462435200000, 446.82, 447.59, 446.81, 447.22, 7786],
 [1462438800000, 447.22, 447.41, 447.25, 447.31, 148],
 [1462442400000, 447.31, 447.25, 446.42, 447.25, 10010],
 [1462446000000, 447.25, 446.21, 445.43, 445.43, 13230],
 [1462449600000, 445.43, 446.53, 445.62, 445.62, 135224],
 [1462453200000, 445.62, 447.26, 445.84, 447.06, 30537],
 [1462456800000, 447.06, 448.13, 446.91, 448.13, 25492],
 [1462460400000, 448.13, 447.99, 447.88, 447.9, 4110]]

デフォルトは、 timeframe = '1m', since = None, limit = 100。 現在時刻から100件1分足でとってくる。 左からタイムスタンプ,Open, High, Close, Low, Volume (多分)。 タイムスタンプはミリ秒が最小単位の時間。 1hでとったので3600秒(3600000ミリ秒)進んでいることがわかる。

  • 指値買い注文を入れる
In [36]: exchange.create_order(symbol='BTC/USD', type='limit', side='buy', amount=1, price=8770)
Out[36]:
{'id':

お値段は適当です。

f:id:yuji-dis:20180311174237p:plain

SSとってる間に約定されてしまった。 amountのところは×0.0001btcされます。最小ポジションで100円(1btc=100万)になるのかな。

注文キャンセルの時にIDとか必要になるので、ちゃんと戻り値を変数に入れましょう(戒め

  • ポジション一覧を見る
In [60]: exchange.private_get_position()
Out[60]:
[{'account': 
  'avgCostPrice': 8769.5,
  'avgEntryPrice': 8769.5,
  'bankruptPrice': 34.5,
  'breakEvenPrice': 8768.5,
略
  • ポジションを閉じる

まだ勉強中

In [65]: exchange.private_post_order_closeposition()
---------------------------------------------------------------------------
HTTPError                                 Traceback (most recent call last)
E:\ProgramFiles\anaconda\lib\site-packages\ccxt\base\exchange.py in fetch(self, url, method, headers, body)
    349             self.logger.debug("%s %s, Response: %s %s %s", method, url, response.status_code, response.headers, self.last_http_response)
--> 350             response.raise_for_status()
    351

E:\ProgramFiles\anaconda\lib\site-packages\requests\models.py in raise_for_status(self)
    934         if http_error_msg:
--> 935             raise HTTPError(http_error_msg, response=self)
    936

HTTPError: 400 Client Error: Bad Request for url: https://www.bitmex.com/api/v1/order/closePosition

During handling of the above exception, another exception occurred:

多分こいつを使うが、パラメータの指定方法がわからん。

PriceとIDは指定しないといけないと思うのだが。 f:id:yuji-dis:20180311193841p:plain

また追記します。たぶん