Claude-skill-registry ccxt-go
CCXT cryptocurrency exchange library for Go 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 Go projects. Use when working with crypto exchanges in Go applications, microservices, or trading systems.
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-go" ~/.claude/skills/majiayu000-claude-skill-registry-ccxt-go && rm -rf "$T"
skills/data/ccxt-go/SKILL.mdCCXT for Go
A comprehensive guide to using CCXT in Go projects for cryptocurrency exchange integration.
Installation
REST API
go get github.com/ccxt/ccxt/go/v4
WebSocket API (ccxt.pro)
go get github.com/ccxt/ccxt/go/v4/pro
Quick Start
REST API
package main import ( "fmt" "github.com/ccxt/ccxt/go/v4/binance" ) func main() { exchange := binance.New() markets, err := exchange.LoadMarkets() if err != nil { panic(err) } ticker, err := exchange.FetchTicker("BTC/USDT") if err != nil { panic(err) } fmt.Println(ticker) }
WebSocket API - Real-time Updates
package main import ( "fmt" "github.com/ccxt/ccxt/go/v4/pro/binance" ) func main() { exchange := binance.New() defer exchange.Close() for { ticker, err := exchange.WatchTicker("BTC/USDT") if err != nil { panic(err) } fmt.Println(ticker.Last) // Live updates! } }
REST vs WebSocket
| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Import | | |
| Methods | (FetchTicker, FetchOrderBook) | (WatchTicker, WatchOrderBook) |
| Speed | Slower (HTTP request/response) | Faster (persistent connection) |
| Rate limits | Strict (1-2 req/sec) | More lenient (continuous stream) |
| Best for | Trading, account management | Price monitoring, arbitrage detection |
Important: All methods return
(result, error) - always check errors!
Creating Exchange Instance
REST API
import "github.com/ccxt/ccxt/go/v4/binance" // Public API (no authentication) exchange := binance.New() exchange.EnableRateLimit = true // Recommended! // Private API (with authentication) exchange := binance.New() exchange.ApiKey = "YOUR_API_KEY" exchange.Secret = "YOUR_SECRET" exchange.EnableRateLimit = true
WebSocket API
import "github.com/ccxt/ccxt/go/v4/pro/binance" // Public WebSocket exchange := binance.New() defer exchange.Close() // Private WebSocket (with authentication) exchange := binance.New() exchange.ApiKey = "YOUR_API_KEY" exchange.Secret = "YOUR_SECRET" defer exchange.Close()
Common REST Operations
Loading Markets
// Load all available trading pairs markets, err := exchange.LoadMarkets() if err != nil { panic(err) } // Access market information btcMarket := exchange.Market("BTC/USDT") fmt.Println(btcMarket.Limits.Amount.Min) // Minimum order amount
Fetching Ticker
// Single ticker ticker, err := exchange.FetchTicker("BTC/USDT") if err != nil { panic(err) } fmt.Println(ticker.Last) // Last price fmt.Println(ticker.Bid) // Best bid fmt.Println(ticker.Ask) // Best ask fmt.Println(ticker.Volume) // 24h volume // Multiple tickers (if supported) tickers, err := exchange.FetchTickers([]string{"BTC/USDT", "ETH/USDT"})
Fetching Order Book
// Full orderbook orderbook, err := exchange.FetchOrderBook("BTC/USDT", nil) if err != nil { panic(err) } fmt.Println(orderbook.Bids[0]) // [price, amount] fmt.Println(orderbook.Asks[0]) // [price, amount] // Limited depth limit := 5 orderbook, err := exchange.FetchOrderBook("BTC/USDT", &limit)
Creating Orders
Limit Order
// Buy limit order order, err := exchange.CreateLimitBuyOrder("BTC/USDT", 0.01, 50000, nil) if err != nil { panic(err) } fmt.Println(order.Id) // Sell limit order order, err := exchange.CreateLimitSellOrder("BTC/USDT", 0.01, 60000, nil) // Generic limit order order, err := exchange.CreateOrder("BTC/USDT", "limit", "buy", 0.01, 50000, nil)
Market Order
// Buy market order order, err := exchange.CreateMarketBuyOrder("BTC/USDT", 0.01, nil) // Sell market order order, err := exchange.CreateMarketSellOrder("BTC/USDT", 0.01, nil) // Generic market order order, err := exchange.CreateOrder("BTC/USDT", "market", "sell", 0.01, nil, nil)
Fetching Balance
balance, err := exchange.FetchBalance() if err != nil { panic(err) } fmt.Println(balance["BTC"].Free) // Available balance fmt.Println(balance["BTC"].Used) // Balance in orders fmt.Println(balance["BTC"].Total) // Total balance
Fetching Orders
// Open orders openOrders, err := exchange.FetchOpenOrders("BTC/USDT", nil, nil, nil) // Closed orders closedOrders, err := exchange.FetchClosedOrders("BTC/USDT", nil, nil, nil) // All orders (open + closed) allOrders, err := exchange.FetchOrders("BTC/USDT", nil, nil, nil) // Single order by ID order, err := exchange.FetchOrder(orderId, "BTC/USDT", nil)
Fetching Trades
// Recent public trades limit := 10 trades, err := exchange.FetchTrades("BTC/USDT", nil, &limit, nil) // Your trades (requires authentication) myTrades, err := exchange.FetchMyTrades("BTC/USDT", nil, nil, nil)
Canceling Orders
// Cancel single order err := exchange.CancelOrder(orderId, "BTC/USDT", nil) // Cancel all orders for a symbol err := exchange.CancelAllOrders("BTC/USDT", nil)
WebSocket Operations (Real-time)
Watching Ticker (Live Price Updates)
import "github.com/ccxt/ccxt/go/v4/pro/binance" exchange := binance.New() defer exchange.Close() for { ticker, err := exchange.WatchTicker("BTC/USDT") if err != nil { panic(err) } fmt.Println(ticker.Last, ticker.Timestamp) }
Watching Order Book (Live Depth Updates)
exchange := binance.New() defer exchange.Close() for { orderbook, err := exchange.WatchOrderBook("BTC/USDT", nil) if err != nil { panic(err) } fmt.Println("Best bid:", orderbook.Bids[0]) fmt.Println("Best ask:", orderbook.Asks[0]) }
Watching Trades (Live Trade Stream)
exchange := binance.New() defer exchange.Close() for { trades, err := exchange.WatchTrades("BTC/USDT", nil, nil, nil) if err != nil { panic(err) } for _, trade := range trades { fmt.Println(trade.Price, trade.Amount, trade.Side) } }
Watching Your Orders (Live Order Updates)
exchange := binance.New() exchange.ApiKey = "YOUR_API_KEY" exchange.Secret = "YOUR_SECRET" defer exchange.Close() for { orders, err := exchange.WatchOrders("BTC/USDT", nil, nil, nil) if err != nil { panic(err) } for _, order := range orders { fmt.Println(order.Id, order.Status, order.Filled) } }
Watching Balance (Live Balance Updates)
exchange := binance.New() exchange.ApiKey = "YOUR_API_KEY" exchange.Secret = "YOUR_SECRET" defer exchange.Close() for { balance, err := exchange.WatchBalance() if err != nil { panic(err) } fmt.Println("BTC:", balance["BTC"]) fmt.Println("USDT:", balance["USDT"]) }
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
import "os" // During instantiation exchange := binance.New() exchange.ApiKey = os.Getenv("BINANCE_API_KEY") exchange.Secret = os.Getenv("BINANCE_SECRET") exchange.EnableRateLimit = true
Testing Authentication
balance, err := exchange.FetchBalance() if err != nil { if _, ok := err.(*ccxt.AuthenticationError); ok { fmt.Println("Invalid API credentials") } else { panic(err) } } else { fmt.Println("Authentication successful!") }
Error Handling
Error Types
BaseError ├─ NetworkError (recoverable - retry) │ ├─ RequestTimeout │ ├─ ExchangeNotAvailable │ ├─ RateLimitExceeded │ └─ DDoSProtection └─ ExchangeError (non-recoverable - don't retry) ├─ AuthenticationError ├─ InsufficientFunds ├─ InvalidOrder └─ NotSupported
Basic Error Handling
import "github.com/ccxt/ccxt/go/v4/ccxt" ticker, err := exchange.FetchTicker("BTC/USDT") if err != nil { switch e := err.(type) { case *ccxt.NetworkError: fmt.Println("Network error - retry:", e.Message) case *ccxt.ExchangeError: fmt.Println("Exchange error - do not retry:", e.Message) default: fmt.Println("Unknown error:", err) } }
Specific Error Handling
order, err := exchange.CreateOrder("BTC/USDT", "limit", "buy", 0.01, 50000, nil) if err != nil { switch err.(type) { case *ccxt.InsufficientFunds: fmt.Println("Not enough balance") case *ccxt.InvalidOrder: fmt.Println("Invalid order parameters") case *ccxt.RateLimitExceeded: fmt.Println("Rate limit hit - wait before retrying") time.Sleep(1 * time.Second) case *ccxt.AuthenticationError: fmt.Println("Check your API credentials") default: panic(err) } }
Retry Logic for Network Errors
import "time" func fetchWithRetry(exchange *binance.Exchange, maxRetries int) (*ccxt.Ticker, error) { for i := 0; i < maxRetries; i++ { ticker, err := exchange.FetchTicker("BTC/USDT") if err == nil { return ticker, nil } if _, ok := err.(*ccxt.NetworkError); ok && i < maxRetries-1 { fmt.Printf("Retry %d/%d\n", i+1, maxRetries) time.Sleep(time.Duration(i+1) * time.Second) // Exponential backoff } else { return nil, err } } return nil, fmt.Errorf("all retries failed") }
Rate Limiting
Built-in Rate Limiter (Recommended)
exchange := binance.New() exchange.EnableRateLimit = true // Automatically throttles requests
Manual Delays
import "time" exchange.FetchTicker("BTC/USDT") time.Sleep(time.Duration(exchange.RateLimit) * time.Millisecond) exchange.FetchTicker("ETH/USDT")
Checking Rate Limit
fmt.Println(exchange.RateLimit) // Milliseconds between requests
Common Pitfalls
Not Checking Error Returns
// Wrong - ignores errors ticker, _ := exchange.FetchTicker("BTC/USDT") fmt.Println(ticker.Last) // May panic if ticker is nil! // Correct - check errors ticker, err := exchange.FetchTicker("BTC/USDT") if err != nil { panic(err) } fmt.Println(ticker.Last)
Wrong Import Path
// Wrong - missing /v4 import "github.com/ccxt/ccxt/go/binance" // ERROR! // Correct - must include /v4 import "github.com/ccxt/ccxt/go/v4/binance" // Correct - WebSocket with /v4/pro import "github.com/ccxt/ccxt/go/v4/pro/binance"
Using REST for Real-time Monitoring
// Wrong - wastes rate limits for { ticker, _ := exchange.FetchTicker("BTC/USDT") // REST fmt.Println(ticker.Last) time.Sleep(1 * time.Second) } // Correct - use WebSocket import "github.com/ccxt/ccxt/go/v4/pro/binance" exchange := binance.New() defer exchange.Close() for { ticker, err := exchange.WatchTicker("BTC/USDT") // WebSocket if err != nil { panic(err) } fmt.Println(ticker.Last) }
Not Closing WebSocket Connections
// Wrong - memory leak exchange := binance.New() ticker, _ := exchange.WatchTicker("BTC/USDT") // Forgot to close! // Correct - always defer Close() exchange := binance.New() defer exchange.Close() for { ticker, err := exchange.WatchTicker("BTC/USDT") if err != nil { break } fmt.Println(ticker.Last) }
Incorrect Symbol Format
// Wrong symbol formats "BTCUSDT" // Wrong - no separator "BTC-USDT" // Wrong - dash separator "btc/usdt" // Wrong - lowercase // Correct symbol format "BTC/USDT" // Unified CCXT format
Troubleshooting
Common Issues
1. "package github.com/ccxt/ccxt/go/v4/binance: cannot find package"
- Solution: Run
go get github.com/ccxt/ccxt/go/v4
2. "RateLimitExceeded"
- Solution: Set
exchange.EnableRateLimit = true
3. "AuthenticationError"
- Solution: Check API key and secret
- Verify API key permissions on exchange
- Check system clock is synced
4. "InvalidNonce"
- Solution: Sync system clock
- Use only one exchange instance per API key
5. "InsufficientFunds"
- Solution: Check available balance (
)balance["BTC"].Free - Account for trading fees
6. "ExchangeNotAvailable"
- Solution: Check exchange status/maintenance
- Retry after a delay
Debugging
// Enable verbose logging exchange.Verbose = true // Check exchange capabilities fmt.Println(exchange.Has) // map[string]bool{ // "fetchTicker": true, // "fetchOrderBook": true, // "createOrder": true, // ... // } // Check market information market := exchange.Markets["BTC/USDT"] fmt.Println(market) // Check last request/response fmt.Println(exchange.LastHttpResponse) fmt.Println(exchange.LastJsonResponse)