【自動売買入門】pythonライブラリccxtの使い方 解説

Narazu

pythonで自動売買を作ってみたいんだけど、どうしたらいいの?

そんな悩みを解決する記事を書きました。

初心者が自動売買を作ろうとするとどうしたらいいか分からないですよね。

初心者でも自動売買を開発できるようになりたい

そんな方に向け、簡単なプログラムを組めるように手順に沿って解説します。

pythonのライブラリ「ccxt」を使うと簡単に売買できるようになります。

ccxtの説明は簡単に済ませて、実際に手を動かして感覚を掴めるような内容となっていますのでぜひ最後までご覧になってください。

  • この記事で分かること
この記事で分かること
  • ccxtとは
  • ccxtのインストール方法
  • ccxtの使い方

この記事の手順に沿えば簡単な売買ぐらいならできる様になります。

この記事におけるコードはすべてサンプルです。
このコードでの損失には責任を持てませんのでご理解のほどよろしくお願いします。

目次

仮想通貨自動売買の前提条件 APIの取得

自動売買を行うためには仮想通貨取引ののAPIの取得が必要です。

まだの方は以下の記事を参考にAPIを取得してみてください。

国内暗号資産取引所


海外暗号資産取引所

pythonのライブラリccxtとは

一応ccxtについて簡単に説明しておきます。

手を動かして覚えればいいのでccxtについてはさらっと読み流すだけでOKです。

Narazu

ccxtって何??

自動売買を効率よく開発するならpythonのccxtというライブラリを導入することをオススメします。

ccxtとは

様々な仮想通貨取引所のAPIを統一的な形で利用できるようにするPythonライブラリです。

ccxtを使用することで、異なる取引所に対するトレードやデータ取得の処理を、ほぼ同じコードで実装することができます。

異なる取引所のAPIを学ぶ手間を省き、より効率的にトレードボットやデータ収集ツールを開発が可能となります。

簡単にうと

異なる取引所のAPIを効率よく使えるするようにするツール

です。

pythonライブラリccxtのインストール方法

こちらも簡単に説明します。

インストール方法は以下のようになります。

pipを使用している場合
pip install ccxt
pipenvを使用している場合
pipenv install ccxt

以下を参考にディレクトリの環境を整えてください。

国内仮想通貨取引所


海外仮想通貨取引所

ccxtの基本的なメソッドの使い方

各メソッドを簡単に解説します。

本来APIを使う場合はエラー処理が必要となりますが、コードが長くなってしまうのでここでは省きます。

エラー処理のコードについては次の章で簡単に説明します。

どの様にメソッドが動作しているかは一旦置いておいて、実際に動かしながら感覚を掴みましょう!

以下は変更された表形式です。各項目に番号が連番で振られています。

項目メソッド名説明
1fetch_trades(symbol)指定された通貨ペアの最新トレード履歴を取得します。取引の詳細な情報が含まれます。
2fetch_order_book(symbol)指定された通貨ペアのオーダーブック情報を取得します。売り注文と買い注文の一覧や価格が含まれます。
3fetch_ohlcv(symbol, timeframe)指定された通貨ペアおよび時間枠のローソク足データを取得します。ローソク足データには開始時刻、終了時刻、高値、安値、終値などが含まれます。
4fetch_ticker(symbol)指定された通貨ペアの最新のティッカー情報を取得します。最終取引価格や24時間の取引量などが含まれます。
5fetch_order(id, symbol)指定された注文 ID の注文情報を取得します。注文のステータスや細かい詳細が含まれます。
6fetch_my_trades(symbol)ユーザーの取引履歴を取得します。自分のアカウントに関連する取引情報が含まれます。
7fetch_open_orders(symbol)指定された通貨ペアのオープンな注文一覧を取得します。未約定の注文が含まれます。
8create_order(symbol, side, type, amount)指定された通貨、数量、で注文方法(成行又は、指値)で注文を作成します。
9cancel_order(id, symbol)指定された注文 ID の注文をキャンセルします。未約定の注文を取り消す操作です。
引数について
symbol

主に以下の様にsymbolを入れます。

'BTC/USDT'
'ETH/USDT'
'ADA/USDT'
その他シンボル
timeframe
'1m' # 1分ごとのデータ
'5m' # 5分ごとのデータ
'1h' # 1時間ごとのデータ
'1d' # 1日ごとのデータ
その他timeframe
id

取引の際発行されるIDです。

取引所によってidが異なりますが、以下はMEXCのidの例となります。

'C01__370000000000000033'
type

取引方法を指定します。

'limit'  # 指値
'market' # 成行
side

売りか買いかを指定します。

'buy'  # 買い
'sell' # 売り

初心者の方にオススメ
  • プログラミングに興味のある方
  • アプリケーション開発をやってみたい方
  • 昔プログラミングに挫折した方
  • プログラミング学校が高いと思っている方
スキルハックスより 引用

脱初心者のためには独学だと限界があります。

「買い切り」でコンパクトで質の高い動画を100本以上揃え、受講期間なし自由に学ぶことのできるオススメのオンラインスクールです!

  • 10~20分の動画講義が100本以上
  • 回数無制限の質問対応
  • 買い切りで受講期間制限なし

\ 脱初心者 /


ここから簡単なコードを紹介します。

1.fetch_trades(symbol)

指定された通貨ペアの最新トレード履歴を取得します。

以下はbybit.pyの全体のコードとなります。

import ccxt
import settings

class MexcApiClient(object):
  def __init__(self, api_key=settings.mexc_api_key, secret_key=settings.mexc_secret_key):
    self.mexc_client = ccxt.mexc({'apiKey': api_key, 'secret': secret_key})

  def get_market_currencies(self):
    currencies = self.mexc_client.load_markets()
    print(currencies)

  # 以下を追加
  def get_balance(self):
    get_balance = self.mexc_client.fetch_balance()
    print(get_balance)

以下はmain.pyの全体のコードとなります。

イーサリアムの通貨ペアのトレード履歴が欲しい場合は’ETH/USDT’と引数に渡すことで得られることができます。

以下の場合、指定された通貨とはBTC/USDTとなります。

from crypt_api.mexc import MexcApiClient

if __name__ == '__main__':
  mexc_api = MexcApiClient()

  # 以下呼び出し方
  mexc_api.get_trades('BTC/USDT')

次のメソッドからはメソッドのみを追記していきますので同じ様な要領で追加していってください。


2.fetch_order_book(symbol)

指定された通貨ペアのオーダーブック情報を取得します。

  def get_order_book(self, symbol):
    order_book = self.mexc_client.fetch_order_book(symbol)
    print(order_book)
  mexc_api.get_order_book('BTC/USDT')

3.fetch_ohlcv(symbol, timeframe)

指定された通貨ペアおよび時間枠のローソク足データを取得します。

  def get_ohlcv(self, symbol, timeframe):
    ohlcv = self.mexc_client.fetch_ohlcv(symbol, timeframe)
    print(ohlcv)

以下のコードはBTC/USDTの1時間のローソク足の情報を取得します。

  mexc_api.get_ohlcv('BTC/USDT', '1h')

4.fetch_ticker(symbol)

指定された通貨ペアの最新のティッカー情報を取得します。

  def get_ticker(self, symbol):
    ticker = self.mexc_client.fetch_ticker(symbol)
    print(ticker)  
  mexc_api.get_ticker('BTC/USDT')

5.fetch_order(id, symbol)

指定された通貨ペアのオープンな注文一覧を取得します。
未約定の注文が含まれます。

  def get_order(self, id, symbol):
    order = self.mexc_client.fetch_order(id=id, symbol=symbol)
    print(order)
  mexc_api.get_order(id='C01__370000000000000033', symbol='ADA/USDC')

6.fetch_my_trades(symbol)

ユーザーの取引履歴を取得します。
自分のアカウントに関連する取引情報が含まれます。

  def get_my_trades(self, symbol):
    my_trades = self.mexc_client.fetch_my_trades(symbol)
    print(my_trades)
  bybit_api.get_my_trades('BTC/USDT')

返り値は以下の様な感じになります。

[
    {
        'id': '26d907f.....d7e7c58',
        'order': 'C01__377.....85',
        'timestamp': 1705812316000,
        'datetime': '2024-01-21T04:45:16.000Z',
        'symbol': 'ADA/USDT',
        'type': None,
        'side': 'sell',
        'takerOrMaker': 'taker',
        'price': 0.5187,
        'amount': 10.0,
        'cost': 5.187,
        'fee': {
            'cost': 0.005187,
            'currency': 'USDT'
        },
        'info': {
            'symbol': 'ADAUSDT',
            'id': '26d907f.....d7e7c58',
            'orderId': 'C01__377.....85',
            'orderListId': '-1',
            'price': '0.5187',
            'qty': '10',
            'quoteQty': '5.187',
            'commission': '0.005187',
            'commissionAsset': 'USDT',
            'time': '1705812316000',
            'isBuyer': False,
            'isMaker': False,
            'isBestMatch': True,
            'isSelfTrade': False,
            'clientOrderId': None
        },
        'fees': [
            {
                'cost': 0.005187,
                'currency': 'USDT'
            }
        ]
    },
    {
        'id': '26d907f.....d7e7b343',
        'order': 'C01__377.....72',
        'timestamp': 1705812382000,
        'datetime': '2024-01-21T04:46:22.000Z',
        'symbol': 'ADA/USDT',
        'type': None,
        'side': 'buy',
        'takerOrMaker': 'taker',
        'price': 0.519,
        'amount': 9.63,
        'cost': 4.99797,
        'fee': {
            'cost': 0.00499797,
            'currency': 'USDT'
        },
        'info': {
            'symbol': 'ADAUSDT',
            'id': '26d907f.....d7e7b343',
            'orderId': 'C01__377.....72',
            'orderListId': '-1',
            'price': '0.519',
            'qty': '9.63',
            'quoteQty': '4.99797',
            'commission': '0.00499797',
            'commissionAsset': 'USDT',
            'time': '1705812382000',
            'isBuyer': True,
            'isMaker': False,
            'isBestMatch': True,
            'isSelfTrade': False,
            'clientOrderId': None
        },
        'fees': [
            {
                'cost': 0.00499797,
                'currency': 'USDT'
            }
        ]
    }
]

7.fetch_open_orders(symbol)

指定された通貨ペアのオープンな注文一覧を取得します。
未約定の注文が含まれます。

  def get_open_orders(self, symbol):
    open_orders = self.mexc_client.fetch_open_orders(symbol)
    print(open_orders)
  bybit_api.get_open_orders('BTC/USDT')

8.create_order(symbol, side, price, amount, type=’limit’))

指定された通貨、数量、で注文方法(成行又は、指値)で注文を作成します。

typeの指定
  • 指値→limit
  • 成行→market
sideの指定
  • 売り→sell
  • 買い→buy
  """"
    type: 指値⇒limit、成行⇒market
    side: 売り⇒sell, 買い⇒buy
  """
  def create_order(self, symbol, side, price, amount, type='limit'):
    order = self.mexc_client.create_order(symbol=symbol, side=side, price=price, amount=amount, type=type)
    print(order)
  mexc_api.create_order(symbol='ADA/USDC', price=0.6, side='sell', amount=10, type='limit')

以下はそのapiからの返答になります。

{
  "id": "C01__370000000000000033",
  "clientOrderId": null,
  "timestamp": 1705382974755,
  "datetime": "2024-01-16T05:29:34.755Z",
  "lastTradeTimestamp": null,
  "status": null,
  "symbol": "ADA/USDC",
  "type": "limit",
  "timeInForce": null,
  "side": "sell",
  "price": 0.6,
  "stopPrice": null,
  "triggerPrice": null,
  "average": null,
  "amount": 10,
  "cost": null,
  "filled": null,
  "remaining": null,
  "fee": null,
  "trades": [],
  "info": {
    "symbol": "ADAUSDC",
    "orderId": "C01__370000000000000033",
    "orderListId": "-1",
    "price": "0.6",
    "origQty": "10",
    "type": "LIMIT",
    "side": "SELL",
    "transactTime": "1705382974755"
  },
  "fees": [],
  "lastUpdateTimestamp": null,
  "postOnly": null,
  "reduceOnly": null,
  "takeProfitPrice": null,
  "stopLossPrice": null
}

取引所は以下の様にオーダーが入っています。

エラーが出た場合

create_orderを実行した際に以下の様なエラーが出る場合があります。

ccxt.base.errors.ExchangeError: mexc {"success":false,"code":704,"message":"Require trade operate permission!"}

取引所mexcのAPI設定がうまくいっていない可能性があるので以下を試してみてください。

STEP
APIキーの設定を開く

MEXCAPI設定ページへ移動

赤枠の「変更」をクリックします。

そうすると以下の様なダイアログが開きます。

赤枠をクリックします。

STEP
通貨ペアの選択
  • 通貨ペア入力
  • 通貨ペア選択
  • この辺りをクリック」し、セレクトボックスを閉じる

セレクトボックスを閉じて「ETH/USDC」が追加されたことを確認し右下の「確認」をクリックします。

STEP
セキュリティ認証

コードを取得」をクリックしメールで認証コードを受け取り、入力します。

2段階認証のコード(Authenticatorコード)も忘れずに入力してください。

両方入力したら「確認」をクリックして完了です。


9.cancel_order(id, symbol)

指定された注文 ID の注文をキャンセルします。
未約定の注文を取り消す操作です。

  def cancel_order(self, id, symbol):
    result = self.mexc_client.cancel_order(id=id, symbol=symbol)
    print(result)
  mexc_api.cancel_order(id='C01__370000000000000033', symbol='ADA/USDC')

以下の様にキャンセルされていればOKです。


ccxtの簡単なエラー処理

apiを使用する際はエラー処理が重要です。

エラーが発生した時の処理を正しく行うことで予期せぬ

import ccxt
from ccxt.base.errors import InvalidOrder, InsufficientFunds, NetworkError

~~~~~~~~~~~~~~~~
~~ 一部省略 ~~
~~~~~~~~~~~~~~~~

 """"type: 指値⇒limit、成行⇒market
      side: 売り⇒sell, 買い⇒buy
  """
  def create_order(self, symbol, side, price, amount, type='limit'):
      try:
        order = self.mexc_client.create_order(symbol=symbol, side=side, price=price, amount=amount, type=type)
        print(order)
      except InsufficientFunds as e:
        print(f"Error: Insufficient funds - {e}")
      except InvalidOrder as e:
        print(f"Error: Invalid order - {e}")
      except NetworkError as e:
        print(f"Error: Network issue - {e}")
      except Exception as e:
        print(f"Error: {e}")

簡単にエラータイプを説明します。

ccxt – documentationを参考にしていますのでさらに詳しく知りたい方はご覧になってみてください。

エラータイプ
InsufficientFunds

注文を出すためにアカウントの残高に十分な通貨がない場合に発生します。

InvalidOrder

注文APIに関連するすべての例外の基本クラスです。
例えば、注文に指定された価格や数量が無効な場合発生します。

NetworkError

通信に関連する問題が発生した場合に発生するエラー。
ネットワークの切断、API サーバーへのアクセス不可などの場合に発生します。

Exception

その他の一般的な例外に対するキャッチ。
他の特定のエラータイプ以外の予期せぬエラーが発生した場合に発生します。


Pythonを学ぶならやはりAIスキルにも興味があると思います。

そこでオススメのスクールがAidemy PREMIUMとなります。

未経験でもAIを使いたい人にオススメのスクールです。

無料で相談もできるので迷った方は個別相談をしてみてください。

Aidemy Premiumより 引用

\ 無料で個別相談 /

APIの取り扱い・注意事項

認証情報の厳重な管理

APIキーおよびシークレットキーは慎重に管理し、安全な場所に保存してください。これらの情報が漏洩すると、悪意あるアクセスや不正利用のリスクが生じます。

エラー処理の実装

API呼び出し時にはエラーが発生する可能性があります。

適切なエラーハンドリングを行い、エラーコードやメッセージを適切に処理してください。

自己責任

仮想通貨のAPIの使用は「自己責任」とし、自身でキーや資産を管理してください。

自動売買 pythonライブラリccxtの使い方 まとめ

本記事では「pythonライブラリccxtの使い方」ついて解説しました。

この記事で分かること
  • ccxtとは
  • ccxtのインストール方法
  • ccxtの使い方

ccxtは暗号資産のAPIを使うのにとても便利なツールです。

「ライブラリ」と聞くと難しそうなイメージがありますが、意外と簡単に扱えたのではないですか?

Narazu

ccxt以外と簡単だ

pythonとライブラリは切っても切り離せません。

プログラミング初心者にとって「ライブラリ」は強い味方です。

初心者こそ積極的にライブラリを使いましょう!

この記事を参考にccxtを使って「何かプログラムを作る」ことの楽しさやキッカケになれば嬉しいです。

最後まで読んでくださいありがとうございました。


MEXC公式ページ

BYBIT公式ページ

コインチェック公式ページ


プログラミング初心者を抜け出したい方

スキルハックス公式ページ


未経験でもAIスキルを身につけたい方

Aidemy PREMIUM公式ページ

\ 無料で個別相談 /


コインチェックのAPI取得がまだの方はこちらを参考にどうぞ。

海外の取引所のAPIを使ってみたい方はこちらを参考にどうぞ。


Cardanoについての記事を書いていますので興味のある方はぜひご覧ください。


まだブログで月1万円稼いでいない方はこちらからの記事を参考にしてみて下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次