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.
A comprehensive guide to using CCXT in Go projects for cryptocurrency exchange integration.
go get github.com/ccxt/ccxt/go/v4
go get github.com/ccxt/ccxt/go/v4/pro
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)
}
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!
}
}
| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Import | github.com/ccxt/ccxt/go/v4/{exchange} | github.com/ccxt/ccxt/go/v4/pro/{exchange} |
| Methods | 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) |
| Best for | Trading, account management | Price monitoring, arbitrage detection |
Important: All methods return (result, error) - always check errors!
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
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()
// 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
// 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"})
// 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)
// 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)
// 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)
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
// 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)
// 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)
// Cancel single order
err := exchange.CancelOrder(orderId, "BTC/USDT", nil)
// Cancel all orders for a symbol
err := exchange.CancelAllOrders("BTC/USDT", nil)
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)
}
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])
}
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)
}
}
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)
}
}
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"])
}
fetchTicker(symbol) - Fetch ticker for one symbolfetchTickers([symbols]) - Fetch multiple tickers at oncefetchBidsAsks([symbols]) - Fetch best bid/ask for multiple symbolsfetchLastPrices([symbols]) - Fetch last pricesfetchMarkPrices([symbols]) - Fetch mark prices (derivatives)fetchOrderBook(symbol, limit) - Fetch order bookfetchOrderBooks([symbols]) - Fetch multiple order booksfetchL2OrderBook(symbol) - Fetch level 2 order bookfetchL3OrderBook(symbol) - Fetch level 3 order book (if supported)fetchTrades(symbol, since, limit) - Fetch public tradesfetchMyTrades(symbol, since, limit) - Fetch your trades (auth required)fetchOrderTrades(orderId, symbol) - Fetch trades for specific orderfetchOHLCV(symbol, timeframe, since, limit) - Fetch candlestick datafetchIndexOHLCV(symbol, timeframe) - Fetch index price OHLCVfetchMarkOHLCV(symbol, timeframe) - Fetch mark price OHLCVfetchPremiumIndexOHLCV(symbol, timeframe) - Fetch premium index OHLCVfetchBalance() - Fetch account balance (auth required)fetchAccounts() - Fetch sub-accountsfetchLedger(code, since, limit) - Fetch ledger historyfetchLedgerEntry(id, code) - Fetch specific ledger entryfetchTransactions(code, since, limit) - Fetch transactionsfetchDeposits(code, since, limit) - Fetch deposit historyfetchWithdrawals(code, since, limit) - Fetch withdrawal historyfetchDepositsWithdrawals(code, since, limit) - Fetch both deposits and withdrawalscreateOrder(symbol, type, side, amount, price, params) - Create order (generic)createLimitOrder(symbol, side, amount, price) - Create limit ordercreateMarketOrder(symbol, side, amount) - Create market ordercreateLimitBuyOrder(symbol, amount, price) - Buy limit ordercreateLimitSellOrder(symbol, amount, price) - Sell limit ordercreateMarketBuyOrder(symbol, amount) - Buy market ordercreateMarketSellOrder(symbol, amount) - Sell market ordercreateMarketBuyOrderWithCost(symbol, cost) - Buy with specific costcreateStopLimitOrder(symbol, side, amount, price, stopPrice) - Stop-limit ordercreateStopMarketOrder(symbol, side, amount, stopPrice) - Stop-market ordercreateStopLossOrder(symbol, side, amount, stopPrice) - Stop-loss ordercreateTakeProfitOrder(symbol, side, amount, takeProfitPrice) - Take-profit ordercreateTrailingAmountOrder(symbol, side, amount, trailingAmount) - Trailing stopcreateTrailingPercentOrder(symbol, side, amount, trailingPercent) - Trailing stop %createTriggerOrder(symbol, side, amount, triggerPrice) - Trigger ordercreatePostOnlyOrder(symbol, side, amount, price) - Post-only ordercreateReduceOnlyOrder(symbol, side, amount, price) - Reduce-only ordercreateOrders([orders]) - Create multiple orders at oncecreateOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice) - OCO orderfetchOrder(orderId, symbol) - Fetch single orderfetchOrders(symbol, since, limit) - Fetch all ordersfetchOpenOrders(symbol, since, limit) - Fetch open ordersfetchClosedOrders(symbol, since, limit) - Fetch closed ordersfetchCanceledOrders(symbol, since, limit) - Fetch canceled ordersfetchOpenOrder(orderId, symbol) - Fetch specific open orderfetchOrdersByStatus(status, symbol) - Fetch orders by statuscancelOrder(orderId, symbol) - Cancel single ordercancelOrders([orderIds], symbol) - Cancel multiple orderscancelAllOrders(symbol) - Cancel all orders for symboleditOrder(orderId, symbol, type, side, amount, price) - Modify orderfetchBorrowRate(code) - Fetch borrow rate for marginfetchBorrowRates([codes]) - Fetch multiple borrow ratesfetchBorrowRateHistory(code, since, limit) - Historical borrow ratesfetchCrossBorrowRate(code) - Cross margin borrow ratefetchIsolatedBorrowRate(symbol, code) - Isolated margin borrow rateborrowMargin(code, amount, symbol) - Borrow marginrepayMargin(code, amount, symbol) - Repay marginfetchLeverage(symbol) - Fetch leveragesetLeverage(leverage, symbol) - Set leveragefetchLeverageTiers(symbols) - Fetch leverage tiersfetchMarketLeverageTiers(symbol) - Leverage tiers for marketsetMarginMode(marginMode, symbol) - Set margin mode (cross/isolated)fetchMarginMode(symbol) - Fetch margin modefetchPosition(symbol) - Fetch single positionfetchPositions([symbols]) - Fetch all positionsfetchPositionsForSymbol(symbol) - Fetch positions for symbolfetchPositionHistory(symbol, since, limit) - Position historyfetchPositionsHistory(symbols, since, limit) - Multiple position historyfetchPositionMode(symbol) - Fetch position mode (one-way/hedge)setPositionMode(hedged, symbol) - Set position modeclosePosition(symbol, side) - Close positioncloseAllPositions() - Close all positionsfetchFundingRate(symbol) - Current funding ratefetchFundingRates([symbols]) - Multiple funding ratesfetchFundingRateHistory(symbol, since, limit) - Funding rate historyfetchFundingHistory(symbol, since, limit) - Your funding paymentsfetchFundingInterval(symbol) - Funding intervalfetchSettlementHistory(symbol, since, limit) - Settlement historyfetchMySettlementHistory(symbol, since, limit) - Your settlement historyfetchOpenInterest(symbol) - Open interest for symbolfetchOpenInterests([symbols]) - Multiple open interestsfetchOpenInterestHistory(symbol, timeframe, since, limit) - OI historyfetchLiquidations(symbol, since, limit) - Public liquidationsfetchMyLiquidations(symbol, since, limit) - Your liquidationsfetchOption(symbol) - Fetch option infofetchOptionChain(code) - Fetch option chainfetchGreeks(symbol) - Fetch option greeksfetchVolatilityHistory(code, since, limit) - Volatility historyfetchUnderlyingAssets() - Fetch underlying assetsfetchTradingFee(symbol) - Trading fee for symbolfetchTradingFees([symbols]) - Trading fees for multiple symbolsfetchTradingLimits([symbols]) - Trading limitsfetchTransactionFee(code) - Transaction/withdrawal feefetchTransactionFees([codes]) - Multiple transaction feesfetchDepositWithdrawFee(code) - Deposit/withdrawal feefetchDepositWithdrawFees([codes]) - Multiple deposit/withdraw feesfetchDepositAddress(code, params) - Get deposit addressfetchDepositAddresses([codes]) - Multiple deposit addressesfetchDepositAddressesByNetwork(code) - Addresses by networkcreateDepositAddress(code, params) - Create new deposit addressfetchDeposit(id, code) - Fetch single depositfetchWithdrawal(id, code) - Fetch single withdrawalfetchWithdrawAddresses(code) - Fetch withdrawal addressesfetchWithdrawalWhitelist(code) - Fetch whitelistwithdraw(code, amount, address, tag, params) - Withdraw fundsdeposit(code, amount, params) - Deposit funds (if supported)transfer(code, amount, fromAccount, toAccount) - Internal transferfetchTransfer(id, code) - Fetch transfer infofetchTransfers(code, since, limit) - Fetch transfer historyfetchConvertCurrencies() - Currencies available for convertfetchConvertQuote(fromCode, toCode, amount) - Get conversion quotecreateConvertTrade(fromCode, toCode, amount) - Execute conversionfetchConvertTrade(id) - Fetch convert tradefetchConvertTradeHistory(code, since, limit) - Convert historyfetchMarkets() - Fetch all marketsfetchCurrencies() - Fetch all currenciesfetchTime() - Fetch exchange server timefetchStatus() - Fetch exchange statusfetchBorrowInterest(code, symbol, since, limit) - Borrow interest paidfetchLongShortRatio(symbol, timeframe, since, limit) - Long/short ratiofetchLongShortRatioHistory(symbol, timeframe, since, limit) - L/S ratio historyAll REST methods have WebSocket equivalents with watch* prefix:
watchTicker(symbol) - Watch single tickerwatchTickers([symbols]) - Watch multiple tickerswatchOrderBook(symbol) - Watch order book updateswatchOrderBookForSymbols([symbols]) - Watch multiple order bookswatchTrades(symbol) - Watch public tradeswatchOHLCV(symbol, timeframe) - Watch candlestick updateswatchBidsAsks([symbols]) - Watch best bid/askwatchBalance() - Watch balance updateswatchOrders(symbol) - Watch your order updateswatchMyTrades(symbol) - Watch your trade updateswatchPositions([symbols]) - Watch position updateswatchPositionsForSymbol(symbol) - Watch positions for symbolMethods marked with 🔒 require API credentials:
create* methods (creating orders, addresses)cancel* methods (canceling orders)edit* methods (modifying orders)fetchMy* methods (your trades, orders)fetchBalance, fetchLedger, fetchAccountswithdraw, transfer, depositwatchBalance, watchOrders, watchMyTrades, watchPositionsNot 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,
// ...
// }
fetch* - REST API methods (HTTP requests)watch* - WebSocket methods (real-time streams)create* - Create new resources (orders, addresses)cancel* - Cancel existing resourcesedit* - Modify existing resourcesset* - Configure settings (leverage, margin mode)*Ws suffix - WebSocket variant (some exchanges)CCXT supports HTTP, HTTPS, and SOCKS proxies for both REST and WebSocket connections.
// 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'
WebSocket connections also respect proxy settings:
exchange.httpsProxy = 'https://proxy:8080'
// WebSocket connections will use this proxy
exchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('Proxy working!')
} catch (error) {
console.error('Proxy connection failed:', error)
}
Some exchanges provide WebSocket variants of REST methods for faster order placement and management. These use the *Ws suffix:
Creating Orders:
createOrderWs - Create order via WebSocket (faster than REST)createLimitOrderWs - Create limit order via WebSocketcreateMarketOrderWs - Create market order via WebSocketcreateLimitBuyOrderWs - Buy limit order via WebSocketcreateLimitSellOrderWs - Sell limit order via WebSocketcreateMarketBuyOrderWs - Buy market order via WebSocketcreateMarketSellOrderWs - Sell market order via WebSocketcreateStopLimitOrderWs - Stop-limit order via WebSocketcreateStopMarketOrderWs - Stop-market order via WebSocketcreateStopLossOrderWs - Stop-loss order via WebSocketcreateTakeProfitOrderWs - Take-profit order via WebSocketcreateTrailingAmountOrderWs - Trailing stop via WebSocketcreateTrailingPercentOrderWs - Trailing stop % via WebSocketcreatePostOnlyOrderWs - Post-only order via WebSocketcreateReduceOnlyOrderWs - Reduce-only order via WebSocketManaging Orders:
editOrderWs - Edit order via WebSocketcancelOrderWs - Cancel order via WebSocket (faster than REST)cancelOrdersWs - Cancel multiple orders via WebSocketcancelAllOrdersWs - Cancel all orders via WebSocketFetching Data:
fetchOrderWs - Fetch order via WebSocketfetchOrdersWs - Fetch orders via WebSocketfetchOpenOrdersWs - Fetch open orders via WebSocketfetchClosedOrdersWs - Fetch closed orders via WebSocketfetchMyTradesWs - Fetch your trades via WebSocketfetchBalanceWs - Fetch balance via WebSocketfetchPositionWs - Fetch position via WebSocketfetchPositionsWs - Fetch positions via WebSocketfetchPositionsForSymbolWs - Fetch positions for symbol via WebSocketfetchTradingFeesWs - Fetch trading fees via WebSocketUse *Ws methods when:
Use REST methods when:
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)
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)
}
import "os"
// During instantiation
exchange := binance.New()
exchange.ApiKey = os.Getenv("BINANCE_API_KEY")
exchange.Secret = os.Getenv("BINANCE_SECRET")
exchange.EnableRateLimit = true
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!")
}
BaseError
├─ NetworkError (recoverable - retry)
│ ├─ RequestTimeout
│ ├─ ExchangeNotAvailable
│ ├─ RateLimitExceeded
│ └─ DDoSProtection
└─ ExchangeError (non-recoverable - don't retry)
├─ AuthenticationError
├─ InsufficientFunds
├─ InvalidOrder
└─ NotSupported
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)
}
}
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)
}
}
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")
}
exchange := binance.New()
exchange.EnableRateLimit = true // Automatically throttles requests
import "time"
exchange.FetchTicker("BTC/USDT")
time.Sleep(time.Duration(exchange.RateLimit) * time.Millisecond)
exchange.FetchTicker("ETH/USDT")
fmt.Println(exchange.RateLimit) // Milliseconds between requests
// 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 - 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"
// 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)
}
// 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)
}
// Wrong symbol formats
"BTCUSDT" // Wrong - no separator
"BTC-USDT" // Wrong - dash separator
"btc/usdt" // Wrong - lowercase
// Correct symbol format
"BTC/USDT" // Unified CCXT format
1. "package github.com/ccxt/ccxt/go/v4/binance: cannot find package"
go get github.com/ccxt/ccxt/go/v42. "RateLimitExceeded"
exchange.EnableRateLimit = true3. "AuthenticationError"
4. "InvalidNonce"
5. "InsufficientFunds"
balance["BTC"].Free)6. "ExchangeNotAvailable"
// 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)