Loading...
Loading...
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.
npx skill4agent add ccxt/ccxt ccxt-gogo get github.com/ccxt/ccxt/go/v4go get github.com/ccxt/ccxt/go/v4/propackage 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 | | |
| Methods | | |
| 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 |
(result, error)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 = trueimport "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)fetchTickers([symbols])fetchBidsAsks([symbols])fetchLastPrices([symbols])fetchMarkPrices([symbols])fetchOrderBook(symbol, limit)fetchOrderBooks([symbols])fetchL2OrderBook(symbol)fetchL3OrderBook(symbol)fetchTrades(symbol, since, limit)fetchMyTrades(symbol, since, limit)fetchOrderTrades(orderId, symbol)fetchOHLCV(symbol, timeframe, since, limit)fetchIndexOHLCV(symbol, timeframe)fetchMarkOHLCV(symbol, timeframe)fetchPremiumIndexOHLCV(symbol, timeframe)fetchBalance()fetchAccounts()fetchLedger(code, since, limit)fetchLedgerEntry(id, code)fetchTransactions(code, since, limit)fetchDeposits(code, since, limit)fetchWithdrawals(code, since, limit)fetchDepositsWithdrawals(code, since, limit)createOrder(symbol, type, side, amount, price, params)createLimitOrder(symbol, side, amount, price)createMarketOrder(symbol, side, amount)createLimitBuyOrder(symbol, amount, price)createLimitSellOrder(symbol, amount, price)createMarketBuyOrder(symbol, amount)createMarketSellOrder(symbol, amount)createMarketBuyOrderWithCost(symbol, cost)createStopLimitOrder(symbol, side, amount, price, stopPrice)createStopMarketOrder(symbol, side, amount, stopPrice)createStopLossOrder(symbol, side, amount, stopPrice)createTakeProfitOrder(symbol, side, amount, takeProfitPrice)createTrailingAmountOrder(symbol, side, amount, trailingAmount)createTrailingPercentOrder(symbol, side, amount, trailingPercent)createTriggerOrder(symbol, side, amount, triggerPrice)createPostOnlyOrder(symbol, side, amount, price)createReduceOnlyOrder(symbol, side, amount, price)createOrders([orders])createOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)fetchOrder(orderId, symbol)fetchOrders(symbol, since, limit)fetchOpenOrders(symbol, since, limit)fetchClosedOrders(symbol, since, limit)fetchCanceledOrders(symbol, since, limit)fetchOpenOrder(orderId, symbol)fetchOrdersByStatus(status, symbol)cancelOrder(orderId, symbol)cancelOrders([orderIds], symbol)cancelAllOrders(symbol)editOrder(orderId, symbol, type, side, amount, price)fetchBorrowRate(code)fetchBorrowRates([codes])fetchBorrowRateHistory(code, since, limit)fetchCrossBorrowRate(code)fetchIsolatedBorrowRate(symbol, code)borrowMargin(code, amount, symbol)repayMargin(code, amount, symbol)fetchLeverage(symbol)setLeverage(leverage, symbol)fetchLeverageTiers(symbols)fetchMarketLeverageTiers(symbol)setMarginMode(marginMode, symbol)fetchMarginMode(symbol)fetchPosition(symbol)fetchPositions([symbols])fetchPositionsForSymbol(symbol)fetchPositionHistory(symbol, since, limit)fetchPositionsHistory(symbols, since, limit)fetchPositionMode(symbol)setPositionMode(hedged, symbol)closePosition(symbol, side)closeAllPositions()fetchFundingRate(symbol)fetchFundingRates([symbols])fetchFundingRateHistory(symbol, since, limit)fetchFundingHistory(symbol, since, limit)fetchFundingInterval(symbol)fetchSettlementHistory(symbol, since, limit)fetchMySettlementHistory(symbol, since, limit)fetchOpenInterest(symbol)fetchOpenInterests([symbols])fetchOpenInterestHistory(symbol, timeframe, since, limit)fetchLiquidations(symbol, since, limit)fetchMyLiquidations(symbol, since, limit)fetchOption(symbol)fetchOptionChain(code)fetchGreeks(symbol)fetchVolatilityHistory(code, since, limit)fetchUnderlyingAssets()fetchTradingFee(symbol)fetchTradingFees([symbols])fetchTradingLimits([symbols])fetchTransactionFee(code)fetchTransactionFees([codes])fetchDepositWithdrawFee(code)fetchDepositWithdrawFees([codes])fetchDepositAddress(code, params)fetchDepositAddresses([codes])fetchDepositAddressesByNetwork(code)createDepositAddress(code, params)fetchDeposit(id, code)fetchWithdrawal(id, code)fetchWithdrawAddresses(code)fetchWithdrawalWhitelist(code)withdraw(code, amount, address, tag, params)deposit(code, amount, params)transfer(code, amount, fromAccount, toAccount)fetchTransfer(id, code)fetchTransfers(code, since, limit)fetchConvertCurrencies()fetchConvertQuote(fromCode, toCode, amount)createConvertTrade(fromCode, toCode, amount)fetchConvertTrade(id)fetchConvertTradeHistory(code, since, limit)fetchMarkets()fetchCurrencies()fetchTime()fetchStatus()fetchBorrowInterest(code, symbol, since, limit)fetchLongShortRatio(symbol, timeframe, since, limit)fetchLongShortRatioHistory(symbol, timeframe, since, limit)watch*watchTicker(symbol)watchTickers([symbols])watchOrderBook(symbol)watchOrderBookForSymbols([symbols])watchTrades(symbol)watchOHLCV(symbol, timeframe)watchBidsAsks([symbols])watchBalance()watchOrders(symbol)watchMyTrades(symbol)watchPositions([symbols])watchPositionsForSymbol(symbol)create*cancel*edit*fetchMy*fetchBalancefetchLedgerfetchAccountswithdrawtransferdepositwatchBalancewatchOrderswatchMyTradeswatchPositions// 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*watch*create*cancel*edit*set**Ws// 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'exchange.httpsProxy = 'https://proxy:8080'
// WebSocket connections will use this proxyexchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('Proxy working!')
} catch (error) {
console.error('Proxy connection failed:', error)
}*WscreateOrderWscreateLimitOrderWscreateMarketOrderWscreateLimitBuyOrderWscreateLimitSellOrderWscreateMarketBuyOrderWscreateMarketSellOrderWscreateStopLimitOrderWscreateStopMarketOrderWscreateStopLossOrderWscreateTakeProfitOrderWscreateTrailingAmountOrderWscreateTrailingPercentOrderWscreatePostOnlyOrderWscreateReduceOnlyOrderWseditOrderWscancelOrderWscancelOrdersWscancelAllOrdersWsfetchOrderWsfetchOrdersWsfetchOpenOrdersWsfetchClosedOrdersWsfetchMyTradesWsfetchBalanceWsfetchPositionWsfetchPositionsWsfetchPositionsForSymbolWsfetchTradingFeesWs*Wsconst order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)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 = truebalance, 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
└─ NotSupportedimport "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 requestsimport "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 formatgo get github.com/ccxt/ccxt/go/v4exchange.EnableRateLimit = truebalance["BTC"].Free// 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)