Loading...
Loading...
CCXT cryptocurrency exchange library for C# and .NET 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 .NET projects. Use when working with crypto exchanges in C# applications, trading systems, or financial software. Supports .NET Standard 2.0+.
npx skill4agent add ccxt/ccxt ccxt-csharpdotnet add package CCXT.NETusing ccxt;
var exchange = new Binance();
await exchange.LoadMarkets();
var ticker = await exchange.FetchTicker("BTC/USDT");
Console.WriteLine(ticker);using ccxt.pro;
var exchange = new Binance();
while (true)
{
var ticker = await exchange.WatchTicker("BTC/USDT");
Console.WriteLine(ticker.Last); // Live updates!
}
await exchange.Close();| 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 |
FetchTickerfetchTickerWatchTickerwatchTickerusing ccxt;
// Public API (no authentication)
var exchange = new Binance
{
EnableRateLimit = true // Recommended!
};
// Private API (with authentication)
var exchange = new Binance
{
ApiKey = "YOUR_API_KEY",
Secret = "YOUR_SECRET",
EnableRateLimit = true
};using ccxt.pro;
// Public WebSocket
var exchange = new Binance();
// Private WebSocket (with authentication)
var exchange = new Binance
{
ApiKey = "YOUR_API_KEY",
Secret = "YOUR_SECRET"
};
// Always close when done
await exchange.Close();// Load all available trading pairs
await exchange.LoadMarkets();
// Access market information
var btcMarket = exchange.Market("BTC/USDT");
Console.WriteLine(btcMarket.Limits.Amount.Min); // Minimum order amount// Single ticker
var ticker = await exchange.FetchTicker("BTC/USDT");
Console.WriteLine(ticker.Last); // Last price
Console.WriteLine(ticker.Bid); // Best bid
Console.WriteLine(ticker.Ask); // Best ask
Console.WriteLine(ticker.Volume); // 24h volume
// Multiple tickers (if supported)
var tickers = await exchange.FetchTickers(new[] { "BTC/USDT", "ETH/USDT" });// Full orderbook
var orderbook = await exchange.FetchOrderBook("BTC/USDT");
Console.WriteLine(orderbook.Bids[0]); // [price, amount]
Console.WriteLine(orderbook.Asks[0]); // [price, amount]
// Limited depth
var orderbook = await exchange.FetchOrderBook("BTC/USDT", 5); // Top 5 levels// Buy limit order
var order = await exchange.CreateLimitBuyOrder("BTC/USDT", 0.01, 50000);
Console.WriteLine(order.Id);
// Sell limit order
var order = await exchange.CreateLimitSellOrder("BTC/USDT", 0.01, 60000);
// Generic limit order
var order = await exchange.CreateOrder("BTC/USDT", "limit", "buy", 0.01, 50000);// Buy market order
var order = await exchange.CreateMarketBuyOrder("BTC/USDT", 0.01);
// Sell market order
var order = await exchange.CreateMarketSellOrder("BTC/USDT", 0.01);
// Generic market order
var order = await exchange.CreateOrder("BTC/USDT", "market", "sell", 0.01);var balance = await exchange.FetchBalance();
Console.WriteLine(balance["BTC"].Free); // Available balance
Console.WriteLine(balance["BTC"].Used); // Balance in orders
Console.WriteLine(balance["BTC"].Total); // Total balance// Open orders
var openOrders = await exchange.FetchOpenOrders("BTC/USDT");
// Closed orders
var closedOrders = await exchange.FetchClosedOrders("BTC/USDT");
// All orders (open + closed)
var allOrders = await exchange.FetchOrders("BTC/USDT");
// Single order by ID
var order = await exchange.FetchOrder(orderId, "BTC/USDT");// Recent public trades
var trades = await exchange.FetchTrades("BTC/USDT", limit: 10);
// Your trades (requires authentication)
var myTrades = await exchange.FetchMyTrades("BTC/USDT");// Cancel single order
await exchange.CancelOrder(orderId, "BTC/USDT");
// Cancel all orders for a symbol
await exchange.CancelAllOrders("BTC/USDT");using ccxt.pro;
var exchange = new Binance();
while (true)
{
var ticker = await exchange.WatchTicker("BTC/USDT");
Console.WriteLine($"Last: {ticker.Last}");
}
await exchange.Close();var exchange = new Binance();
while (true)
{
var orderbook = await exchange.WatchOrderBook("BTC/USDT");
Console.WriteLine($"Best bid: {orderbook.Bids[0][0]}");
Console.WriteLine($"Best ask: {orderbook.Asks[0][0]}");
}
await exchange.Close();var exchange = new Binance();
while (true)
{
var trades = await exchange.WatchTrades("BTC/USDT");
foreach (var trade in trades)
{
Console.WriteLine($"{trade.Price} {trade.Amount} {trade.Side}");
}
}
await exchange.Close();var exchange = new Binance
{
ApiKey = "YOUR_API_KEY",
Secret = "YOUR_SECRET"
};
while (true)
{
var orders = await exchange.WatchOrders("BTC/USDT");
foreach (var order in orders)
{
Console.WriteLine($"{order.Id} {order.Status} {order.Filled}");
}
}
await exchange.Close();var exchange = new Binance
{
ApiKey = "YOUR_API_KEY",
Secret = "YOUR_SECRET"
};
while (true)
{
var balance = await exchange.WatchBalance();
Console.WriteLine($"BTC: {balance["BTC"].Total}");
}
await exchange.Close();var exchange = new Binance();
var symbols = new[] { "BTC/USDT", "ETH/USDT", "SOL/USDT" };
while (true)
{
var tickers = await exchange.WatchTickers(symbols);
foreach (var kvp in tickers)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value.Last}");
}
}
await exchange.Close();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)
}using System;
// During instantiation (recommended)
var exchange = new Binance
{
ApiKey = Environment.GetEnvironmentVariable("BINANCE_API_KEY"),
Secret = Environment.GetEnvironmentVariable("BINANCE_SECRET"),
EnableRateLimit = true
};
// After instantiation
exchange.ApiKey = Environment.GetEnvironmentVariable("BINANCE_API_KEY");
exchange.Secret = Environment.GetEnvironmentVariable("BINANCE_SECRET");try
{
var balance = await exchange.FetchBalance();
Console.WriteLine("Authentication successful!");
}
catch (AuthenticationError)
{
Console.WriteLine("Invalid API credentials");
}BaseError
├─ NetworkError (recoverable - retry)
│ ├─ RequestTimeout
│ ├─ ExchangeNotAvailable
│ ├─ RateLimitExceeded
│ └─ DDoSProtection
└─ ExchangeError (non-recoverable - don't retry)
├─ AuthenticationError
├─ InsufficientFunds
├─ InvalidOrder
└─ NotSupportedusing ccxt;
try
{
var ticker = await exchange.FetchTicker("BTC/USDT");
}
catch (NetworkError ex)
{
Console.WriteLine($"Network error - retry: {ex.Message}");
}
catch (ExchangeError ex)
{
Console.WriteLine($"Exchange error - do not retry: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Unknown error: {ex.Message}");
}try
{
var order = await exchange.CreateOrder("BTC/USDT", "limit", "buy", 0.01, 50000);
}
catch (InsufficientFunds)
{
Console.WriteLine("Not enough balance");
}
catch (InvalidOrder)
{
Console.WriteLine("Invalid order parameters");
}
catch (RateLimitExceeded)
{
Console.WriteLine("Rate limit hit - wait before retrying");
await Task.Delay(1000); // Wait 1 second
}
catch (AuthenticationError)
{
Console.WriteLine("Check your API credentials");
}async Task<Ticker> FetchWithRetry(int maxRetries = 3)
{
for (int i = 0; i < maxRetries; i++)
{
try
{
return await exchange.FetchTicker("BTC/USDT");
}
catch (NetworkError)
{
if (i < maxRetries - 1)
{
Console.WriteLine($"Retry {i + 1}/{maxRetries}");
await Task.Delay(1000 * (i + 1)); // Exponential backoff
}
else
{
throw;
}
}
}
return null;
}var exchange = new Binance
{
EnableRateLimit = true // Automatically throttles requests
};await exchange.FetchTicker("BTC/USDT");
await Task.Delay((int)exchange.RateLimit); // Wait between requests
await exchange.FetchTicker("ETH/USDT");Console.WriteLine(exchange.RateLimit); // Milliseconds between requests// Wrong - lowercase (JavaScript style)
var ticker = await exchange.fetchTicker("BTC/USDT"); // ERROR!
// Correct - PascalCase (C# style)
var ticker = await exchange.FetchTicker("BTC/USDT");// Wrong - missing await
var ticker = exchange.FetchTicker("BTC/USDT"); // Returns Task, not Ticker!
Console.WriteLine(ticker.Last); // ERROR!
// Correct
var ticker = await exchange.FetchTicker("BTC/USDT");
Console.WriteLine(ticker.Last); // Works!// Wrong - wastes rate limits
while (true)
{
var ticker = await exchange.FetchTicker("BTC/USDT"); // REST
Console.WriteLine(ticker.Last);
await Task.Delay(1000);
}
// Correct - use WebSocket
using ccxt.pro;
var exchange = new Binance();
while (true)
{
var ticker = await exchange.WatchTicker("BTC/USDT"); // WebSocket
Console.WriteLine(ticker.Last);
}// Wrong - memory leak
var exchange = new ccxt.pro.Binance();
var ticker = await exchange.WatchTicker("BTC/USDT");
// Forgot to close!
// Correct
var exchange = new ccxt.pro.Binance();
try
{
while (true)
{
var ticker = await exchange.WatchTicker("BTC/USDT");
Console.WriteLine(ticker.Last);
}
}
finally
{
await exchange.Close();
}// Wrong symbol formats
"BTCUSDT" // Wrong - no separator
"BTC-USDT" // Wrong - dash separator
"btc/usdt" // Wrong - lowercase
// Correct symbol format
"BTC/USDT" // Unified CCXT formatdotnet add package CCXT.NETEnableRateLimit = truebalance["BTC"].Free// Enable verbose logging
exchange.Verbose = true;
// Check exchange capabilities
Console.WriteLine(exchange.Has);
// {
// FetchTicker = true,
// FetchOrderBook = true,
// CreateOrder = true,
// ...
// }
// Check market information
var market = exchange.Markets["BTC/USDT"];
// Check last request/response
Console.WriteLine(exchange.LastHttpResponse);
Console.WriteLine(exchange.LastJsonResponse);