CCXTを導入してPython(Django)でBitMEX自動取引を行う環境を構築

Python環境(Django)からBitMEXで自動取引を行う環境を構築します。

BitMEXはこれまで取り扱ったことのない仮想通貨取引所で、自動取引を行うにあたってはAPIからの接続を実装しなくてはいけません。
これまでは取引所ごとにAPIで接続するためのプログラムをコーディングしていたのですが、今回はCCXTを使用します。

CCXTとは

CCXTとは、「CryptoCurrency eXchange Trading Library」の略で、仮想通貨取引所でトレードを行うためのライブラリです。
仮想通貨取引所ごとにAPIの接続仕様が異なりますので、ライブラリを用いない場合はそれぞれの取引所ごとに接続用プログラムを作成しなくてはならないのですが、面倒な接続処理はCCXTの方でやってくれます。
また、注文や価格情報を取得する等の仕様は取引所ごとに異なりますが、CCXTを用いることで共通化することが可能ですから、取引所ごとの違いを考えなくて良くなります。
仮想通貨で自動売買を行うのであれば是非とも入れておきたいライブラリです。

CCXTはPython, PHP, JavaScriptで使用することができます。

CCXTをインストールする

DjangoでCCXTを使用する環境を構築します。

と言っても特殊なことは何もなくて、単にPythonにCCXTをインストールするだけです。

以下のコマンドでインストールします。

pip install ccxt

Django上で動くバッチを作る

Django上で動くバッチを開発します。

management/commandsディレクトリを作成します。

mkdir -p trades/management/commands
touch trades/management/__init__.py
touch trades/management/commands/__init__.py  

CCXTが対応している仮想通貨取引所のリストを取得する

trades/management/commands以下にトレード用プログラムを作成します。
Djangoのコマンドファイル上でCCXTを実行するプログラムです。

vi trades/management/commands/loop_trade.py
# -*- coding:utf-8 -*-

from django.core.management.base import BaseCommand
from ...models import Param, Porder, Corder

import ccxt

# BaseCommandを継承して作成
class Command(BaseCommand):

    # python manage.py help count_entryで表示されるメッセージ
    help = 'Display the number of blog articles'

    # コマンドが実行された際に呼ばれるメソッド
    def handle(self, *args, **options):
        print(ccxt.exchanges)

実行結果は以下のようになりました。

python manage.py loop_trade
[‘_1btcxe’, ‘acx’, ‘allcoin’, ‘anxpro’, ‘anybits’, ‘bcex’, ‘bequant’, ‘bibox’, ‘bigone’, ‘binance’, ‘binanceje’, ‘bit2c’, ‘bitbank’, ‘bitbay’, ‘bitfinex’, ‘bitfinex2’, ‘bitflyer’, ‘bitforex’, ‘bithumb’, ‘bitibu’, ‘bitkk’, ‘bitlish’, ‘bitmarket’, ‘bitmex’, ‘bitsane’, ‘bitso’, ‘bitstamp’, ‘bitstamp1’, ‘bittrex’, ‘bitz’, ‘bl3p’, ‘bleutrade’, ‘braziliex’, ‘btcalpha’, ‘btcbox’, ‘btcchina’, ‘btcexchange’, ‘btcmarkets’, ‘btctradeim’, ‘btctradeua’, ‘btcturk’, ‘buda’, ‘bxinth’, ‘ccex’, ‘cex’, ‘chbtc’, ‘chilebit’, ‘cobinhood’, ‘coinbase’, ‘coinbaseprime’, ‘coinbasepro’, ‘coincheck’, ‘coinegg’, ‘coinex’, ‘coinexchange’, ‘coinfalcon’, ‘coinfloor’, ‘coingi’, ‘coinmarketcap’, ‘coinmate’, ‘coinnest’, ‘coinone’, ‘coinspot’, ‘cointiger’, ‘coolcoin’, ‘coss’, ‘crex24’, ‘crypton’, ‘cryptopia’, ‘deribit’, ‘dsx’, ‘ethfinex’, ‘exmo’, ‘exx’, ‘fcoin’, ‘fcoinjp’, ‘flowbtc’, ‘foxbit’, ‘fybse’, ‘fybsg’, ‘gateio’, ‘gdax’, ‘gemini’, ‘getbtc’, ‘hadax’, ‘hitbtc’, ‘hitbtc2’, ‘huobipro’, ‘huobiru’, ‘ice3x’, ‘independentreserve’, ‘indodax’, ‘itbit’, ‘jubi’, ‘kkex’, ‘kraken’, ‘kucoin’, ‘kucoin2’, ‘kuna’, ‘lakebtc’, ‘lbank’, ‘liqui’, ‘liquid’, ‘livecoin’, ‘luno’, ‘lykke’, ‘mandala’, ‘mercado’, ‘mixcoins’, ‘negociecoins’, ‘nova’, ‘okcoincny’, ‘okcoinusd’, ‘okex’, ‘paymium’, ‘poloniex’, ‘quadrigacx’, ‘rightbtc’, ‘southxchange’, ‘stronghold’, ‘surbitcoin’, ‘theocean’, ‘therock’, ‘tidebit’, ‘tidex’, ‘uex’, ‘upbit’, ‘urdubit’, ‘vaultoro’, ‘vbtc’, ‘virwox’, ‘xbtce’, ‘yobit’, ‘zaif’, ‘zb’]

bitmexもきちんとありますね。

Django + CCXT でBitMEXのアカウント情報を取得する

次に、BitMEXでAPIキーを発行してアカウント情報を取得してみます。

BitMEXへの口座登録とAPIキーの発行が必要です。

まだの方は以下から登録できます。

まずはbitmex_api.pyというファイルを作り、ここにAPIキー等の情報を記載します。

# -*- coding: utf-8 -*-
"""
Created on Thu Mar  9 12:00:27 2017
@author: zaihack
"""

import ccxt

class bitmexApi:

    def bitmex():
        bitmex = ccxt.bitmex({
            # APIキーをご自分のものに差し替えてください
            'apiKey': '発行したAPIキー',
            'secret': '発行したAPIシークレット',
        })
        return bitmex

上記のファイルをimportして、口座情報を取得します。
口座情報の取得には、CCXTのfetch_balance()を使用します。

# -*- coding:utf-8 -*-

from django.core.management.base import BaseCommand
from ...models import Param, Porder, Corder

import ccxt
from .bitmex_api import bitmexApi

# BaseCommandを継承して作成
class Command(BaseCommand):

    # python manage.py help count_entryで表示されるメッセージ
    help = 'Display the number of blog articles'

    # コマンドが実行された際に呼ばれるメソッド
    def handle(self, *args, **options):
        balance = bitmexApi.bitmex().fetch_balance()
        print(balance)

結果は以下の内容が返ってきました。
(口座開設のみで、入金を行っていない状態です)

{‘info’: [{‘account’: 0000000, ‘currency’: ‘XBt’, ‘riskLimit’: 1000000000000, ‘prevState’: ”, ‘state’: ”, ‘action’: ”, ‘amount’: 0, ‘pendingCredit’: 0, ‘pendingDebit’: 0, ‘confirmedDebit’: 0, ‘prevRealisedPnl’: 0, ‘prevUnrealisedPnl’: 0, ‘grossComm’: 0, ‘grossOpenCost’: 0, ‘grossOpenPremium’: 0, ‘grossExecCost’: 0, ‘grossMarkValue’: 0, ‘riskValue’: 0, ‘taxableMargin’: 0, ‘initMargin’: 0, ‘maintMargin’: 0, ‘sessionMargin’: 0, ‘targetExcessMargin’: 0, ‘varMargin’: 0, ‘realisedPnl’: 0, ‘unrealisedPnl’: 0, ‘indicativeTax’: 0, ‘unrealisedProfit’: 0, ‘syntheticMargin’: None, ‘walletBalance’: 0, ‘marginBalance’: 0, ‘marginBalancePcnt’: 1, ‘marginLeverage’: 0, ‘marginUsedPcnt’: 0, ‘excessMargin’: 0, ‘excessMarginPcnt’: 1, ‘availableMargin’: 0, ‘withdrawableMargin’: 0, ‘timestamp’: ‘2019-05-15T13:56:27.919Z’, ‘grossLastValue’: 0, ‘commission’: None}], ‘BTC’: {‘free’: 0.0, ‘used’: 0.0, ‘total’: 0.0}, ‘free’: {‘BTC’: 0.0}, ‘used’: {‘BTC’: 0.0}, ‘total’: {‘BTC’: 0.0}}

ここまでで、bitMEXへの接続確認はできましたので、次の記事では実際のトレードロジックを組んでいくところを紹介します。