trading-ccxt-csharp
npx skills add https://github.com/baotoq/agent-skills --skill trading-ccxt-csharp
Agent 安装分布
Skill 文档
CCXT 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 | using ccxt; |
using ccxt.pro; |
| 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 |
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
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)
Order Books
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)
Trades
fetchTrades(symbol, since, limit)– Fetch public tradesfetchMyTrades(symbol, since, limit)– Fetch your trades (auth required)fetchOrderTrades(orderId, symbol)– Fetch trades for specific order
OHLCV (Candlesticks)
fetchOHLCV(symbol, timeframe, since, limit)– Fetch candlestick datafetchIndexOHLCV(symbol, timeframe)– Fetch index price OHLCVfetchMarkOHLCV(symbol, timeframe)– Fetch mark price OHLCVfetchPremiumIndexOHLCV(symbol, timeframe)– Fetch premium index OHLCV
Account & Balance
fetchBalance()– 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 withdrawals
Trading Methods
Creating Orders
createOrder(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 order
Managing Orders
fetchOrder(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 order
Margin & Leverage
fetchBorrowRate(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 mode
Derivatives & Futures
Positions
fetchPosition(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 positions
Funding & Settlement
fetchFundingRate(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 history
Open Interest & Liquidations
fetchOpenInterest(symbol)– Open interest for symbolfetchOpenInterests([symbols])– Multiple open interestsfetchOpenInterestHistory(symbol, timeframe, since, limit)– OI historyfetchLiquidations(symbol, since, limit)– Public liquidationsfetchMyLiquidations(symbol, since, limit)– Your liquidations
Options
fetchOption(symbol)– Fetch option infofetchOptionChain(code)– Fetch option chainfetchGreeks(symbol)– Fetch option greeksfetchVolatilityHistory(code, since, limit)– Volatility historyfetchUnderlyingAssets()– Fetch underlying assets
Fees & Limits
fetchTradingFee(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 fees
Deposits & Withdrawals
fetchDepositAddress(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 & Convert
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 history
Market Info
fetchMarkets()– 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 history
WebSocket Methods (ccxt.pro)
All REST methods have WebSocket equivalents with watch* prefix:
Real-time Market Data
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/ask
Real-time Account Data (Auth Required)
watchBalance()– Watch balance updateswatchOrders(symbol)– Watch your order updateswatchMyTrades(symbol)– Watch your trade updateswatchPositions([symbols])– Watch position updateswatchPositionsForSymbol(symbol)– Watch positions for symbol
Authentication Required
Methods marked with ð require API credentials:
- All
create*methods (creating orders, addresses) - All
cancel*methods (canceling orders) - All
edit*methods (modifying orders) - All
fetchMy*methods (your trades, orders) fetchBalance,fetchLedger,fetchAccountswithdraw,transfer,deposit- Margin/leverage methods
- Position methods
watchBalance,watchOrders,watchMyTrades,watchPositions
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
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)*Wssuffix – WebSocket variant (some exchanges)
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:
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 WebSocket
Managing Orders:
editOrderWs– Edit order via WebSocketcancelOrderWs– Cancel order via WebSocket (faster than REST)cancelOrdersWs– Cancel multiple orders via WebSocketcancelAllOrdersWs– Cancel all orders via WebSocket
Fetching 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 WebSocket
When to Use WebSocket Methods
Use *Ws methods when:
- 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);