ccxt-python
Pythonで暗号資産取引所を操作するためのCCXTライブラリ活用スキルです。REST APIによる標準接続とWebSocket APIによるリアルタイムストリーミングの両方に対応し、取引所への接続・市場データ取得・注文処理・認証管理・エラーハンドリングをサポートします。トレーディングBot、データ分析、ポートフォリオ管理など、Pythonプロジェクトで暗号資産取引所を扱う際に活用でき、同期・非同期(asyncio)どちらの実装にも対応します。
description の原文を見る
CCXT cryptocurrency exchange library for Python developers. Covers both REST API (standard) and WebSocket API (real-time). Helps install CCXT, connect to exchanges, fetch market data, place orders, stream live tickers/orderbooks, handle authentication, and manage errors in Python. Use when working with crypto exchanges in Python projects, trading bots, data analysis, or portfolio management. Supports both sync and async (asyncio) usage.
SKILL.md 本文
Python用CCXT
Python プロジェクトで仮想通貨取引所統合を行うためのCCXT使用ガイドです。
インストール
REST API(標準)
pip install ccxt
WebSocket API(リアルタイム、ccxt.pro)
pip install ccxt
オプションのパフォーマンス向上
pip install orjson # より高速なJSON解析
pip install coincurve # より高速なECDSA署名(45ms → 0.05ms)
REST APIとWebSocket APIは両方とも同じパッケージに含まれています。
クイックスタート
REST API - 同期処理
import ccxt
exchange = ccxt.binance()
exchange.load_markets()
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker)
REST API - 非同期処理
import asyncio
import ccxt.async_support as ccxt
async def main():
exchange = ccxt.binance()
await exchange.load_markets()
ticker = await exchange.fetch_ticker('BTC/USDT')
print(ticker)
await exchange.close() # 重要!
asyncio.run(main())
WebSocket API - リアルタイム更新
import asyncio
import ccxt.pro as ccxtpro
async def main():
exchange = ccxtpro.binance()
while True:
ticker = await exchange.watch_ticker('BTC/USDT')
print(ticker) # ライブ更新!
await exchange.close()
asyncio.run(main())
REST vs WebSocket
| インポート | REST向け | WebSocket向け |
|---|---|---|
| 同期 | import ccxt | (WebSocketは非同期が必須) |
| 非同期 | import ccxt.async_support as ccxt | import ccxt.pro as ccxtpro |
| 機能 | REST API | WebSocket API |
|---|---|---|
| 用途 | ワンタイムクエリ、注文発注 | リアルタイムモニタリング、ライブ価格フィード |
| メソッドの接頭辞 | fetch_* (fetch_ticker, fetch_order_book) | watch_* (watch_ticker, watch_order_book) |
| 速度 | より遅い(HTTPリクエスト/レスポンス) | より高速(永続的な接続) |
| レート制限 | 厳しい(1-2 req/秒) | より緩い(連続ストリーム) |
| 最適な用途 | 取引、アカウント管理 | 価格モニタリング、アービトラージ検出 |
REST を使用する場合:
- 注文を発注する
- アカウント残高を取得する
- ワンタイムのデータクエリ
- 注文管理(キャンセル、注文取得)
WebSocket を使用する場合:
- リアルタイムの価格モニタリング
- ライブオーダーブック更新
- アービトラージ検出
- ライブ更新でのポートフォリオ追跡
Exchange インスタンスの作成
REST API - 同期処理
import ccxt
# パブリック API(認証なし)
exchange = ccxt.binance({
'enableRateLimit': True # 推奨!
})
# プライベート API(認証あり)
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'enableRateLimit': True
})
REST API - 非同期処理
import ccxt.async_support as ccxt
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
'enableRateLimit': True
})
# 終了時は必ずクローズ
await exchange.close()
WebSocket API
import ccxt.pro as ccxtpro
# パブリック WebSocket
exchange = ccxtpro.binance()
# プライベート WebSocket(認証あり)
exchange = ccxtpro.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET'
})
# 終了時は必ずクローズ
await exchange.close()
一般的なREST操作
マーケットのロード
# すべての利用可能な取引ペアをロード
exchange.load_markets()
# マーケット情報にアクセス
btc_market = exchange.market('BTC/USDT')
print(btc_market['limits']['amount']['min']) # 最小注文量
ティッカーの取得
# シングルティッカー
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last']) # 最終価格
print(ticker['bid']) # 最高買値
print(ticker['ask']) # 最安売値
print(ticker['volume']) # 24時間出来高
# 複数ティッカー(サポートされている場合)
tickers = exchange.fetch_tickers(['BTC/USDT', 'ETH/USDT'])
オーダーブックの取得
# 完全なオーダーブック
orderbook = exchange.fetch_order_book('BTC/USDT')
print(orderbook['bids'][0]) # [価格、量]
print(orderbook['asks'][0]) # [価格、量]
# 制限付きの深さ
orderbook = exchange.fetch_order_book('BTC/USDT', 5) # 上位5レベル
注文の作成
リミット注文
# 買いリミット注文
order = exchange.create_limit_buy_order('BTC/USDT', 0.01, 50000)
print(order['id'])
# 売りリミット注文
order = exchange.create_limit_sell_order('BTC/USDT', 0.01, 60000)
# 汎用リミット注文
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000)
マーケット注文
# 買いマーケット注文
order = exchange.create_market_buy_order('BTC/USDT', 0.01)
# 売りマーケット注文
order = exchange.create_market_sell_order('BTC/USDT', 0.01)
# 汎用マーケット注文
order = exchange.create_order('BTC/USDT', 'market', 'sell', 0.01)
残高の取得
balance = exchange.fetch_balance()
print(balance['BTC']['free']) # 利用可能な残高
print(balance['BTC']['used']) # 注文中の残高
print(balance['BTC']['total']) # 合計残高
注文の取得
# オープン注文
open_orders = exchange.fetch_open_orders('BTC/USDT')
# 決済済み注文
closed_orders = exchange.fetch_closed_orders('BTC/USDT')
# すべての注文(オープン+決済済み)
all_orders = exchange.fetch_orders('BTC/USDT')
# IDによる単一注文
order = exchange.fetch_order(order_id, 'BTC/USDT')
トレードの取得
# 最近のパブリックトレード
trades = exchange.fetch_trades('BTC/USDT', limit=10)
# あなたのトレード(認証が必須)
my_trades = exchange.fetch_my_trades('BTC/USDT')
注文のキャンセル
# 単一注文のキャンセル
exchange.cancel_order(order_id, 'BTC/USDT')
# シンボルのすべての注文をキャンセル
exchange.cancel_all_orders('BTC/USDT')
WebSocket 操作(リアルタイム)
ティッカーのウォッチ(ライブ価格更新)
import asyncio
import ccxt.pro as ccxtpro
async def main():
exchange = ccxtpro.binance()
while True:
ticker = await exchange.watch_ticker('BTC/USDT')
print(ticker['last'], ticker['timestamp'])
await exchange.close()
asyncio.run(main())
オーダーブックのウォッチ(ライブ深さ更新)
async def main():
exchange = ccxtpro.binance()
while True:
orderbook = await exchange.watch_order_book('BTC/USDT')
print('Best bid:', orderbook['bids'][0])
print('Best ask:', orderbook['asks'][0])
await exchange.close()
asyncio.run(main())
トレードのウォッチ(ライブトレードストリーム)
async def main():
exchange = ccxtpro.binance()
while True:
trades = await exchange.watch_trades('BTC/USDT')
for trade in trades:
print(trade['price'], trade['amount'], trade['side'])
await exchange.close()
asyncio.run(main())
あなたの注文のウォッチ(ライブ注文更新)
async def main():
exchange = ccxtpro.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET'
})
while True:
orders = await exchange.watch_orders('BTC/USDT')
for order in orders:
print(order['id'], order['status'], order['filled'])
await exchange.close()
asyncio.run(main())
残高のウォッチ(ライブ残高更新)
async def main():
exchange = ccxtpro.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET'
})
while True:
balance = await exchange.watch_balance()
print('BTC:', balance['BTC'])
print('USDT:', balance['USDT'])
await exchange.close()
asyncio.run(main())
複数シンボルのウォッチ
async def main():
exchange = ccxtpro.binance()
symbols = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT']
while True:
# すべてのシンボルを同時にウォッチ
tickers = await exchange.watch_tickers(symbols)
for symbol, ticker in tickers.items():
print(symbol, ticker['last'])
await exchange.close()
asyncio.run(main())
完全なメソッドリファレンス
マーケットデータメソッド
ティッカーと価格
fetchTicker(symbol)- 1つのシンボルのティッカーを取得fetchTickers([symbols])- 複数のティッカーを一度に取得fetchBidsAsks([symbols])- 複数シンボルの最高買値/最安売値を取得fetchLastPrices([symbols])- 最終価格を取得fetchMarkPrices([symbols])- マーク価格を取得(デリバティブ)
オーダーブック
fetchOrderBook(symbol, limit)- オーダーブックを取得fetchOrderBooks([symbols])- 複数のオーダーブックを取得fetchL2OrderBook(symbol)- レベル2オーダーブックを取得fetchL3OrderBook(symbol)- レベル3オーダーブックを取得(サポートされている場合)
トレード
fetchTrades(symbol, since, limit)- パブリックトレードを取得fetchMyTrades(symbol, since, limit)- あなたのトレードを取得(認証が必須)fetchOrderTrades(orderId, symbol)- 特定の注文のトレードを取得
OHLCV(ローソク足)
fetchOHLCV(symbol, timeframe, since, limit)- ローソク足データを取得fetchIndexOHLCV(symbol, timeframe)- インデックス価格OHLCVを取得fetchMarkOHLCV(symbol, timeframe)- マーク価格OHLCVを取得fetchPremiumIndexOHLCV(symbol, timeframe)- プレミアムインデックスOHLCVを取得
アカウントと残高
fetchBalance()- アカウント残高を取得(認証が必須)fetchAccounts()- サブアカウントを取得fetchLedger(code, since, limit)- レジャー履歴を取得fetchLedgerEntry(id, code)- 特定のレジャーエントリを取得fetchTransactions(code, since, limit)- トランザクションを取得fetchDeposits(code, since, limit)- 入金履歴を取得fetchWithdrawals(code, since, limit)- 出金履歴を取得fetchDepositsWithdrawals(code, since, limit)- 入金と出金の両方を取得
トレーディングメソッド
注文の作成
createOrder(symbol, type, side, amount, price, params)- 注文を作成(汎用)createLimitOrder(symbol, side, amount, price)- リミット注文を作成createMarketOrder(symbol, side, amount)- マーケット注文を作成createLimitBuyOrder(symbol, amount, price)- 買いリミット注文createLimitSellOrder(symbol, amount, price)- 売りリミット注文createMarketBuyOrder(symbol, amount)- 買いマーケット注文createMarketSellOrder(symbol, amount)- 売りマーケット注文createMarketBuyOrderWithCost(symbol, cost)- 特定のコストで買うcreateStopLimitOrder(symbol, side, amount, price, stopPrice)- ストップリミット注文createStopMarketOrder(symbol, side, amount, stopPrice)- ストップマーケット注文createStopLossOrder(symbol, side, amount, stopPrice)- ストップロス注文createTakeProfitOrder(symbol, side, amount, takeProfitPrice)- テイクプロフィット注文createTrailingAmountOrder(symbol, side, amount, trailingAmount)- トレーリングストップcreateTrailingPercentOrder(symbol, side, amount, trailingPercent)- トレーリングストップ%createTriggerOrder(symbol, side, amount, triggerPrice)- トリガー注文createPostOnlyOrder(symbol, side, amount, price)- ポストオンリー注文createReduceOnlyOrder(symbol, side, amount, price)- リデュースオンリー注文createOrders([orders])- 複数の注文を一度に作成createOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)- OCO注文
注文の管理
fetchOrder(orderId, symbol)- 単一注文を取得fetchOrders(symbol, since, limit)- すべての注文を取得fetchOpenOrders(symbol, since, limit)- オープン注文を取得fetchClosedOrders(symbol, since, limit)- 決済済み注文を取得fetchCanceledOrders(symbol, since, limit)- キャンセル済み注文を取得fetchOpenOrder(orderId, symbol)- 特定のオープン注文を取得fetchOrdersByStatus(status, symbol)- ステータスで注文を取得cancelOrder(orderId, symbol)- 単一注文をキャンセルcancelOrders([orderIds], symbol)- 複数の注文をキャンセルcancelAllOrders(symbol)- シンボルのすべての注文をキャンセルeditOrder(orderId, symbol, type, side, amount, price)- 注文を変更
マージンとレバレッジ
fetchBorrowRate(code)- マージン用借入レートを取得fetchBorrowRates([codes])- 複数の借入レートを取得fetchBorrowRateHistory(code, since, limit)- 借入レート履歴fetchCrossBorrowRate(code)- クロスマージン借入レートfetchIsolatedBorrowRate(symbol, code)- 分離マージン借入レートborrowMargin(code, amount, symbol)- マージンを借りるrepayMargin(code, amount, symbol)- マージンを返済するfetchLeverage(symbol)- レバレッジを取得setLeverage(leverage, symbol)- レバレッジを設定fetchLeverageTiers(symbols)- レバレッジティアを取得fetchMarketLeverageTiers(symbol)- マーケットのレバレッジティアsetMarginMode(marginMode, symbol)- マージンモードを設定(クロス/分離)fetchMarginMode(symbol)- マージンモードを取得
デリバティブとフューチャーズ
ポジション
fetchPosition(symbol)- 単一ポジションを取得fetchPositions([symbols])- すべてのポジションを取得fetchPositionsForSymbol(symbol)- シンボルのポジションを取得fetchPositionHistory(symbol, since, limit)- ポジション履歴fetchPositionsHistory(symbols, since, limit)- 複数ポジション履歴fetchPositionMode(symbol)- ポジションモードを取得(ワンウェイ/ヘッジ)setPositionMode(hedged, symbol)- ポジションモードを設定closePosition(symbol, side)- ポジションをクローズcloseAllPositions()- すべてのポジションをクローズ
ファンディングと決済
fetchFundingRate(symbol)- 現在のファンディングレートfetchFundingRates([symbols])- 複数のファンディングレートfetchFundingRateHistory(symbol, since, limit)- ファンディングレート履歴fetchFundingHistory(symbol, since, limit)- あなたのファンディング支払いfetchFundingInterval(symbol)- ファンディング間隔fetchSettlementHistory(symbol, since, limit)- 決済履歴fetchMySettlementHistory(symbol, since, limit)- あなたの決済履歴
オープンインタレストとリクイデーション
fetchOpenInterest(symbol)- シンボルのオープンインタレストfetchOpenInterests([symbols])- 複数のオープンインタレストfetchOpenInterestHistory(symbol, timeframe, since, limit)- OI履歴fetchLiquidations(symbol, since, limit)- パブリックリクイデーションfetchMyLiquidations(symbol, since, limit)- あなたのリクイデーション
オプション
fetchOption(symbol)- オプション情報を取得fetchOptionChain(code)- オプションチェーンを取得fetchGreeks(symbol)- オプションのギリシャ文字を取得fetchVolatilityHistory(code, since, limit)- ボラティリティ履歴fetchUnderlyingAssets()- 原資産を取得
手数料と制限
fetchTradingFee(symbol)- シンボルの取引手数料fetchTradingFees([symbols])- 複数シンボルの取引手数料fetchTradingLimits([symbols])- 取引制限fetchTransactionFee(code)- トランザクション/出金手数料fetchTransactionFees([codes])- 複数のトランザクション手数料fetchDepositWithdrawFee(code)- 入出金手数料fetchDepositWithdrawFees([codes])- 複数の入出金手数料
入金と出金
fetchDepositAddress(code, params)- 入金アドレスを取得fetchDepositAddresses([codes])- 複数の入金アドレスを取得fetchDepositAddressesByNetwork(code)- ネットワーク別のアドレスcreateDepositAddress(code, params)- 新しい入金アドレスを作成fetchDeposit(id, code)- 単一の入金を取得fetchWithdrawal(id, code)- 単一の出金を取得fetchWithdrawAddresses(code)- 出金アドレスを取得fetchWithdrawalWhitelist(code)- ホワイトリストを取得withdraw(code, amount, address, tag, params)- 資金を出金deposit(code, amount, params)- 資金を入金(サポートされている場合)
転送と変換
transfer(code, amount, fromAccount, toAccount)- 内部転送fetchTransfer(id, code)- 転送情報を取得fetchTransfers(code, since, limit)- 転送履歴を取得fetchConvertCurrencies()- 変換可能な通貨fetchConvertQuote(fromCode, toCode, amount)- 変換見積もりを取得createConvertTrade(fromCode, toCode, amount)- 変換を実行fetchConvertTrade(id)- 変換トレードを取得fetchConvertTradeHistory(code, since, limit)- 変換履歴
マーケット情報
fetchMarkets()- すべてのマーケットを取得fetchCurrencies()- すべての通貨を取得fetchTime()- 取引所のサーバー時刻を取得fetchStatus()- 取引所のステータスを取得fetchBorrowInterest(code, symbol, since, limit)- 支払った借入利息fetchLongShortRatio(symbol, timeframe, since, limit)- ロング/ショート比fetchLongShortRatioHistory(symbol, timeframe, since, limit)- L/S比履歴
WebSocket メソッド (ccxt.pro)
すべてのRESTメソッドは watch* プレフィックスを持つWebSocket同等メソッドを持ちます:
リアルタイムマーケットデータ
watchTicker(symbol)- 単一ティッカーをウォッチwatchTickers([symbols])- 複数のティッカーをウォッチwatchOrderBook(symbol)- オーダーブック更新をウォッチwatchOrderBookForSymbols([symbols])- 複数のオーダーブックをウォッチwatchTrades(symbol)- パブリックトレードをウォッチwatchOHLCV(symbol, timeframe)- ローソク足更新をウォッチwatchBidsAsks([symbols])- 最高買値/最安売値をウォッチ
リアルタイムアカウントデータ(認証が必須)
watchBalance()- 残高更新をウォッチwatchOrders(symbol)- あなたの注文更新をウォッチwatchMyTrades(symbol)- あなたのトレード更新をウォッチwatchPositions([symbols])- ポジション更新をウォッチwatchPositionsForSymbol(symbol)- シンボルのポジションをウォッチ
認証が必須
🔒 としてマークされたメソッドはAPI認証情報が必須です:
- すべての
create*メソッド(注文作成、アドレス作成) - すべての
cancel*メソッド(注文キャンセル) - すべての
edit*メソッド(注文変更) - すべての
fetchMy*メソッド(あなたのトレード、注文) fetchBalance,fetchLedger,fetchAccountswithdraw,transfer,deposit- マージン/レバレッジメソッド
- ポジションメソッド
watchBalance,watchOrders,watchMyTrades,watchPositions
メソッド可用性の確認
すべての取引所がすべてのメソッドをサポートしているわけではありません。使用前に確認してください:
// メソッドがサポートされているか確認
if (exchange.has['fetchOHLCV']) {
const candles = await exchange.fetchOHLCV('BTC/USDT', '1h')
}
// 複数の機能を確認
console.log(exchange.has)
// {
// fetchTicker: true,
// fetchOHLCV: true,
// fetchMyTrades: true,
// fetchPositions: false,
// ...
// }
メソッド命名規約
fetch*- REST APIメソッド(HTTPリクエスト)watch*- WebSocketメソッド(リアルタイムストリーム)create*- 新しいリソースを作成(注文、アドレス)cancel*- 既存のリソースをキャンセルedit*- 既存のリソースを変更set*- 設定を構成(レバレッジ、マージンモード)*Wsサフィックス - WebSocketバリアント(一部の取引所)
プロキシ設定
CCXTはHTTP、HTTPS、SOCKSプロキシをREST APIとWebSocket接続の両方でサポートしています。
プロキシの設定
// HTTPプロキシ
exchange.httpProxy = 'http://your-proxy-host:port'
// HTTPSプロキシ
exchange.httpsProxy = 'https://your-proxy-host:port'
// SOCKSプロキシ
exchange.socksProxy = 'socks://your-proxy-host:port'
// 認証付きプロキシ
exchange.httpProxy = 'http://user:pass@proxy-host:port'
WebSocket のプロキシ
WebSocket接続もプロキシ設定を遵守します:
exchange.httpsProxy = 'https://proxy:8080'
// WebSocket接続はこのプロキシを使用します
プロキシ接続のテスト
exchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('Proxy working!')
} catch (error) {
console.error('Proxy connection failed:', error)
}
WebSocket固有のメソッド
一部の取引所では、RESTメソッドのWebSocketバリアントが提供され、より高速な注文発注と管理が可能です。これらは *Ws サフィックスを使用します:
WebSocket経由でのトレード
注文の作成:
createOrderWs- WebSocket経由で注文を作成(RESTより高速)createLimitOrderWs- WebSocket経由でリミット注文を作成createMarketOrderWs- WebSocket経由でマーケット注文を作成createLimitBuyOrderWs- WebSocket経由で買いリミット注文createLimitSellOrderWs- WebSocket経由で売りリミット注文createMarketBuyOrderWs- WebSocket経由で買いマーケット注文createMarketSellOrderWs- WebSocket経由で売りマーケット注文createStopLimitOrderWs- WebSocket経由でストップリミット注文createStopMarketOrderWs- WebSocket経由でストップマーケット注文createStopLossOrderWs- WebSocket経由でストップロス注文createTakeProfitOrderWs- WebSocket経由でテイクプロフィット注文createTrailingAmountOrderWs- WebSocket経由でトレーリングストップcreateTrailingPercentOrderWs- WebSocket経由でトレーリングストップ%createPostOnlyOrderWs- WebSocket経由でポストオンリー注文createReduceOnlyOrderWs- WebSocket経由でリデュースオンリー注文
注文の管理:
editOrderWs- WebSocket経由で注文を編集cancelOrderWs- WebSocket経由で注文をキャンセル(RESTより高速)cancelOrdersWs- WebSocket経由で複数の注文をキャンセルcancelAllOrdersWs- WebSocket経由ですべての注文をキャンセル
データの取得:
fetchOrderWs- WebSocket経由で注文を取得fetchOrdersWs- WebSocket経由で注文を取得fetchOpenOrdersWs- WebSocket経由でオープン注文を取得fetchClosedOrdersWs- WebSocket経由で決済済み注文を取得fetchMyTradesWs- WebSocket経由であなたのトレードを取得fetchBalanceWs- WebSocket経由で残高を取得fetchPositionWs- WebSocket経由でポジションを取得fetchPositionsWs- WebSocket経由でポジションを取得fetchPositionsForSymbolWs- WebSocket経由でシンボルのポジションを取得fetchTradingFeesWs- WebSocket経由で取引手数料を取得
WebSocket メソッドを使用する場合
*Ws メソッドを使用する場合:
- より高速な注文発注が必要(低レイテンシ)
- すでにWebSocket経由で接続している
- REST APIレート制限の使用を減らしたい
- 取引戦略が100ms以下のレイテンシを必要とする
RESTメソッドを使用する場合:
- 確実な実行確認が必要
- ワンオフリクエストを行う
- 取引所がWebSocketバリアントをサポートしていない
- 詳細なエラーレスポンスが必要
例:注文発注の比較
REST API(遅い、より信頼性が高い):
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
WebSocket API(高速、低レイテンシ):
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
WebSocket メソッド可用性の確認
すべての取引所がWebSocketトレードメソッドをサポートしているわけではありません:
if (exchange.has['createOrderWs']) {
// 取引所はWebSocket注文作成をサポート
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} else {
// RESTにフォールバック
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
}
認証
API キーの設定
import os
# インスタンス化時に設定(推奨)
exchange = ccxt.binance({
'apiKey': os.environ.get('BINANCE_API_KEY'),
'secret': os.environ.get('BINANCE_SECRET'),
'enableRateLimit': True
})
# インスタンス化後に設定
exchange.apiKey = os.environ.get('BINANCE_API_KEY')
exchange.secret = os.environ.get('BINANCE_SECRET')
認証のテスト
try:
balance = exchange.fetch_balance()
print('認証成功!')
except ccxt.AuthenticationError:
print('無効なAPI認証情報')
エラーハンドリング
例外の階層
BaseError
├─ NetworkError(回復可能 - リトライ)
│ ├─ RequestTimeout
│ ├─ ExchangeNotAvailable
│ ├─ RateLimitExceeded
│ └─ DDoSProtection
└─ ExchangeError(回復不可 - リトライしない)
├─ AuthenticationError
├─ InsufficientFunds
├─ InvalidOrder
└─ NotSupported
基本的なエラーハンドリング
import ccxt
try:
ticker = exchange.fetch_ticker('BTC/USDT')
except ccxt.NetworkError as e:
print('ネットワークエラー - リトライ:', str(e))
except ccxt.ExchangeError as e:
print('取引所エラー - リトライしない:', str(e))
except Exception as e:
print('不明なエラー:', str(e))
特定の例外ハンドリング
try:
order = exchange.create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000)
except ccxt.InsufficientFunds:
print('残高不足')
except ccxt.InvalidOrder:
print('無効な注文パラメータ')
except ccxt.RateLimitExceeded:
print('レート制限に達しました - リトライ前に待機')
exchange.sleep(1000) # 1秒待機
except ccxt.AuthenticationError:
print('APIクレデンシャルを確認してください')
ネットワークエラーのリトライロジック
def fetch_with_retry(max_retries=3):
for i in range(max_retries):
try:
return exchange.fetch_ticker('BTC/USDT')
except ccxt.NetworkError:
if i < max_retries - 1:
print(f'リトライ {i + 1}/{max_retries}')
exchange.sleep(1000 * (i + 1)) # 指数バックオフ
else:
raise
非同期 vs 同期
同期を使用する場合
- シンプルなスクリプト
- 単一の取引所操作
- Jupyter notebook
- クイックテスト
非同期を使用する場合
- 複数の同時操作
- WebSocket接続(必須)
- 高パフォーマンスな取引ボット
- 複数取引所のモニタリング
同期の例
import ccxt
exchange = ccxt.binance({'enableRateLimit': True})
ticker = exchange.fetch_ticker('BTC/USDT')
print(ticker['last'])
非同期の例
import asyncio
import ccxt.async_support as ccxt
async def main():
exchange = ccxt.binance({'enableRateLimit': True})
ticker = await exchange.fetch_ticker('BTC/USDT')
print(ticker['last'])
await exchange.close()
asyncio.run(main())
複数取引所の非同期
async def fetch_all():
exchanges = [
ccxt.binance({'enableRateLimit': True}),
ccxt.coinbase({'enableRateLimit': True}),
ccxt.kraken({'enableRateLimit': True})
]
# 同時に取得
tasks = [ex.fetch_ticker('BTC/USDT') for ex in exchanges]
tickers = await asyncio.gather(*tasks, return_exceptions=True)
for ex, ticker in zip(exchanges, tickers):
if isinstance(ticker, Exception):
print(f'{ex.id}: エラー - {ticker}')
else:
print(f'{ex.id}: ${ticker["last"]}')
await ex.close()
asyncio.run(fetch_all())
レート制限
組み込みレート制限機能(推奨)
exchange = ccxt.binance({
'enableRateLimit': True # 自動的にリクエストを調整
})
手動遅延
exchange.fetch_ticker('BTC/USDT')
exchange.sleep(1000) # 1秒待機(ミリ秒)
exchange.fetch_ticker('ETH/USDT')
レート制限の確認
print(exchange.rateLimit) # リクエスト間のミリ秒
一般的な落とし穴
非同期モードで await を忘れる
# 誤り - コルーチンを返し、データではない
async def wrong():
ticker = exchange.fetch_ticker('BTC/USDT') # awaitなし!
print(ticker['last']) # エラー
# 正しい
async def correct():
ticker = await exchange.fetch_ticker('BTC/USDT')
print(ticker['last']) # 動作!
WebSocket に同期を使用する
# 誤り - WebSocketは非同期が必須
import ccxt.pro as ccxtpro
exchange = ccxtpro.binance()
ticker = exchange.watch_ticker('BTC/USDT') # エラー: awaitが必須!
# 正しい
import asyncio
import ccxt.pro as ccxtpro
async def main():
exchange = ccxtpro.binance()
ticker = await exchange.watch_ticker('BTC/USDT')
await exchange.close()
asyncio.run(main())
非同期 exchange をクローズし忘れる
# 誤り - リソースリーク
async def wrong():
exchange = ccxt.binance()
await exchange.fetch_ticker('BTC/USDT')
# クローズを忘れた!
# 正しい
async def correct():
exchange = ccxt.binance()
try:
await exchange.fetch_ticker('BTC/USDT')
finally:
await exchange.close()
非同期コード内で同期を使用する
# 誤り - イベントループをブロック
async def wrong():
exchange = ccxt.binance() # 同期インポート!
ticker = exchange.fetch_ticker('BTC/USDT') # ブロッキング!
# 正しい
import ccxt.async_support as ccxt
async def correct():
exchange = ccxt.binance()
ticker = await exchange.fetch_ticker('BTC/USDT')
await exchange.close()
リアルタイムモニタリングに REST を使用する
# 誤り - レート制限を無駄にする
while True:
ticker = exchange.fetch_ticker('BTC/USDT') # REST
print(ticker['last'])
exchange.sleep(1000)
# 正しい - WebSocket を使用
import ccxt.pro as ccxtpro
async def correct():
exchange = ccxtpro.binance()
while True:
ticker = await exchange.watch_ticker('BTC/USDT') # WebSocket
print(ticker['last'])
await exchange.close()
トラブルシューティング
一般的な問題
1. "ModuleNotFoundError: No module named 'ccxt'"
- 解決策:
pip install ccxtを実行
2. "RateLimitExceeded"
- 解決策: レート制限を有効にする:
'enableRateLimit': True - または、リクエスト間に手動遅延を追加
3. "AuthenticationError"
- 解決策: API キーとシークレットを確認
- 取引所でAPI キーの権限を確認
- システムクロックが同期していることを確認(NTP を使用)
4. "InvalidNonce"
- 解決策: システムクロックを同期
- 1つのAPI キーで複数の exchange インスタンスを使用しない
5. "InsufficientFunds"
- 解決策: 利用可能な残高を確認(
balance['BTC']['free']) - 取引手数料を考慮
6. "ExchangeNotAvailable"
- 解決策: 取引所のステータス/メンテナンスを確認
- 遅延後にリトライ
**7. SSL/証明書エラー
- 解決策: certifi をアップグレード:
pip install --upgrade certifi
**8. パフォーマンスが遅い
- 解決策: パフォーマンス向上をインストール:
pip install orjson(高速JSON)pip install coincurve(高速署名)
デバッグ
# 詳細ログを有効にする
exchange.verbose = True
# 取引所の機能を確認
print(exchange.has)
# {
# 'fetchTicker': True,
# 'fetchOrderBook': True,
# 'createOrder': True,
# ...
# }
# マーケット情報を確認
print(exchange.markets['BTC/USDT'])
# 最後のリクエスト/レスポンスを確認
print(exchange.last_http_response)
print(exchange.last_json_response)
さらに詳しく
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
Source: https://github.com/ccxt/ccxt / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。