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]
+
+
+ |
+ -2 min |
+ -1 min |
+ last min |
+ Dif -2 to now |
+
+
+ @{
+ 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);
+
+
+ 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;