@page "/LiveData" @inject IBinanceSocketClient binanceSocketClient @inject IBingXSocketClient bingXSocketClient @inject IBitfinexSocketClient bitfinexSocketClient @inject IBitgetSocketClient bitgetSocketClient @inject IBitMartSocketClient bitmartSocketClient @inject IBitMEXSocketClient bitmexSocketClient @inject IBybitSocketClient bybitSocketClient @inject ICoinbaseSocketClient coinbaseSocketClient @inject ICoinExSocketClient coinExSocketClient @inject ICryptoComSocketClient cryptocomSocketClient @inject IDeepCoinSocketClient deepCoinSocketClient @inject IGateIoSocketClient gateioSocketClient @inject IHTXSocketClient htxSocketClient @inject IHyperLiquidSocketClient hyperLiquidSocketClient @inject IKrakenSocketClient krakenSocketClient @inject IKucoinSocketClient kucoinSocketClient @inject IMexcSocketClient mexcSocketClient @inject IOKXSocketClient okxSocketClient @inject IWhiteBitSocketClient whitebitSocketClient @using System.Collections.Concurrent @using CryptoExchange.Net.Objects @using CryptoExchange.Net.Objects.Sockets; @using CryptoExchange.Net.Sockets @implements IDisposable

ETH-BTC prices, live updates:

@foreach(var price in _prices.OrderBy(p => p.Key)) {
@price.Key: @price.Value
} @code{ private ConcurrentDictionary _prices = new ConcurrentDictionary(); private UpdateSubscription[] _subs = Array.Empty(); protected override async Task OnInitializedAsync() { var tasks = new Task>[] { binanceSocketClient.SpotApi.ExchangeData.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Binance", data.Data.LastPrice)), bingXSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("BingX", data.Data.LastPrice)), bitfinexSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("tETHBTC", data => UpdateData("Bitfinex", data.Data.LastPrice)), bitgetSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Bitget", data.Data.LastPrice)), bitmartSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH_BTC", data => UpdateData("BitMart", data.Data.LastPrice)), bitmexSocketClient.ExchangeApi.SubscribeToSymbolUpdatesAsync("ETH_XBT", data => UpdateData("BitMEX", data.Data.LastPrice ?? 0)), bybitSocketClient.V5SpotApi.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Bybit", data.Data.LastPrice)), coinExSocketClient.SpotApiV2.SubscribeToTickerUpdatesAsync(["ETHBTC"], data => UpdateData("CoinEx", data.Data.First().LastPrice)), coinbaseSocketClient.AdvancedTradeApi.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("Coinbase", data.Data.LastPrice ?? 0)), cryptocomSocketClient.ExchangeApi.SubscribeToTickerUpdatesAsync("ETH_BTC", data => UpdateData("CryptoCom", data.Data.LastPrice ?? 0)), deepCoinSocketClient.ExchangeApi.SubscribeToSymbolUpdatesAsync("ETH-BTC", data => UpdateData("DeepCoin", data.Data.LastPrice ?? 0)), gateioSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH_BTC", data => UpdateData("GateIo", data.Data.LastPrice)), htxSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ethbtc", data => UpdateData("HTX", data.Data.ClosePrice ?? 0)), // HyperLiquid doesn't support the ETH/BTC pair //hyperLiquidSocketClient.SpotApi.SubscribeToSymbolUpdatesAsync("ETH", data => UpdateData("HyperLiquid", data.Data.MidPrice ?? 0)), krakenSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH/BTC", data => UpdateData("Kraken", data.Data.LastPrice)), kucoinSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("Kucoin", data.Data.LastPrice ?? 0)), mexcSocketClient.SpotApi.SubscribeToMiniTickerUpdatesAsync("ETHBTC", data => UpdateData("Mexc", data.Data.LastPrice)), okxSocketClient.UnifiedApi.ExchangeData.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("OKX", data.Data.LastPrice ?? 0)), whitebitSocketClient.V4Api.SubscribeToTickerUpdatesAsync("ETH_BTC", data => UpdateData("WhiteBit", data.Data.Ticker.LastPrice)), }; await Task.WhenAll(tasks); _subs = tasks.Where(t => t.Result.Success).Select(t => t.Result.Data).ToArray(); } private void UpdateData(string exchange, decimal price) { _prices[exchange] = price; InvokeAsync(StateHasChanged); } public void Dispose() { foreach (var sub in _subs) // It's not necessary to wait for this _ = sub.CloseAsync(); } }