Claude-skill-registry ccxt-csharp
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+.
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-csharp" ~/.claude/skills/majiayu000-claude-skill-registry-ccxt-csharp && rm -rf "$T"
skills/data/ccxt-csharp/SKILL.mdCCXT for C#
A comprehensive guide to using CCXT in C# and .NET projects for cryptocurrency exchange integration.
Installation
Via NuGet Package Manager
dotnet add package CCXT.NET
Or via Visual Studio:
- Right-click project → Manage NuGet Packages
- Search for "CCXT.NET"
- Click Install
Requirements
- .NET Standard 2.0 or higher
- .NET Core 2.0+ / .NET 5+ / .NET Framework 4.6.1+
Quick Start
REST API
using ccxt; var exchange = new Binance(); await exchange.LoadMarkets(); var ticker = await exchange.FetchTicker("BTC/USDT"); Console.WriteLine(ticker);
WebSocket API - Real-time Updates
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();
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 |
Method naming: C# uses PascalCase -
FetchTicker not fetchTicker, WatchTicker not watchTicker
Creating Exchange Instance
REST API
using 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 };
WebSocket API
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();
Common REST Operations
Loading Markets
// 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
Fetching Ticker
// 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" });
Fetching Order Book
// 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
Creating Orders
Limit Order
// 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);
Market Order
// 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);
Fetching Balance
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
Fetching Orders
// 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");
Fetching Trades
// Recent public trades var trades = await exchange.FetchTrades("BTC/USDT", limit: 10); // Your trades (requires authentication) var myTrades = await exchange.FetchMyTrades("BTC/USDT");
Canceling Orders
// 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)
using ccxt.pro; var exchange = new Binance(); while (true) { var ticker = await exchange.WatchTicker("BTC/USDT"); Console.WriteLine($"Last: {ticker.Last}"); } await exchange.Close();
Watching Order Book (Live Depth Updates)
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();
Watching Trades (Live Trade Stream)
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();
Watching Your Orders (Live Order Updates)
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();
Watching Balance (Live Balance Updates)
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();
Watching Multiple Symbols
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();
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
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");
Testing Authentication
try { var balance = await exchange.FetchBalance(); Console.WriteLine("Authentication successful!"); } catch (AuthenticationError) { Console.WriteLine("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
using 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}"); }
Specific Exception Handling
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"); }
Retry Logic for Network Errors
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; }
Rate Limiting
Built-in Rate Limiter (Recommended)
var exchange = new Binance { EnableRateLimit = true // Automatically throttles requests };
Manual Delays
await exchange.FetchTicker("BTC/USDT"); await Task.Delay((int)exchange.RateLimit); // Wait between requests await exchange.FetchTicker("ETH/USDT");
Checking Rate Limit
Console.WriteLine(exchange.RateLimit); // Milliseconds between requests
Common Pitfalls
Wrong Method Casing
// Wrong - lowercase (JavaScript style) var ticker = await exchange.fetchTicker("BTC/USDT"); // ERROR! // Correct - PascalCase (C# style) var ticker = await exchange.FetchTicker("BTC/USDT");
Not Awaiting Async Methods
// 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!
Using REST for Real-time Monitoring
// 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); }
Not Closing WebSocket Connections
// 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(); }
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 CCXT.NET not found"
- Solution: Run
dotnet add package CCXT.NET
2. "RateLimitExceeded"
- Solution: Set
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 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);