Skill

SkillsBlockchain & Web3 › Crypto trading & exchange

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.

Freerisk: medium
ccxttypescriptjavascriptfolded-into-803

Tools: ccxt

The full skill

— name: ccxt-typescript description: 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. — # CCXT for TypeScript/JavaScript A comprehensive guide to using CCXT in TypeScript and JavaScript projects for cryptocurrency exchange integration. ## Installation ### REST API (Standard CCXT) “`bash npm install ccxt “` ### WebSocket API (Real-time, ccxt.pro) “`bash npm install ccxt “` Both REST and WebSocket APIs are included in the same package. ## Quick Start ### REST API – TypeScript “`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) “`javascript 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 “`typescript 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** | `fetch*` (fetchTicker, fetchOrderBook) | `watch*` (watchTicker, watchOrderBook) | | **Speed** | Slower (HTTP request/response) | Faster (persistent connection) | | **Rate limits** | Strict (1-2 req/sec) | More lenient (continuous stream) | | **Import** | `ccxt.exchange()` | `ccxt.pro.exchange()` | | **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 “`typescript // 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 “`typescript // 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 “`typescript // 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 “`typescript // 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 “`typescript // 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 “`typescript // 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 “`typescript // 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 “`typescript 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 “`typescript // 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 “`typescript // 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 “`typescript // 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) “`typescript 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) “`typescript 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) “`typescript 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) “`typescript 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) “`typescript 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 “`typescript 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 – `fetchTicker(symbol)` – Fetch ticker for one symbol – `fetchTickers([symbols])` – Fetch multiple tickers at once – `fetchBidsAsks([symbols])` – Fetch best bid/ask for multiple symbols – `fetchLastPrices([symbols])` – Fetch last prices – `fetchMarkPrices([symbols])` – Fetch mark prices (derivatives) #### Order Books – `fetchOrderBook(symbol, limit)` – Fetch order book – `fetchOrderBooks([symbols])` – Fetch multiple order books – `fetchL2OrderBook(symbol)` – Fetch level 2 order book – `fetchL3OrderBook(symbol)` – Fetch level 3 order book (if supported) #### Trades – `fetchTrades(symbol, since, limit)` – Fetch public trades – `fetchMyTrades(symbol, since, limit)` – Fetch your trades (auth required) – `fetchOrderTrades(orderId, symbol)` – Fetch trades for specific order #### OHLCV (Candlesticks) – `fetchOHLCV(symbol, timeframe, since, limit)` – Fetch candlestick data – `fetchIndexOHLCV(symbol, timeframe)` – Fetch index price OHLCV – `fetchMarkOHLCV(symbol, timeframe)` – Fetch mark price OHLCV – `fetchPremiumIndexOHLCV(symbol, timeframe)` – Fetch premium index OHLCV ### Account & Balance – `fetchBalance()` – Fetch account balance (auth required) – `fetchAccounts()` – Fetch sub-accounts – `fetchLedger(code, since, limit)` – Fetch ledger history – `fetchLedgerEntry(id, code)` – Fetch specific ledger entry – `fetchTransactions(code, since, limit)` – Fetch transactions – `fetchDeposits(code, since, limit)` – Fetch deposit history – `fetchWithdrawals(code, since, limit)` – Fetch withdrawal history – `fetchDepositsWithdrawals(code, since, limit)` – Fetch both deposits and withdrawals ### Trading Methods #### Creating Orders – `createOrder(symbol, type, side, amount, price, params)` – Create order (generic) – `createLimitOrder(symbol, side, amount, price)` – Create limit order – `createMarketOrder(symbol, side, amount)` – Create market order – `createLimitBuyOrder(symbol, amount, price)` – Buy limit order – `createLimitSellOrder(symbol, amount, price)` – Sell limit order – `createMarketBuyOrder(symbol, amount)` – Buy market order – `createMarketSellOrder(symbol, amount)` – Sell market order – `createMarketBuyOrderWithCost(symbol, cost)` – Buy with specific cost – `createStopLimitOrder(symbol, side, amount, price, stopPrice)` – Stop-limit order – `createStopMarketOrder(symbol, side, amount, stopPrice)` – Stop-market order – `createStopLossOrder(symbol, side, amount, stopPrice)` – Stop-loss order – `createTakeProfitOrder(symbol, side, amount, takeProfitPrice)` – Take-profit order – `createTrailingAmountOrder(symbol, side, amount, trailingAmount)` – Trailing stop – `createTrailingPercentOrder(symbol, side, amount, trailingPercent)` – Trailing stop % – `createTriggerOrder(symbol, side, amount, triggerPrice)` – Trigger order – `createPostOnlyOrder(symbol, side, amount, price)` – Post-only order – `createReduceOnlyOrder(symbol, side, amount, price)` – Reduce-only order – `createOrders([orders])` – Create multiple orders at once – `createOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)` – OCO order #### Managing Orders – `fetchOrder(orderId, symbol)` – Fetch single order – `fetchOrders(symbol, since, limit)` – Fetch all orders – `fetchOpenOrders(symbol, since, limit)` – Fetch open orders – `fetchClosedOrders(symbol, since, limit)` – Fetch closed orders – `fetchCanceledOrders(symbol, since, limit)` – Fetch canceled orders – `fetchOpenOrder(orderId, symbol)` – Fetch specific open order – `fetchOrdersByStatus(status, symbol)` – Fetch orders by status – `cancelOrder(orderId, symbol)` – Cancel single order – `cancelOrders([orderIds], symbol)` – Cancel multiple orders – `cancelAllOrders(symbol)` – Cancel all orders for symbol – `editOrder(orderId, symbol, type, side, amount, price)` – Modify order ### Margin & Leverage – `fetchBorrowRate(code)` – Fetch borrow rate for margin – `fetchBorrowRates([codes])` – Fetch multiple borrow rates – `fetchBorrowRateHistory(code, since, limit)` – Historical borrow rates – `fetchCrossBorrowRate(code)` – Cross margin borrow rate – `fetchIsolatedBorrowRate(symbol, code)` – Isolated margin borrow rate – `borrowMargin(code, amount, symbol)` – Borrow margin – `repayMargin(code, amount, symbol)` – Repay margin – `fetchLeverage(symbol)` – Fetch leverage – `setLeverage(leverage, symbol)` – Set leverage – `fetchLeverageTiers(symbols)` – Fetch leverage tiers – `fetchMarketLeverageTiers(symbol)` – Leverage tiers for market – `setMarginMode(marginMode, symbol)` – Set margin mode (cross/isolated) – `fetchMarginMode(symbol)` – Fetch margin mode ### Derivatives & Futures #### Positions – `fetchPosition(symbol)` – Fetch single position – `fetchPositions([symbols])` – Fetch all positions – `fetchPositionsForSymbol(symbol)` – Fetch positions for symbol – `fetchPositionHistory(symbol, since, limit)` – Position history – `fetchPositionsHistory(symbols, since, limit)` – Multiple position history – `fetchPositionMode(symbol)` – Fetch position mode (one-way/hedge) – `setPositionMode(hedged, symbol)` – Set position mode – `closePosition(symbol, side)` – Close position – `closeAllPositions()` – Close all positions #### Funding & Settlement – `fetchFundingRate(symbol)` – Current funding rate – `fetchFundingRates([symbols])` – Multiple funding rates – `fetchFundingRateHistory(symbol, since, limit)` – Funding rate history – `fetchFundingHistory(symbol, since, limit)` – Your funding payments – `fetchFundingInterval(symbol)` – Funding interval – `fetchSettlementHistory(symbol, since, limit)` – Settlement history – `fetchMySettlementHistory(symbol, since, limit)` – Your settlement history #### Open Interest & Liquidations – `fetchOpenInterest(symbol)` – Open interest for symbol – `fetchOpenInterests([symbols])` – Multiple open interests – `fetchOpenInterestHistory(symbol, timeframe, since, limit)` – OI history – `fetchLiquidations(symbol, since, limit)` – Public liquidations – `fetchMyLiquidations(symbol, since, limit)` – Your liquidations #### Options – `fetchOption(symbol)` – Fetch option info – `fetchOptionChain(code)` – Fetch option chain – `fetchGreeks(symbol)` – Fetch option greeks – `fetchVolatilityHistory(code, since, limit)` – Volatility history – `fetchUnderlyingAssets()` – Fetch underlying assets ### Fees & Limits – `fetchTradingFee(symbol)` – Trading fee for symbol – `fetchTradingFees([symbols])` – Trading fees for multiple symbols – `fetchTradingLimits([symbols])` – Trading limits – `fetchTransactionFee(code)` – Transaction/withdrawal fee – `fetchTransactionFees([codes])` – Multiple transaction fees – `fetchDepositWithdrawFee(code)` – Deposit/withdrawal fee – `fetchDepositWithdrawFees([codes])` – Multiple deposit/withdraw fees ### Deposits & Withdrawals – `fetchDepositAddress(code, params)` – Get deposit address – `fetchDepositAddresses([codes])` – Multiple deposit addresses – `fetchDepositAddressesByNetwork(code)` – Addresses by network – `createDepositAddress(code, params)` – Create new deposit address – `fetchDeposit(id, code)` – Fetch single deposit – `fetchWithdrawal(id, code)` – Fetch single withdrawal – `fetchWithdrawAddresses(code)` – Fetch withdrawal addresses – `fetchWithdrawalWhitelist(code)` – Fetch whitelist – `withdraw(code, amount, address, tag, params)` – Withdraw funds – `deposit(code, amount, params)` – Deposit funds (if supported) ### Transfer & Convert – `transfer(code, amount, fromAccount, toAccount)` – Internal transfer – `fetchTransfer(id, code)` – Fetch transfer info – `fetchTransfers(code, since, limit)` – Fetch transfer history – `fetchConvertCurrencies()` – Currencies available for convert – `fetchConvertQuote(fromCode, toCode, amount)` – Get conversion quote – `createConvertTrade(fromCode, toCode, amount)` – Execute conversion – `fetchConvertTrade(id)` – Fetch convert trade – `fetchConvertTradeHistory(code, since, limit)` – Convert history ### Market Info – `fetchMarkets()` – Fetch all markets – `fetchCurrencies()` – Fetch all currencies – `fetchTime()` – Fetch exchange server time – `fetchStatus()` – Fetch exchange status – `fetchBorrowInterest(code, symbol, since, limit)` – Borrow interest paid – `fetchLongShortRatio(symbol, timeframe, since, limit)` – Long/short ratio – `fetchLongShortRatioHistory(symbol, timeframe, since, limit)` – L/S ratio history ### WebSocket Methods (ccxt.pro) All REST methods have WebSocket equivalents with `watch*` prefix: #### Real-time Market Data – `watchTicker(symbol)` – Watch single ticker – `watchTickers([symbols])` – Watch multiple tickers – `watchOrderBook(symbol)` – Watch order book updates – `watchOrderBookForSymbols([symbols])` – Watch multiple order books – `watchTrades(symbol)` – Watch public trades – `watchOHLCV(symbol, timeframe)` – Watch candlestick updates – `watchBidsAsks([symbols])` – Watch best bid/ask #### Real-time Account Data (Auth Required) – `watchBalance()` – Watch balance updates – `watchOrders(symbol)` – Watch your order updates – `watchMyTrades(symbol)` – Watch your trade updates – `watchPositions([symbols])` – Watch position updates – `watchPositionsForSymbol(symbol)` – Watch positions for symbol ### Authentication Required Methods marked with 🔒 require API credentials: – All `create*` methods (creating orders, addresses) – All `cancel*` methods (canceling orders) – All `edit*` methods (modifying orders) – All `fetchMy*` methods (your trades, orders) – `fetchBalance`, `fetchLedger`, `fetchAccounts` – `withdraw`, `transfer`, `deposit` – Margin/leverage methods – Position methods – `watchBalance`, `watchOrders`, `watchMyTrades`, `watchPositions` ### 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 – `fetch*` – REST API methods (HTTP requests) – `watch*` – WebSocket methods (real-time streams) – `create*` – Create new resources (orders, addresses) – `cancel*` – Cancel existing resources – `edit*` – Modify existing resources – `set*` – Configure settings (leverage, margin mode) – `*Ws` suffix – WebSocket variant (some exchanges) ## 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:** – `createOrderWs` – Create order via WebSocket (faster than REST) – `createLimitOrderWs` – Create limit order via WebSocket – `createMarketOrderWs` – Create market order via WebSocket – `createLimitBuyOrderWs` – Buy limit order via WebSocket – `createLimitSellOrderWs` – Sell limit order via WebSocket – `createMarketBuyOrderWs` – Buy market order via WebSocket – `createMarketSellOrderWs` – Sell market order via WebSocket – `createStopLimitOrderWs` – Stop-limit order via WebSocket – `createStopMarketOrderWs` – Stop-market order via WebSocket – `createStopLossOrderWs` – Stop-loss order via WebSocket – `createTakeProfitOrderWs` – Take-profit order via WebSocket – `createTrailingAmountOrderWs` – Trailing stop via WebSocket – `createTrailingPercentOrderWs` – Trailing stop % via WebSocket – `createPostOnlyOrderWs` – Post-only order via WebSocket – `createReduceOnlyOrderWs` – Reduce-only order via WebSocket **Managing Orders:** – `editOrderWs` – Edit order via WebSocket – `cancelOrderWs` – Cancel order via WebSocket (faster than REST) – `cancelOrdersWs` – Cancel multiple orders via WebSocket – `cancelAllOrdersWs` – Cancel all orders via WebSocket **Fetching Data:** – `fetchOrderWs` – Fetch order via WebSocket – `fetchOrdersWs` – Fetch orders via WebSocket – `fetchOpenOrdersWs` – Fetch open orders via WebSocket – `fetchClosedOrdersWs` – Fetch closed orders via WebSocket – `fetchMyTradesWs` – Fetch your trades via WebSocket – `fetchBalanceWs` – Fetch balance via WebSocket – `fetchPositionWs` – Fetch position via WebSocket – `fetchPositionsWs` – Fetch positions via WebSocket – `fetchPositionsForSymbolWs` – Fetch positions for symbol via WebSocket – `fetchTradingFeesWs` – Fetch trading fees via WebSocket ### When to Use WebSocket Methods **Use `*Ws` methods when:** – 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 “`typescript // 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) “`typescript const exchange = new ccxt.binance({ apiKey: process.env.BINANCE_API_KEY, secret: process.env.BINANCE_SECRET, enableRateLimit: true }) “` ### Testing Authentication “`typescript 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 “`typescript 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 “`typescript 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 “`typescript 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) “`typescript const exchange = new ccxt.binance({ enableRateLimit: true // Automatically throttles requests }) “` ### Manual Delays “`typescript await exchange.fetchTicker('BTC/USDT') await exchange.sleep(1000) // Wait 1 second await exchange.fetchTicker('ETH/USDT') “` ### Checking Rate Limit “`typescript console.log(exchange.rateLimit) // Milliseconds between requests “` ## Common Pitfalls ### Forgetting `await` “`typescript // 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 “`typescript // 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 “`typescript // 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 “`typescript // 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 “`typescript // 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 “`html <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 “`javascript 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 `watch*` methods – Check network stability ### Debugging “`typescript // 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) “` ## Learn More – [CCXT Manual](https://docs.ccxt.com/) – [CCXT Pro Documentation](https://docs.ccxt.com/en/latest/ccxt.pro.html) – [Supported Exchanges](https://github.com/ccxt/ccxt#supported-cryptocurrency-exchange-markets) – [GitHub Repository](https://github.com/ccxt/ccxt)