1
0
mirror of https://github.com/JKorf/CryptoExchange.Net.git synced 2026-08-11 16:32:57 +00:00
Files
CryptoExchange.Net/Examples/ai-friendly/01-shared-clients-quickstart.cs
2026-05-07 14:15:50 +02:00

66 lines
2.9 KiB
C#

// 01-shared-clients-quickstart.cs
//
// Demonstrates: the SharedApis pattern — same code calling multiple exchanges.
//
// Setup:
// dotnet add package Binance.Net
// dotnet add package JK.OKX.Net
using Binance.Net.Clients;
using OKX.Net.Clients;
using CryptoExchange.Net.SharedApis;
// ---- THE PATTERN ----
// Each exchange library exposes `.SharedClient` properties on its API surfaces.
// Those implement common interfaces from CryptoExchange.Net.SharedApis.
// You write code against the interface — it works against any exchange.
ISpotTickerRestClient binance = new BinanceRestClient().SpotApi.SharedClient;
ISpotTickerRestClient okx = new OKXRestClient().UnifiedApi.SharedClient;
// ---- SYMBOL NORMALIZATION ----
// Different exchanges use different formats: "BTCUSDT" (Binance), "BTC-USDT" (OKX).
// SharedSymbol normalizes — pass it instead of raw strings to shared methods.
var btcusdt = new SharedSymbol(TradingMode.Spot, "BTC", "USDT");
// ---- AGNOSTIC METHOD — runs against any exchange ----
async Task PrintTicker(ISpotTickerRestClient client, SharedSymbol symbol)
{
var result = await client.GetSpotTickerAsync(new GetTickerRequest(symbol));
if (!result.Success)
{
Console.WriteLine($"[{client.Exchange}] Failed: {result.Error}");
return;
}
// SharedSpotTicker has a unified shape regardless of the source exchange
Console.WriteLine($"[{client.Exchange}] {result.Data.Symbol}: last={result.Data.LastPrice}, 24h-vol={result.Data.Volume}");
}
await PrintTicker(binance, btcusdt);
await PrintTicker(okx, btcusdt);
// ---- WEBSOCKET PATTERN ----
ITickerSocketClient binanceTickerSocket = new BinanceSocketClient().SpotApi.SharedClient;
ITickerSocketClient okxTickerSocket = new OKXSocketClient().UnifiedApi.SharedClient;
var sub1 = await binanceTickerSocket.SubscribeToTickerUpdatesAsync(
new SubscribeTickerRequest(btcusdt),
update => Console.WriteLine($"[{binanceTickerSocket.Exchange}] {update.Data.Symbol}: {update.Data.LastPrice}"));
var sub2 = await okxTickerSocket.SubscribeToTickerUpdatesAsync(
new SubscribeTickerRequest(btcusdt),
update => Console.WriteLine($"[{okxTickerSocket.Exchange}] {update.Data.Symbol}: {update.Data.LastPrice}"));
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
if (sub1.Success) await sub1.Data.CloseAsync();
if (sub2.Success) await sub2.Data.CloseAsync();
// Common variations:
// Add Bybit: ISpotTickerRestClient bybit = new BybitRestClient().V5Api.SharedClient;
// Add Kraken: ISpotTickerRestClient kraken = new KrakenRestClient().SpotApi.SharedClient;
// Add Coinbase: ISpotTickerRestClient cb = new CoinbaseRestClient().AdvancedTradeApi.SharedClient;
// Other interfaces: ISpotOrderRestClient (place/cancel orders), IBalanceRestClient (balances),
// IFuturesOrderRestClient, IPositionRestClient, IOrderBookSocketClient, etc.