Claude-skill-registry ccxt-typescript
CCXT cryptocurrency exchange library for TypeScript and JavaScript developers (Node.js and browser). 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. Use when working with crypto exchanges in TypeScript/JavaScript projects, trading bots, arbitrage systems, or portfolio management tools. Includes both REST and WebSocket examples.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/ccxt-typescript" ~/.claude/skills/majiayu000-claude-skill-registry-ccxt-typescript && rm -rf "$T"
skills/data/ccxt-typescript/SKILL.mdCCXT for TypeScript/JavaScript
A comprehensive guide to using CCXT in TypeScript and JavaScript projects for cryptocurrency exchange integration.
Installation
REST API (Standard CCXT)
npm install ccxt
WebSocket API (Real-time, ccxt.pro)
npm install ccxt
Both REST and WebSocket APIs are included in the same package.
Quick Start
REST API - TypeScript
import ccxt from 'ccxt' const exchange = new ccxt.binance() await exchange.loadMarkets() const ticker = await exchange.fetchTicker('BTC/USDT') console.log(ticker)
REST API - JavaScript (CommonJS)
const ccxt = require('ccxt') (async () => { const exchange = new ccxt.binance() await exchange.loadMarkets() const ticker = await exchange.fetchTicker('BTC/USDT') console.log(ticker) })()
WebSocket API - Real-time Updates
import ccxt from 'ccxt' const exchange = new ccxt.pro.binance() while (true) { const ticker = await exchange.watchTicker('BTC/USDT') console.log(ticker) // Live updates! } await exchange.close()
REST vs WebSocket
| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Method prefix | (fetchTicker, fetchOrderBook) | (watchTicker, watchOrderBook) |
| Speed | Slower (HTTP request/response) | Faster (persistent connection) |
| Rate limits | Strict (1-2 req/sec) | More lenient (continuous stream) |
| Import | | |
| Best for | Trading, account management | Price monitoring, arbitrage detection |
When to use REST:
- Placing orders
- Fetching account balance
- One-time data queries
- Order management (cancel, fetch orders)
When to use WebSocket:
- Real-time price monitoring
- Live orderbook updates
- Arbitrage detection
- Portfolio tracking with live updates
Creating Exchange Instance
REST API
// Public API (no authentication) const exchange = new ccxt.binance({ enableRateLimit: true // Recommended! }) // Private API (with authentication) const exchange = new ccxt.binance({ apiKey: 'YOUR_API_KEY', secret: 'YOUR_SECRET', enableRateLimit: true })
WebSocket API
// Public WebSocket const exchange = new ccxt.pro.binance() // Private WebSocket (with authentication) const exchange = new ccxt.pro.binance({ apiKey: 'YOUR_API_KEY', secret: 'YOUR_SECRET' }) // Always close when done await exchange.close()
Common REST Operations
Loading Markets
// Load all available trading pairs await exchange.loadMarkets() // Access market information const btcMarket = exchange.market('BTC/USDT') console.log(btcMarket.limits.amount.min) // Minimum order amount
Fetching Ticker
// Single ticker const ticker = await exchange.fetchTicker('BTC/USDT') console.log(ticker.last) // Last price console.log(ticker.bid) // Best bid console.log(ticker.ask) // Best ask console.log(ticker.volume) // 24h volume // Multiple tickers (if supported) const tickers = await exchange.fetchTickers(['BTC/USDT', 'ETH/USDT'])
Fetching Order Book
// Full orderbook const orderbook = await exchange.fetchOrderBook('BTC/USDT') console.log(orderbook.bids[0]) // [price, amount] console.log(orderbook.asks[0]) // [price, amount] // Limited depth const orderbook = await exchange.fetchOrderBook('BTC/USDT', 5) // Top 5 levels
Creating Orders
Limit Order
// Buy limit order const order = await exchange.createLimitBuyOrder('BTC/USDT', 0.01, 50000) console.log(order.id) // Sell limit order const order = await exchange.createLimitSellOrder('BTC/USDT', 0.01, 60000) // Generic limit order const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
Market Order
// Buy market order const order = await exchange.createMarketBuyOrder('BTC/USDT', 0.01) // Sell market order const order = await exchange.createMarketSellOrder('BTC/USDT', 0.01) // Generic market order const order = await exchange.createOrder('BTC/USDT', 'market', 'sell', 0.01)
Fetching Balance
const balance = await exchange.fetchBalance() console.log(balance.BTC.free) // Available balance console.log(balance.BTC.used) // Balance in orders console.log(balance.BTC.total) // Total balance
Fetching Orders
// Open orders const openOrders = await exchange.fetchOpenOrders('BTC/USDT') // Closed orders const closedOrders = await exchange.fetchClosedOrders('BTC/USDT') // All orders (open + closed) const allOrders = await exchange.fetchOrders('BTC/USDT') // Single order by ID const order = await exchange.fetchOrder(orderId, 'BTC/USDT')
Fetching Trades
// Recent public trades const trades = await exchange.fetchTrades('BTC/USDT', undefined, 10) // Your trades (requires authentication) const myTrades = await exchange.fetchMyTrades('BTC/USDT')
Canceling Orders
// Cancel single order await exchange.cancelOrder(orderId, 'BTC/USDT') // Cancel all orders for a symbol await exchange.cancelAllOrders('BTC/USDT')
WebSocket Operations (Real-time)
Watching Ticker (Live Price Updates)
const exchange = new ccxt.pro.binance() while (true) { const ticker = await exchange.watchTicker('BTC/USDT') console.log(ticker.last, ticker.timestamp) } await exchange.close()
Watching Order Book (Live Depth Updates)
const exchange = new ccxt.pro.binance() while (true) { const orderbook = await exchange.watchOrderBook('BTC/USDT') console.log('Best bid:', orderbook.bids[0]) console.log('Best ask:', orderbook.asks[0]) } await exchange.close()
Watching Trades (Live Trade Stream)
const exchange = new ccxt.pro.binance() while (true) { const trades = await exchange.watchTrades('BTC/USDT') for (const trade of trades) { console.log(trade.price, trade.amount, trade.side) } } await exchange.close()
Watching Your Orders (Live Order Updates)
const exchange = new ccxt.pro.binance({ apiKey: 'YOUR_API_KEY', secret: 'YOUR_SECRET' }) while (true) { const orders = await exchange.watchOrders('BTC/USDT') for (const order of orders) { console.log(order.id, order.status, order.filled) } } await exchange.close()
Watching Balance (Live Balance Updates)
const exchange = new ccxt.pro.binance({ apiKey: 'YOUR_API_KEY', secret: 'YOUR_SECRET' }) while (true) { const balance = await exchange.watchBalance() console.log('BTC:', balance.BTC) console.log('USDT:', balance.USDT) } await exchange.close()
Watching Multiple Symbols
const exchange = new ccxt.pro.binance() const symbols = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT'] while (true) { // Watch all symbols concurrently const tickers = await exchange.watchTickers(symbols) for (const symbol in tickers) { console.log(symbol, tickers[symbol].last) } } await exchange.close()
Complete Method Reference
Market Data Methods
Tickers & Prices
- Fetch ticker for one symbolfetchTicker(symbol)
- Fetch multiple tickers at oncefetchTickers([symbols])
- Fetch best bid/ask for multiple symbolsfetchBidsAsks([symbols])
- Fetch last pricesfetchLastPrices([symbols])
- Fetch mark prices (derivatives)fetchMarkPrices([symbols])
Order Books
- Fetch order bookfetchOrderBook(symbol, limit)
- Fetch multiple order booksfetchOrderBooks([symbols])
- Fetch level 2 order bookfetchL2OrderBook(symbol)
- Fetch level 3 order book (if supported)fetchL3OrderBook(symbol)
Trades
- Fetch public tradesfetchTrades(symbol, since, limit)
- Fetch your trades (auth required)fetchMyTrades(symbol, since, limit)
- Fetch trades for specific orderfetchOrderTrades(orderId, symbol)
OHLCV (Candlesticks)
- Fetch candlestick datafetchOHLCV(symbol, timeframe, since, limit)
- Fetch index price OHLCVfetchIndexOHLCV(symbol, timeframe)
- Fetch mark price OHLCVfetchMarkOHLCV(symbol, timeframe)
- Fetch premium index OHLCVfetchPremiumIndexOHLCV(symbol, timeframe)
Account & Balance
- Fetch account balance (auth required)fetchBalance()
- Fetch sub-accountsfetchAccounts()
- Fetch ledger historyfetchLedger(code, since, limit)
- Fetch specific ledger entryfetchLedgerEntry(id, code)
- Fetch transactionsfetchTransactions(code, since, limit)
- Fetch deposit historyfetchDeposits(code, since, limit)
- Fetch withdrawal historyfetchWithdrawals(code, since, limit)
- Fetch both deposits and withdrawalsfetchDepositsWithdrawals(code, since, limit)
Trading Methods
Creating Orders
- Create order (generic)createOrder(symbol, type, side, amount, price, params)
- Create limit ordercreateLimitOrder(symbol, side, amount, price)
- Create market ordercreateMarketOrder(symbol, side, amount)
- Buy limit ordercreateLimitBuyOrder(symbol, amount, price)
- Sell limit ordercreateLimitSellOrder(symbol, amount, price)
- Buy market ordercreateMarketBuyOrder(symbol, amount)
- Sell market ordercreateMarketSellOrder(symbol, amount)
- Buy with specific costcreateMarketBuyOrderWithCost(symbol, cost)
- Stop-limit ordercreateStopLimitOrder(symbol, side, amount, price, stopPrice)
- Stop-market ordercreateStopMarketOrder(symbol, side, amount, stopPrice)
- Stop-loss ordercreateStopLossOrder(symbol, side, amount, stopPrice)
- Take-profit ordercreateTakeProfitOrder(symbol, side, amount, takeProfitPrice)
- Trailing stopcreateTrailingAmountOrder(symbol, side, amount, trailingAmount)
- Trailing stop %createTrailingPercentOrder(symbol, side, amount, trailingPercent)
- Trigger ordercreateTriggerOrder(symbol, side, amount, triggerPrice)
- Post-only ordercreatePostOnlyOrder(symbol, side, amount, price)
- Reduce-only ordercreateReduceOnlyOrder(symbol, side, amount, price)
- Create multiple orders at oncecreateOrders([orders])
- OCO ordercreateOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)
Managing Orders
- Fetch single orderfetchOrder(orderId, symbol)
- Fetch all ordersfetchOrders(symbol, since, limit)
- Fetch open ordersfetchOpenOrders(symbol, since, limit)
- Fetch closed ordersfetchClosedOrders(symbol, since, limit)
- Fetch canceled ordersfetchCanceledOrders(symbol, since, limit)
- Fetch specific open orderfetchOpenOrder(orderId, symbol)
- Fetch orders by statusfetchOrdersByStatus(status, symbol)
- Cancel single ordercancelOrder(orderId, symbol)
- Cancel multiple orderscancelOrders([orderIds], symbol)
- Cancel all orders for symbolcancelAllOrders(symbol)
- Modify ordereditOrder(orderId, symbol, type, side, amount, price)
Margin & Leverage
- Fetch borrow rate for marginfetchBorrowRate(code)
- Fetch multiple borrow ratesfetchBorrowRates([codes])
- Historical borrow ratesfetchBorrowRateHistory(code, since, limit)
- Cross margin borrow ratefetchCrossBorrowRate(code)
- Isolated margin borrow ratefetchIsolatedBorrowRate(symbol, code)
- Borrow marginborrowMargin(code, amount, symbol)
- Repay marginrepayMargin(code, amount, symbol)
- Fetch leveragefetchLeverage(symbol)
- Set leveragesetLeverage(leverage, symbol)
- Fetch leverage tiersfetchLeverageTiers(symbols)
- Leverage tiers for marketfetchMarketLeverageTiers(symbol)
- Set margin mode (cross/isolated)setMarginMode(marginMode, symbol)
- Fetch margin modefetchMarginMode(symbol)
Derivatives & Futures
Positions
- Fetch single positionfetchPosition(symbol)
- Fetch all positionsfetchPositions([symbols])
- Fetch positions for symbolfetchPositionsForSymbol(symbol)
- Position historyfetchPositionHistory(symbol, since, limit)
- Multiple position historyfetchPositionsHistory(symbols, since, limit)
- Fetch position mode (one-way/hedge)fetchPositionMode(symbol)
- Set position modesetPositionMode(hedged, symbol)
- Close positionclosePosition(symbol, side)
- Close all positionscloseAllPositions()
Funding & Settlement
- Current funding ratefetchFundingRate(symbol)
- Multiple funding ratesfetchFundingRates([symbols])
- Funding rate historyfetchFundingRateHistory(symbol, since, limit)
- Your funding paymentsfetchFundingHistory(symbol, since, limit)
- Funding intervalfetchFundingInterval(symbol)
- Settlement historyfetchSettlementHistory(symbol, since, limit)
- Your settlement historyfetchMySettlementHistory(symbol, since, limit)
Open Interest & Liquidations
- Open interest for symbolfetchOpenInterest(symbol)
- Multiple open interestsfetchOpenInterests([symbols])
- OI historyfetchOpenInterestHistory(symbol, timeframe, since, limit)
- Public liquidationsfetchLiquidations(symbol, since, limit)
- Your liquidationsfetchMyLiquidations(symbol, since, limit)
Options
- Fetch option infofetchOption(symbol)
- Fetch option chainfetchOptionChain(code)
- Fetch option greeksfetchGreeks(symbol)
- Volatility historyfetchVolatilityHistory(code, since, limit)
- Fetch underlying assetsfetchUnderlyingAssets()
Fees & Limits
- Trading fee for symbolfetchTradingFee(symbol)
- Trading fees for multiple symbolsfetchTradingFees([symbols])
- Trading limitsfetchTradingLimits([symbols])
- Transaction/withdrawal feefetchTransactionFee(code)
- Multiple transaction feesfetchTransactionFees([codes])
- Deposit/withdrawal feefetchDepositWithdrawFee(code)
- Multiple deposit/withdraw feesfetchDepositWithdrawFees([codes])
Deposits & Withdrawals
- Get deposit addressfetchDepositAddress(code, params)
- Multiple deposit addressesfetchDepositAddresses([codes])
- Addresses by networkfetchDepositAddressesByNetwork(code)
- Create new deposit addresscreateDepositAddress(code, params)
- Fetch single depositfetchDeposit(id, code)
- Fetch single withdrawalfetchWithdrawal(id, code)
- Fetch withdrawal addressesfetchWithdrawAddresses(code)
- Fetch whitelistfetchWithdrawalWhitelist(code)
- Withdraw fundswithdraw(code, amount, address, tag, params)
- Deposit funds (if supported)deposit(code, amount, params)
Transfer & Convert
- Internal transfertransfer(code, amount, fromAccount, toAccount)
- Fetch transfer infofetchTransfer(id, code)
- Fetch transfer historyfetchTransfers(code, since, limit)
- Currencies available for convertfetchConvertCurrencies()
- Get conversion quotefetchConvertQuote(fromCode, toCode, amount)
- Execute conversioncreateConvertTrade(fromCode, toCode, amount)
- Fetch convert tradefetchConvertTrade(id)
- Convert historyfetchConvertTradeHistory(code, since, limit)
Market Info
- Fetch all marketsfetchMarkets()
- Fetch all currenciesfetchCurrencies()
- Fetch exchange server timefetchTime()
- Fetch exchange statusfetchStatus()
- Borrow interest paidfetchBorrowInterest(code, symbol, since, limit)
- Long/short ratiofetchLongShortRatio(symbol, timeframe, since, limit)
- L/S ratio historyfetchLongShortRatioHistory(symbol, timeframe, since, limit)
WebSocket Methods (ccxt.pro)
All REST methods have WebSocket equivalents with
watch* prefix:
Real-time Market Data
- Watch single tickerwatchTicker(symbol)
- Watch multiple tickerswatchTickers([symbols])
- Watch order book updateswatchOrderBook(symbol)
- Watch multiple order bookswatchOrderBookForSymbols([symbols])
- Watch public tradeswatchTrades(symbol)
- Watch candlestick updateswatchOHLCV(symbol, timeframe)
- Watch best bid/askwatchBidsAsks([symbols])
Real-time Account Data (Auth Required)
- Watch balance updateswatchBalance()
- Watch your order updateswatchOrders(symbol)
- Watch your trade updateswatchMyTrades(symbol)
- Watch position updateswatchPositions([symbols])
- Watch positions for symbolwatchPositionsForSymbol(symbol)
Authentication Required
Methods marked with 🔒 require API credentials:
- All
methods (creating orders, addresses)create* - All
methods (canceling orders)cancel* - All
methods (modifying orders)edit* - All
methods (your trades, orders)fetchMy*
,fetchBalance
,fetchLedgerfetchAccounts
,withdraw
,transferdeposit- Margin/leverage methods
- Position methods
,watchBalance
,watchOrders
,watchMyTradeswatchPositions
Checking Method Availability
Not all exchanges support all methods. Check before using:
// Check if method is supported if (exchange.has['fetchOHLCV']) { const candles = await exchange.fetchOHLCV('BTC/USDT', '1h') } // Check multiple capabilities console.log(exchange.has) // { // fetchTicker: true, // fetchOHLCV: true, // fetchMyTrades: true, // fetchPositions: false, // ... // }
Method Naming Convention
- REST API methods (HTTP requests)fetch*
- WebSocket methods (real-time streams)watch*
- Create new resources (orders, addresses)create*
- Cancel existing resourcescancel*
- Modify existing resourcesedit*
- Configure settings (leverage, margin mode)set*
suffix - WebSocket variant (some exchanges)*Ws
Proxy Configuration
CCXT supports HTTP, HTTPS, and SOCKS proxies for both REST and WebSocket connections.
Setting Proxy
// HTTP Proxy exchange.httpProxy = 'http://your-proxy-host:port' // HTTPS Proxy exchange.httpsProxy = 'https://your-proxy-host:port' // SOCKS Proxy exchange.socksProxy = 'socks://your-proxy-host:port' // Proxy with authentication exchange.httpProxy = 'http://user:pass@proxy-host:port'
Proxy for WebSocket
WebSocket connections also respect proxy settings:
exchange.httpsProxy = 'https://proxy:8080' // WebSocket connections will use this proxy
Testing Proxy Connection
exchange.httpProxy = 'http://localhost:8080' try { await exchange.fetchTicker('BTC/USDT') console.log('Proxy working!') } catch (error) { console.error('Proxy connection failed:', error) }
WebSocket-Specific Methods
Some exchanges provide WebSocket variants of REST methods for faster order placement and management. These use the
*Ws suffix:
Trading via WebSocket
Creating Orders:
- Create order via WebSocket (faster than REST)createOrderWs
- Create limit order via WebSocketcreateLimitOrderWs
- Create market order via WebSocketcreateMarketOrderWs
- Buy limit order via WebSocketcreateLimitBuyOrderWs
- Sell limit order via WebSocketcreateLimitSellOrderWs
- Buy market order via WebSocketcreateMarketBuyOrderWs
- Sell market order via WebSocketcreateMarketSellOrderWs
- Stop-limit order via WebSocketcreateStopLimitOrderWs
- Stop-market order via WebSocketcreateStopMarketOrderWs
- Stop-loss order via WebSocketcreateStopLossOrderWs
- Take-profit order via WebSocketcreateTakeProfitOrderWs
- Trailing stop via WebSocketcreateTrailingAmountOrderWs
- Trailing stop % via WebSocketcreateTrailingPercentOrderWs
- Post-only order via WebSocketcreatePostOnlyOrderWs
- Reduce-only order via WebSocketcreateReduceOnlyOrderWs
Managing Orders:
- Edit order via WebSocketeditOrderWs
- Cancel order via WebSocket (faster than REST)cancelOrderWs
- Cancel multiple orders via WebSocketcancelOrdersWs
- Cancel all orders via WebSocketcancelAllOrdersWs
Fetching Data:
- Fetch order via WebSocketfetchOrderWs
- Fetch orders via WebSocketfetchOrdersWs
- Fetch open orders via WebSocketfetchOpenOrdersWs
- Fetch closed orders via WebSocketfetchClosedOrdersWs
- Fetch your trades via WebSocketfetchMyTradesWs
- Fetch balance via WebSocketfetchBalanceWs
- Fetch position via WebSocketfetchPositionWs
- Fetch positions via WebSocketfetchPositionsWs
- Fetch positions for symbol via WebSocketfetchPositionsForSymbolWs
- Fetch trading fees via WebSocketfetchTradingFeesWs
When to Use WebSocket Methods
Use
methods when:*Ws
- You need faster order placement (lower latency)
- You're already connected via WebSocket
- You want to reduce REST API rate limit usage
- Trading strategies require sub-100ms latency
Use REST methods when:
- You need guaranteed execution confirmation
- You're making one-off requests
- The exchange doesn't support the WebSocket variant
- You need detailed error responses
Example: Order Placement Comparison
REST API (slower, more reliable):
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
WebSocket API (faster, lower latency):
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
Checking WebSocket Method Availability
Not all exchanges support WebSocket trading methods:
if (exchange.has['createOrderWs']) { // Exchange supports WebSocket order creation const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000) } else { // Fall back to REST const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000) }
Authentication
Setting API Keys
// During instantiation const exchange = new ccxt.binance({ apiKey: 'YOUR_API_KEY', secret: 'YOUR_SECRET', enableRateLimit: true }) // After instantiation exchange.apiKey = 'YOUR_API_KEY' exchange.secret = 'YOUR_SECRET'
Environment Variables (Recommended)
const exchange = new ccxt.binance({ apiKey: process.env.BINANCE_API_KEY, secret: process.env.BINANCE_SECRET, enableRateLimit: true })
Testing Authentication
try { const balance = await exchange.fetchBalance() console.log('Authentication successful!') } catch (error) { if (error instanceof ccxt.AuthenticationError) { console.error('Invalid API credentials') } }
Error Handling
Exception Hierarchy
BaseError ├─ NetworkError (recoverable - retry) │ ├─ RequestTimeout │ ├─ ExchangeNotAvailable │ ├─ RateLimitExceeded │ └─ DDoSProtection └─ ExchangeError (non-recoverable - don't retry) ├─ AuthenticationError ├─ InsufficientFunds ├─ InvalidOrder └─ NotSupported
Basic Error Handling
import ccxt from 'ccxt' try { const ticker = await exchange.fetchTicker('BTC/USDT') } catch (error) { if (error instanceof ccxt.NetworkError) { console.error('Network error - retry:', error.message) } else if (error instanceof ccxt.ExchangeError) { console.error('Exchange error - do not retry:', error.message) } else { console.error('Unknown error:', error) } }
Specific Exception Handling
try { const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000) } catch (error) { if (error instanceof ccxt.InsufficientFunds) { console.error('Not enough balance') } else if (error instanceof ccxt.InvalidOrder) { console.error('Invalid order parameters') } else if (error instanceof ccxt.RateLimitExceeded) { console.error('Rate limit hit - wait before retrying') await exchange.sleep(1000) // Wait 1 second } else if (error instanceof ccxt.AuthenticationError) { console.error('Check your API credentials') } }
Retry Logic for Network Errors
async function fetchWithRetry(maxRetries = 3) { for (let i = 0; i < maxRetries; i++) { try { return await exchange.fetchTicker('BTC/USDT') } catch (error) { if (error instanceof ccxt.NetworkError && i < maxRetries - 1) { console.log(`Retry ${i + 1}/${maxRetries}`) await exchange.sleep(1000 * (i + 1)) // Exponential backoff } else { throw error } } } }
Rate Limiting
Built-in Rate Limiter (Recommended)
const exchange = new ccxt.binance({ enableRateLimit: true // Automatically throttles requests })
Manual Delays
await exchange.fetchTicker('BTC/USDT') await exchange.sleep(1000) // Wait 1 second await exchange.fetchTicker('ETH/USDT')
Checking Rate Limit
console.log(exchange.rateLimit) // Milliseconds between requests
Common Pitfalls
Forgetting await
await// Wrong - returns Promise, not data const ticker = exchange.fetchTicker('BTC/USDT') console.log(ticker.last) // ERROR: ticker is a Promise! // Correct const ticker = await exchange.fetchTicker('BTC/USDT') console.log(ticker.last) // Works!
Using REST for Real-time Monitoring
// Wrong - wastes rate limits, slow while (true) { const ticker = await exchange.fetchTicker('BTC/USDT') // REST console.log(ticker.last) await exchange.sleep(1000) } // Correct - use WebSocket const exchange = new ccxt.pro.binance() while (true) { const ticker = await exchange.watchTicker('BTC/USDT') // WebSocket console.log(ticker.last) }
Not Closing WebSocket Connections
// Wrong - memory leak const exchange = new ccxt.pro.binance() const ticker = await exchange.watchTicker('BTC/USDT') // Forgot to close! // Correct const exchange = new ccxt.pro.binance() try { while (true) { const ticker = await exchange.watchTicker('BTC/USDT') console.log(ticker) } } finally { await exchange.close() }
Multiple Instances with Same API Keys
// Wrong - nonce conflicts const ex1 = new ccxt.binance({ apiKey: 'key', secret: 'secret' }) const ex2 = new ccxt.binance({ apiKey: 'key', secret: 'secret' }) await ex1.fetchBalance() await ex2.fetchBalance() // May fail due to nonce issues! // Correct - reuse single instance const exchange = new ccxt.binance({ apiKey: 'key', secret: 'secret' }) await exchange.fetchBalance() await exchange.fetchBalance()
Not Enabling Rate Limiter
// Wrong - may hit rate limits const exchange = new ccxt.binance() for (let i = 0; i < 100; i++) { await exchange.fetchTicker('BTC/USDT') // May fail! } // Correct const exchange = new ccxt.binance({ enableRateLimit: true }) for (let i = 0; i < 100; i++) { await exchange.fetchTicker('BTC/USDT') // Automatically throttled }
Browser Usage
Via CDN
<script src="https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js"></script> <script> const exchange = new ccxt.binance() exchange.loadMarkets().then(() => { return exchange.fetchTicker('BTC/USDT') }).then(ticker => { console.log(ticker) }) </script>
ES Modules
import ccxt from 'https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js' const exchange = new ccxt.binance() await exchange.loadMarkets() const ticker = await exchange.fetchTicker('BTC/USDT') console.log(ticker)
Troubleshooting
Common Issues
1. "Cannot find module 'ccxt'"
- Solution: Run
npm install ccxt
2. "RateLimitExceeded"
- Solution: Enable rate limiter:
enableRateLimit: true - Or add manual delays between requests
3. "AuthenticationError"
- Solution: Check API key and secret
- Verify API key permissions on exchange
- Check system clock is synced (use NTP)
4. "InvalidNonce"
- Solution: Sync system clock
- Use only one exchange instance per API key
- Don't run multiple bots with same credentials
5. "InsufficientFunds"
- Solution: Check available balance (
)balance.BTC.free - Account for trading fees
6. "ExchangeNotAvailable"
- Solution: Check exchange status/maintenance
- Retry after a delay
- Use different exchange endpoint if available
7. WebSocket connection drops
- Solution: Implement reconnection logic
- Use try-catch and restart
methodswatch* - Check network stability
Debugging
// Enable verbose logging exchange.verbose = true // Check exchange capabilities console.log(exchange.has) // { // fetchTicker: true, // fetchOrderBook: true, // createOrder: true, // ... // } // Check market information console.log(exchange.markets['BTC/USDT']) // Check last request/response console.log(exchange.last_http_response) console.log(exchange.last_json_response)