diff --git a/Examples/CryptoClients.Examples.Blazor/Pages/Books.razor b/Examples/CryptoClients.Examples.Blazor/Pages/Books.razor index 1f46deb..68608fc 100644 --- a/Examples/CryptoClients.Examples.Blazor/Pages/Books.razor +++ b/Examples/CryptoClients.Examples.Blazor/Pages/Books.razor @@ -1,12 +1,13 @@ @page "/books" @using CryptoExchange.Net.Interfaces +@using CryptoExchange.Net.SharedApis @inject IExchangeOrderBookFactory BookFactory @implements IDisposable Live Local Order Books
-

@_baseAsset @_quoteAsset live books

+

BTC USDT live books

@foreach(var book in _books) { @@ -44,31 +45,15 @@ { private Dictionary _books = new Dictionary(); - private string _baseAsset = "BTC"; - private string _quoteAsset = "USDT"; private Timer? _timer; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { - _books = new Dictionary - { - { Exchange.Binance, BookFactory.Binance.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.BingX, BookFactory.BingX.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.Bitfinex, BookFactory.Bitfinex.Spot.Create(_baseAsset, "UST") }, - { Exchange.Bitget, BookFactory.Bitget.Spot.Create(_baseAsset, _quoteAsset) }, - //{ Exchange.BitMart, BookFactory.BitMart.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.Bybit, BookFactory.Bybit.Spot.Create(_baseAsset, _quoteAsset) }, - //{ Exchange.Coinbase, BookFactory.Coinbase.AdvancedTrade.Create(_baseAsset, _quoteAsset) }, - { Exchange.CoinEx, BookFactory.CoinEx.Spot.Create(_baseAsset, _quoteAsset) }, - //{ Exchange.GateIo, BookFactory.GateIo.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.HTX, BookFactory.HTX.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.Kraken, BookFactory.Kraken.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.Kucoin, BookFactory.Kucoin.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.Mexc, BookFactory.Mexc.Spot.Create(_baseAsset, _quoteAsset) }, - { Exchange.OKX, BookFactory.OKX.Unified.Create(_baseAsset, _quoteAsset) }, - }; + var symbol = new SharedSymbol(TradingMode.Spot, "BTC", "USDT"); + foreach (var exchange in Exchange.All) + _books.Add(exchange, BookFactory.Create(exchange, symbol, 5)!); var tasks = new List(); foreach (var book in _books.Values) diff --git a/Examples/CryptoClients.Examples.Blazor/Pages/Trackers.razor b/Examples/CryptoClients.Examples.Blazor/Pages/Trackers.razor new file mode 100644 index 0000000..4297ced --- /dev/null +++ b/Examples/CryptoClients.Examples.Blazor/Pages/Trackers.razor @@ -0,0 +1,85 @@ +@page "/trackers" +@using CryptoExchange.Net.Interfaces +@using CryptoExchange.Net.SharedApis +@using CryptoExchange.Net.Trackers.Trades +@inject IExchangeTrackerFactory TrackerFactory +@implements IDisposable + +Live Trade Tracking + +
+

BTC USDT Live Trade Tracking

+ + @foreach (var tracker in _trackers) + { +
+ @tracker.Exchange - @tracker.SymbolName [@tracker.Status] + + + + + + + + + + @{ + var stats2Min = tracker.GetStats(DateTime.UtcNow.AddMinutes(-3), DateTime.UtcNow.AddMinutes(-2)); + var stats1Min = tracker.GetStats(DateTime.UtcNow.AddMinutes(-2), DateTime.UtcNow.AddMinutes(-1)); + var statsNow = tracker.GetStats(DateTime.UtcNow.AddMinutes(-1)); + var compare = stats2Min.CompareTo(statsNow); + + + + + + + + + + + + + + + + } +
-2 min-1 minlast minDif -2 to now
Trades@stats2Min.TradeCount@stats1Min.TradeCount@statsNow.TradeCount@compare.TradeCountDif.Difference
Avg Price@stats2Min.VolumeWeightedAveragePrice@stats1Min.VolumeWeightedAveragePrice@statsNow.VolumeWeightedAveragePrice@compare.VolumeWeightedAveragePriceDif?.PercentageDifference%
+
+ } +
+ +@code +{ + private List _trackers = new List(); + + private Timer? _timer; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + var symbol = new SharedSymbol(TradingMode.Spot, "BTC", "USDT"); + _trackers = new List(); + foreach (var exchange in Exchange.All) + { + _trackers.Add(TrackerFactory.CreateTradeTracker(exchange, symbol, period: TimeSpan.FromMinutes(5))!); + }; + + var tasks = new List(); + foreach (var tracker in _trackers) + tasks.Add(tracker.StartAsync()); + await Task.WhenAll(tasks); + + _timer = new Timer(async (x) => await InvokeAsync(StateHasChanged), null, 0, 1000); + } + } + + public void Dispose() + { + foreach (var tracker in _trackers) + tracker.StopAsync(); + + _timer?.Dispose(); + } +} \ No newline at end of file diff --git a/Examples/CryptoClients.Examples.Blazor/Shared/MainLayout.razor b/Examples/CryptoClients.Examples.Blazor/Shared/MainLayout.razor index 3ee3a38..7a229db 100644 --- a/Examples/CryptoClients.Examples.Blazor/Shared/MainLayout.razor +++ b/Examples/CryptoClients.Examples.Blazor/Shared/MainLayout.razor @@ -45,6 +45,7 @@ new NavItem { Id = "1", Href = "/", IconName = IconName.HouseDoorFill, Text = "Request prices", Match=NavLinkMatch.All}, new NavItem { Id = "2", Href = "/live", IconName = IconName.PlusSquareFill, Text = "Live trades"}, new NavItem { Id = "3", Href = "/books", IconName = IconName.PlusSquareFill, Text = "Order books"}, + new NavItem { Id = "4", Href = "/trackers", IconName = IconName.PlusSquareFill, Text = "Trackers"}, }; return navItems;