【Python】CCXTでBitMEXの自動売買botへ道 基本編

2018.06.17 2019.10.26 87
【Python】CCXTでBitMEXの自動売買botへ道 基本編

こんばんわ。こふそ(@koheta0325)です。

はじめに

今回ご紹介することは仮想通貨取引のビットコインFXです。

2018/6/11
会社の先輩から、bitFlyer業務停止になるかもという噂を挙がっている

それによる影響で仮想通貨全体暴落の予感がするよ。

危険だからフィアット(法廷通貨。日本で言うと”円”)に戻した方がいいと思うよ。

ということお伝えいただきました。

僕は信じやすいタイプなので、やばそう。と思いました。

 

あ、でも逆にこれはいわゆるピンチはチャンスなのでは?
ビットコインFXで空売り(ショート)すれば圧倒的チャンスなのでは?

と思い、国内取引所で保持していたアルトコインちゃんたちをビットコインにして、
海外取引所であるBitMEXに送金して空売りを試みました。

結果、結局bitFlyerさんの業務停止については、ガセでしたが、
全体的に仮想通貨はなみなみと下落トレンドに走っていたので、多少の利益がでました。

この機会にBitMEXの基本的な使い方が分かったので、使い方のマニュアルは後日記事にするとして、BitMEXの取引を自動化したいと奮い立ちました。

今回のシリーズはBitMEX自動取引botを作成して不労所得を得ようという企画です。

BitMEXとは

BitMEXとは。ビットコイン、アルトコインで信用取引ができる海外取引所(中国)です。
設立日は2014年。

レバレッジは最大100倍で取引可能。日本では確か最大25倍程度だったはずです。
そして追証がありません。

いろんな取引所でビットコインFXを行ってみましたが、一番BitMEXが軽快に取引できました。サーバーは非常にサクサクです。

もちろん国内取引所でもビットコインFXはできます。
Zaif、bitFlyer、bitbank等がありますが、まだまだ色々問題が多いです。

Zaifでは、ビットコインFX(AirFX)ができますが、サーバーが弱小ということもあり、非常に危険らしいです。というか使いづらい、わかりにくい。

■ツイッターより

 

国内取引所でビットコインFXをするならbitFlyerがオススメです。

話はそれましたが、今ビットコインFXをやる場合であれば、総合的に考えると、ビットコインFXをするならBitMEXをオススメします。

BitMEXでは、APIで価格取得・取引・入出金ができるので、自動取引を行うにはもってこいの環境ですね。

APIの使用には事前にユーザー登録が必要です。

もし登録していなかったら、ユーザー登録をすませておきましょう。

KYC(本人書類提出)もなく、簡単に登録することができます。(3分くらい)

こちらから登録すると、取引手数料が6ヶ月間、10%割引になります。

BitMEX無料登録

BitMEXのAPIキー取得

Bitmexにログイン後、アカウント>APIキーをクリックします。

  • 名前:
    API名を任意に入力します。
  • キーのアクセス許可:
    注文とキャンセルを行い場合は、【注文】を選択します。
  • 出金:
    APIで出金処理をさせない場合は、チェックを外しておきます。
  • 2要素トークン:
    Google認証コードを入力します。

以上の入力を行った後、【APIキーを作成】をクリックします。
APIキー、シークレットコードが生成されます。これをメモしておきましょう。

CCXTライブラリとは

さっそくbitMEXのプログラムを組んでいきますが、CCXTライブラリを使います。

一言でいうと
各取引所のAPIを共通化した非常に強力なライブラリです。

APIを触ったことがある人はわかると思いますが、
各取引所によって、価格取得、取引、出金のプログラムコードが違うんですね。

Zaifで価格取得処理、bitFlyerで価格取得処理、binanceで・・・と書いていると、ソースコードが長くなり、実装時間(作業時間)も2倍、3倍と増えてくるわけです。

でも、価格取得の取引処理が共通化されると、
リクエストする際にイメージとしては、
【”Zaif”,”価格取得”,”BTC”】
【”bitFlyer”,”価格取得”,”BTC”】
【”bitMEX”,”価格取得”,”BTC”】

といったような感じで取引所名を変更してリクエストするだけなので簡単に実装が可能になります。

詳しい話は、過去記事を参考にしてください。

※過去記事のサンプルコードはPHPになっています。今回はPythonで実装予定なので参考程度にしてください。
仮想通貨取引所のAPI処理を共通化できる!CCXTをPHPで動かしてみた。

APIドキュメント
httpss://github.com/ccxt/ccxt

導入

実装環境

  • 言語:Python3
  • 環境:cloud9

cloud9とは

AWS(アマゾンウェブサービス)が展開するクラウドIDEです。

無料で始められるのでぜひ使ってみましょう。

基本操作

以下のコードさえ覚えておけばOKです。


#coding=utf-8
import ccxt
exchanges = {
    "bitmex": {
        "apiKey": "取引所のAPIKey",
        "secret": "取引所のSecret"
    },
}
exchange = ccxt.bitmex()
exchange.apiKey = exchanges["bitmex"]["apiKey"]
exchange.secret = exchanges["bitmex"]["secret"]
#Tickerの取得
ticker = exchange.fetch_ticker('BTC/USD')
#口座情報の取得
balance = exchange.fetch_balance()
#ポジションの取得
position = exchange.private_get_position()
#注文の取得
open_orders = exchange.fetch_open_orders()
#発注
order = exchange.create_order('BTC/USD', type='limit', side='buy', amount=1, price=6509)
#注文のキャンセル
cancel = exchange.cancel_order('orderID')

試しに何個か動作を確認してみましょう。

Tickerの取得(fetch_ticker/fetch_order_book)


exchange = ccxt.bitmex()
ticker = exchange.fetch_ticker('BTC/USD')
print(ticker)

2018/6/17
なぜかわかりませんが、BitMEXでfetch_tickerを行ったら403 forbiddenエラーが起きたので、fetch_order_bookで代用します。


exchange = ccxt.bitmex()
orderbook = exchange.fetch_order_book ('BTC/USD')
bid = orderbook['bids'][0][0] if len (orderbook['bids']) > 0 else None
ask = orderbook['asks'][0][0] if len (orderbook['asks']) > 0 else None
spread = (ask - bid) if (bid and ask) else None
print (exchange.id, 'market price', {'bid': bid, 'ask': ask, 'spread': spread})

出力結果

bitmex market price {'bid': 6377.5, 'ask': 6378, 'spread': 0.5}

 

資産の取得(fetch_balance)


exchange = ccxt.bitmex()
balance = exchange.fetch_balance()
print("free:" + str(balance["free"]))
print("used:" + str(balance["used"]))
print("total:" + str(balance["total"]))

出力結果

free:{'BTC': 0.01297995}
used:{'BTC': 0.003293580000000001}
total:{'BTC': 0.01627353}

 

  • free … 使用可能な残高
  • used … 合計残高(total)から使用可能な残高(free)を引いたもの
  • total … 合計残高

 

新規注文(create_order)

パラメータ

  • symbol: 通貨ペア(BTC/
  • type: 指値ならlimit、成行ならmarket
  • side: 買い注文(ask):buy、売り注文(bid):sell
  • amount: 枚数
  • price: 価格
  • params: 取引所用パラメータ

例:BTC/USDを指値6509の価格で1枚購入する


exchange = ccxt.bitmex()
result = exchange.create_order(symbol='BTC/USD', type='limit', side='buy', amount=1, price=6509)
print(result)

出力結果

{'info': {'orderID': '***', 'clOrdID': '', 'clOrdLinkID': '', 'account': ***, 'symbol': 'XBTUSD', 'side': 'Buy', 'simpleOrderQty': None, 'orderQty': 1, 'price': 6509, 'displayQty': None, 'stopPx': None, 'pegOffsetValue': None, 'pegPriceType': '', 'currency': 'USD', 'settlCurrency': 'XBt', 'ordType': 'Limit', 'timeInForce': 'GoodTillCancel', 'execInst': '', 'contingencyType': '', 'exDestination': 'XBME', 'ordStatus': 'New', 'triggered': '', 'workingIndicator': True, 'ordRejReason': '', 'simpleLeavesQty': 0.0002, 'leavesQty': 1, 'simpleCumQty': 0, 'cumQty': 0, 'avgPx': None, 'multiLegReportingType': 'SingleSecurity', 'text': 'Submitted via API.', 'transactTime': '2018-06-16T17:47:03.266Z', 'timestamp': '2018-06-16T17:47:03.266Z'}, 'id': '***', 'timestamp': 1529171223266, 'datetime': '2018-06-16T17:47:03.266Z', 'lastTradeTimestamp': None, 'symbol': 'BTC/USD', 'type': 'limit', 'side': 'buy', 'price': 6509.0, 'amount': 1.0, 'cost': 0.0, 'filled': 0.0, 'remaining': 1.0, 'status': 'open', 'fee': None}

下のような感じで注文がアクティブになります。
次回はこれらの基本操作をふまえて、実践編に入りたいと思います。

BitMEX未登録の方はこの機会にぜひ登録してみてはいかがでしょうか。(作業時間は3分程度)
こちらから登録すると、取引手数料が6ヶ月間、10%割引になります。

BitMEX無料登録