diff --git a/CryptoExchange.Net.UnitTests/CryptoExchange.Net.UnitTests.csproj b/CryptoExchange.Net.UnitTests/CryptoExchange.Net.UnitTests.csproj index 89e47ad..8400ca8 100644 --- a/CryptoExchange.Net.UnitTests/CryptoExchange.Net.UnitTests.csproj +++ b/CryptoExchange.Net.UnitTests/CryptoExchange.Net.UnitTests.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/Examples/BlazorClient/BlazorClient.csproj b/Examples/BlazorClient/BlazorClient.csproj index d08e083..574dcf3 100644 --- a/Examples/BlazorClient/BlazorClient.csproj +++ b/Examples/BlazorClient/BlazorClient.csproj @@ -5,22 +5,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/Examples/BlazorClient/Pages/OrderBooks.razor b/Examples/BlazorClient/Pages/OrderBooks.razor index 1bec6f7..1c15995 100644 --- a/Examples/BlazorClient/Pages/OrderBooks.razor +++ b/Examples/BlazorClient/Pages/OrderBooks.razor @@ -74,7 +74,7 @@ { "Bybit", bybitFactory.Create("ETHBTC", Bybit.Net.Enums.Category.Spot) }, { "Coinbase", coinbaseFactory.Create("ETH-BTC", null) }, { "CoinEx", coinExFactory.CreateSpot("ETHBTC") }, - { "CryptoCom", cryptocomFactory.CreateExchange("ETH_BTC") }, + { "CryptoCom", cryptocomFactory.Create("ETH_BTC") }, { "GateIo", gateioFactory.CreateSpot("ETH_BTC") }, { "HTX", htxFactory.CreateSpot("ethbtc") }, { "Kraken", krakenFactory.CreateSpot("ETH/XBT") }, diff --git a/Examples/BlazorClient/Pages/Trackers.razor b/Examples/BlazorClient/Pages/Trackers.razor new file mode 100644 index 0000000..1de8fe7 --- /dev/null +++ b/Examples/BlazorClient/Pages/Trackers.razor @@ -0,0 +1,111 @@ +@page "/Trackers" +@using System.Collections.Concurrent +@using System.Timers +@using Binance.Net.Interfaces +@using BingX.Net.Interfaces +@using Bitfinex.Net.Interfaces +@using Bitget.Net.Interfaces; +@using BitMart.Net.Interfaces; +@using Bybit.Net.Interfaces +@using CoinEx.Net.Interfaces +@using Coinbase.Net.Interfaces +@using CryptoExchange.Net.Interfaces +@using CryptoCom.Net.Interfaces +@using CryptoExchange.Net.SharedApis +@using CryptoExchange.Net.Trackers.Trades +@using GateIo.Net.Interfaces +@using HTX.Net.Interfaces +@using Kraken.Net.Interfaces +@using Kucoin.Net.Clients +@using Kucoin.Net.Interfaces +@using Mexc.Net.Interfaces +@using OKX.Net.Interfaces; +@inject IBinanceTrackerFactory binanceFactory +@inject IBingXTrackerFactory bingXFactory +@inject IBitfinexTrackerFactory bitfinexFactory +@inject IBitgetTrackerFactory bitgetFactory +@inject IBitMartTrackerFactory bitmartFactory +@inject IBybitTrackerFactory bybitFactory +@inject ICoinbaseTrackerFactory coinbaseFactory +@inject ICoinExTrackerFactory coinExFactory +@inject ICryptoComTrackerFactory cryptocomFactory +@inject IGateIoTrackerFactory gateioFactory +@inject IHTXTrackerFactory htxFactory +@inject IKrakenTrackerFactory krakenFactory +@inject IKucoinTrackerFactory kucoinFactory +@inject IMexcTrackerFactory mexcFactory +@inject IOKXTrackerFactory okxFactory +@implements IDisposable + +ETH-BTC trade Trackers, live updates: + + @foreach (var tracker in _trackers.OrderBy(p => p.Exchange)) + { + + @tracker.Exchange + @foreach(var line in GetInfo(tracker)) + { + @line + } + + } + + +@code{ + private List _trackers = new List(); + private Timer _timer; + + protected override async Task OnInitializedAsync() + { + var symbol = new SharedSymbol(TradingMode.Spot, "BTC", "USDT"); + + _trackers = new List + { + { binanceFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { bingXFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { bitfinexFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { bitgetFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { bitmartFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { bybitFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { coinbaseFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { coinExFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { cryptocomFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { gateioFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { htxFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { krakenFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { kucoinFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { mexcFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + { okxFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) }, + }; + + await Task.WhenAll(_trackers.Select(b => b.StartAsync())); + + // Use a manual update timer so the page isn't refreshed too often + _timer = new Timer(500); + _timer.Start(); + _timer.Elapsed += (o, e) => InvokeAsync(StateHasChanged); + } + + private string[] GetInfo(ITradeTracker tracker) + { + var secondLastMinute = tracker.GetStats(DateTime.UtcNow.AddMinutes(-2), DateTime.UtcNow.AddMinutes(-1)); + var lastMinute = tracker.GetStats(DateTime.UtcNow.AddMinutes(-1)); + var compare = lastMinute.CompareTo(secondLastMinute); + + return [ + $"{tracker.SymbolName} | {tracker.Status} - Synced from {tracker.SyncedFrom}", + $"Total trades: {tracker.Count}", + $"Trades last minute: {lastMinute.TradeCount}, minute before: {secondLastMinute.TradeCount}", + $"Average weighted price: {lastMinute.VolumeWeightedAveragePrice}, minute before: {secondLastMinute.VolumeWeightedAveragePrice}, dif: {compare.VolumeWeightedAveragePriceDif.PercentageDifference}%" + ]; + } + + public void Dispose() + { + _timer.Stop(); + _timer.Dispose(); + foreach (var tracker in _trackers.Where(b => b.Status != CryptoExchange.Net.Objects.SyncStatus.Disconnected)) + // It's not necessary to wait for this + _ = tracker.StopAsync(); + } +} \ No newline at end of file diff --git a/Examples/BlazorClient/Shared/NavMenu.razor b/Examples/BlazorClient/Shared/NavMenu.razor index d691d6e..bb87e32 100644 --- a/Examples/BlazorClient/Shared/NavMenu.razor +++ b/Examples/BlazorClient/Shared/NavMenu.razor @@ -27,6 +27,11 @@ Order books + + + Trackers + + diff --git a/Examples/ConsoleClient/ConsoleClient.csproj b/Examples/ConsoleClient/ConsoleClient.csproj index 7aaa715..3576ea8 100644 --- a/Examples/ConsoleClient/ConsoleClient.csproj +++ b/Examples/ConsoleClient/ConsoleClient.csproj @@ -6,20 +6,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/Examples/SharedClients/SharedClients.csproj b/Examples/SharedClients/SharedClients.csproj index 555ee9a..a39d032 100644 --- a/Examples/SharedClients/SharedClients.csproj +++ b/Examples/SharedClients/SharedClients.csproj @@ -8,9 +8,9 @@ - - - + + +