From fee8e38686f94858ce388f800b3ea81218bdc7a1 Mon Sep 17 00:00:00 2001 From: JKorf Date: Sun, 27 Oct 2024 19:15:26 +0100 Subject: [PATCH 1/2] wip --- CryptoClients.Net/CryptoClients.Net.csproj | 32 ++-- CryptoClients.Net/CryptoClients.Net.xml | 160 ++++++++++++++++ CryptoClients.Net/ExchangeOrderBookFactory.cs | 86 ++------- CryptoClients.Net/ExchangeTrackerFactory.cs | 181 ++++++++++++++++++ .../ServiceCollectionExtensions.cs | 1 + .../Interfaces/IExchangeTrackerFactory.cs | 110 +++++++++++ 6 files changed, 488 insertions(+), 82 deletions(-) create mode 100644 CryptoClients.Net/ExchangeTrackerFactory.cs create mode 100644 CryptoClients.Net/Interfaces/IExchangeTrackerFactory.cs diff --git a/CryptoClients.Net/CryptoClients.Net.csproj b/CryptoClients.Net/CryptoClients.Net.csproj index 5b027bd..a1b7625 100644 --- a/CryptoClients.Net/CryptoClients.Net.csproj +++ b/CryptoClients.Net/CryptoClients.Net.csproj @@ -49,22 +49,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + CryptoClients.Net.xml diff --git a/CryptoClients.Net/CryptoClients.Net.xml b/CryptoClients.Net/CryptoClients.Net.xml index bb283a2..76fbec6 100644 --- a/CryptoClients.Net/CryptoClients.Net.xml +++ b/CryptoClients.Net/CryptoClients.Net.xml @@ -864,6 +864,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DI constructor + + + + + + + + Extension methods @@ -2388,6 +2447,107 @@ + + + Factory for creating tracker instances + + + + + Binance tracker factory + + + + + BingX tracker factory + + + + + Bitfinex tracker factory + + + + + Bitget tracker factory + + + + + BitMart tracker factory + + + + + Bybit tracker factory + + + + + Coinbase tracker factory + + + + + CoinEx tracker factory + + + + + Crypto.com tracker factory + + + + + Gate.io tracker factory + + + + + HTX tracker factory + + + + + Kraken tracker factory + + + + + Kucoin tracker factory + + + + + Mexc tracker factory + + + + + OKX tracker factory + + + + + Create a new kline tracker + + The exchange the tracker is for + Symbol the tracker is for + Interval of the klines + The max number of klines to be tracked, when the max is reached the oldest klines are removed to make room for newer klines + The max age of the klines to be tracked, any kline older than this period will be removed + Exchange specific paramters + + + + Create a new trade tracker + + The exchange the tracker is for + Symbol the tracker is for + The max number of trades to be tracked, when the max is reached the oldest trades are removed to make room for newer trades + The max age of the trades to be tracked, any trade older than this period will be removed + Exchange specific paramters + Credentials for each exchange diff --git a/CryptoClients.Net/ExchangeOrderBookFactory.cs b/CryptoClients.Net/ExchangeOrderBookFactory.cs index 121f355..76c00b4 100644 --- a/CryptoClients.Net/ExchangeOrderBookFactory.cs +++ b/CryptoClients.Net/ExchangeOrderBookFactory.cs @@ -1,37 +1,21 @@ -using Binance.Net.Clients; -using Binance.Net.Interfaces; -using BingX.Net.Clients; +using Binance.Net.Interfaces; using BingX.Net.Interfaces; -using Bitfinex.Net.Clients; using Bitfinex.Net.Interfaces; -using Bitget.Net.Clients; +using Bitget.Net.Enums; using Bitget.Net.Interfaces; -using BitMart.Net.Clients; using BitMart.Net.Interfaces; -using Bybit.Net.Clients; using Bybit.Net.Interfaces; -using Coinbase.Net.Clients; using Coinbase.Net.Interfaces; -using CoinEx.Net.Clients; using CoinEx.Net.Interfaces; -using CryptoClients.Net.Enums; using CryptoClients.Net.Interfaces; -using CryptoCom.Net.Clients; using CryptoCom.Net.Interfaces; -using CryptoExchange.Net; using CryptoExchange.Net.Interfaces; using CryptoExchange.Net.SharedApis; -using GateIo.Net.Clients; using GateIo.Net.Interfaces; -using HTX.Net.Clients; using HTX.Net.Interfaces; -using Kraken.Net.Clients; using Kraken.Net.Interfaces; -using Kucoin.Net.Clients; using Kucoin.Net.Interfaces; -using Mexc.Net.Clients; using Mexc.Net.Interfaces; -using OKX.Net.Clients; using OKX.Net.Interfaces; using System.Linq; @@ -111,84 +95,54 @@ public ExchangeOrderBookFactory( /// public ISymbolOrderBook? Create(string exchange, SharedSymbol symbol, int? minimalDepth = null, ExchangeParameters? exchangeParameters = null) { - // Might want to make this more generic, don't want to create a client just to format symbol switch (exchange) { case "Binance": - var binanceClient = new BinanceRestClient(); - var binanceLimit = GetBookDepth(minimalDepth, true, 5, 10, 20); - return symbol.TradingMode == TradingMode.Spot ? Binance.Spot.Create(symbol.GetSymbol(binanceClient.SpotApi.FormatSymbol), opts => { opts.Limit = binanceLimit; }) - : symbol.TradingMode.IsLinear() ? Binance.UsdFutures.Create(symbol.GetSymbol(binanceClient.UsdFuturesApi.FormatSymbol), opts => { opts.Limit = binanceLimit; }) - : Binance.CoinFutures.Create(symbol.GetSymbol(binanceClient.CoinFuturesApi.FormatSymbol), opts => { opts.Limit = binanceLimit; }); + var binanceLimit = GetBookDepth(minimalDepth, true, 5, 10, 20); + return Binance.Create(symbol, opts => { opts.Limit = binanceLimit; }); case "BingX": - var bingXClient = new BingXRestClient(); var bingXLimit = GetBookDepth(minimalDepth, false, 5, 10, 20, 50, 100); - return symbol.TradingMode == TradingMode.Spot ? BingX.Spot.Create(symbol.GetSymbol(bingXClient.SpotApi.FormatSymbol), opts => { opts.Limit = bingXLimit; }) - : BingX.PerpetualFutures.Create(symbol.GetSymbol(bingXClient.PerpetualFuturesApi.FormatSymbol), opts => { opts.Limit = bingXLimit; }); + return BingX.Create(symbol, opts => { opts.Limit = bingXLimit; }); case "Bitfinex": - var bitfinexClient = new BitfinexRestClient(); var bitfinexLimit = GetBookDepth(minimalDepth, false, 1, 25, 100, 250); - return Bitfinex.Spot.Create(symbol.GetSymbol(bitfinexClient.SpotApi.FormatSymbol), opts => { opts.Limit = bitfinexLimit; }); + return Bitfinex.Create(symbol, opts => { opts.Limit = bitfinexLimit; }); case "Bitget": - var bitgetClient = new BitgetRestClient(); var bitgetLimit = GetBookDepth(minimalDepth, true, 5, 15); - return symbol.TradingMode == TradingMode.Spot ? Bitget.Spot.Create(symbol.GetSymbol(bitgetClient.SpotApiV2.FormatSymbol), opts => { opts.Limit = bitgetLimit; }) - : symbol.TradingMode.IsInverse() ? Bitget.CoinFutures.Create(symbol.GetSymbol(bitgetClient.FuturesApiV2.FormatSymbol), opts => { opts.Limit = bitgetLimit; }) - : ExchangeParameters.GetValue(exchangeParameters, "Bitget", "ProductType") == "UsdtFutures" ? Bitget.UsdtFutures.Create(symbol.GetSymbol(bitgetClient.FuturesApiV2.FormatSymbol), opts => { opts.Limit = bitgetLimit; }) - : Bitget.UsdcFutures.Create(symbol.GetSymbol(bitgetClient.FuturesApiV2.FormatSymbol), opts => { opts.Limit = bitgetLimit; }); + var type = ExchangeParameters.GetValue(exchangeParameters, "Bitget", "ProductType") == "UsdtFutures" ? BitgetProductTypeV2.UsdtFutures : BitgetProductTypeV2.UsdcFutures; + return Bitget.Create(symbol, type, opts => { opts.Limit = bitgetLimit; }); case "BitMart": - var bitmartClient = new BitMartRestClient(); var bitmartLimit = GetBookDepth(minimalDepth, true, 5, 20, 50); - return symbol.TradingMode == TradingMode.Spot ? BitMart.Spot.Create(symbol.GetSymbol(bitmartClient.SpotApi.FormatSymbol), opts => { opts.Limit = bitmartLimit; }) - : BitMart.UsdFutures.Create(symbol.GetSymbol(bitmartClient.UsdFuturesApi.FormatSymbol), opts => { opts.Limit = bitmartLimit; }); + return BitMart.Create(symbol, opts => { opts.Limit = bitmartLimit; }); case "Bybit": - var bybitClient = new BybitRestClient(); var bybitLimit = GetBookDepth(minimalDepth, false, 1, 50, 200); - return symbol.TradingMode == TradingMode.Spot ? Bybit.Spot.Create(symbol.GetSymbol(bybitClient.V5Api.FormatSymbol), opts => { opts.Limit = bybitLimit; }) - : Bybit.LinearInverse.Create(symbol.GetSymbol(bybitClient.V5Api.FormatSymbol), opts => { opts.Limit = bybitLimit; }); + return Bybit.Create(symbol, opts => { opts.Limit = bybitLimit; }); case "Coinbase": - var coinbaseClient = new CoinbaseRestClient(); - return Coinbase.AdvancedTrade.Create(symbol.GetSymbol(coinbaseClient.AdvancedTradeApi.FormatSymbol)); + return Coinbase.Create(symbol); case "CoinEx": - var coinexClient = new CoinExRestClient(); var coinexLimit = GetBookDepth(minimalDepth, false, 5, 10, 20, 50); - return symbol.TradingMode == TradingMode.Spot ? CoinEx.Spot.Create(symbol.GetSymbol(coinexClient.SpotApiV2.FormatSymbol), opts => { opts.Limit = coinexLimit; }) - : CoinEx.Futures.Create(symbol.GetSymbol(coinexClient.FuturesApi.FormatSymbol), opts => { opts.Limit = coinexLimit; }); + return CoinEx.Create(symbol, opts => { opts.Limit = coinexLimit; }); case "CryptoCom": - var cryptoComClient = new CryptoComSocketClient(); var cryptoComLimit = GetBookDepth(minimalDepth, false, 10, 50); - return CryptoCom.Exchange.Create(symbol.GetSymbol(cryptoComClient.ExchangeApi.FormatSymbol), opts => { opts.Limit = cryptoComLimit; }); + return CryptoCom.Create(symbol, opts => { opts.Limit = cryptoComLimit; }); case "GateIo": - var gateClient = new GateIoRestClient(); var gateIoLimit = GetBookDepth(minimalDepth, true, 5, 10, 20, 50, 100); - return symbol.TradingMode == TradingMode.Spot ? GateIo.Spot.Create(symbol.GetSymbol(gateClient.SpotApi.FormatSymbol), opts => { opts.Limit = gateIoLimit; }) - : symbol.QuoteAsset == "USDT" ? GateIo.PerpetualFuturesUsdt.Create(symbol.GetSymbol(gateClient.PerpetualFuturesApi.FormatSymbol), opts => { opts.Limit = gateIoLimit; }) - : symbol.QuoteAsset == "USD" ? GateIo.PerpetualFuturesUsd.Create(symbol.GetSymbol(gateClient.PerpetualFuturesApi.FormatSymbol), opts => { opts.Limit = gateIoLimit; }) - : GateIo.PerpetualFuturesBtc.Create(symbol.GetSymbol(gateClient.PerpetualFuturesApi.FormatSymbol), opts => { opts.Limit = gateIoLimit; }); + return GateIo.Create(symbol, symbol.QuoteAsset, opts => { opts.Limit = gateIoLimit; }); case "HTX": - var htxClient = new HTXRestClient(); var htxLimit = GetBookDepth(minimalDepth, true, 5, 20, 150, 400); var htxUsdLimit = GetBookDepth(minimalDepth, true, 20, 150); - return symbol.TradingMode == TradingMode.Spot ? HTX.Spot.Create(symbol.GetSymbol(htxClient.SpotApi.FormatSymbol), opts => { opts.Levels = htxLimit; }) - : HTX.UsdtFutures.Create(symbol.GetSymbol(htxClient.UsdtFuturesApi.FormatSymbol), opts => { opts.Levels = htxUsdLimit; }); + return HTX.Create(symbol, opts => { opts.Levels = symbol.TradingMode == TradingMode.Spot ? htxLimit : htxUsdLimit; }); case "Kraken": - var krakenClient = new KrakenSocketClient(); var krakenLimit = GetBookDepth(minimalDepth, false, 10, 25, 100, 500, 1000); - return symbol.TradingMode == TradingMode.Spot ? Kraken.Spot.Create(symbol.GetSymbol(krakenClient.SpotApi.FormatSymbol), opts => { opts.Limit = krakenLimit; }) - : Kraken.Futures.Create(symbol.GetSymbol(krakenClient.FuturesApi.FormatSymbol)); + return Kraken.Create(symbol, opts => { opts.Limit = krakenLimit; }); case "Kucoin": - var kucoinClient = new KucoinRestClient(); var kucoinLimit = GetBookDepth(minimalDepth, true, 5, 50); - return symbol.TradingMode == TradingMode.Spot ? Kucoin.Spot.Create(symbol.GetSymbol(kucoinClient.SpotApi.FormatSymbol), opts => { opts.Limit = kucoinLimit; }) - : Kucoin.Futures.Create(symbol.GetSymbol(kucoinClient.FuturesApi.FormatSymbol), opts => { opts.Limit = kucoinLimit; }); + return Kucoin.Create(symbol, opts => { opts.Limit = kucoinLimit; }); case "Mexc": - var mexcClient = new MexcRestClient(); var mexcLimit = GetBookDepth(minimalDepth, true, 5, 10, 20); - return Mexc.Spot.Create(symbol.GetSymbol(mexcClient.SpotApi.FormatSymbol), opts => { opts.Limit = mexcLimit; }); + return Mexc.Create(symbol, opts => { opts.Limit = mexcLimit; }); case "OKX": - var okxClient = new OKXRestClient(); - var okxLimit = GetBookDepth(minimalDepth, true, 1, 5, 50, 400); - return OKX.Unified.Create(symbol.GetSymbol(okxClient.UnifiedApi.FormatSymbol)); // Apply limit when order book implementation supports it + var okxLimit = GetBookDepth(minimalDepth, true, 1, 5, 400); + return OKX.Create(symbol, opts => { opts.Limit = okxLimit; }); } return null; diff --git a/CryptoClients.Net/ExchangeTrackerFactory.cs b/CryptoClients.Net/ExchangeTrackerFactory.cs new file mode 100644 index 0000000..827b1a3 --- /dev/null +++ b/CryptoClients.Net/ExchangeTrackerFactory.cs @@ -0,0 +1,181 @@ +using Binance.Net.Interfaces; +using BingX.Net.Interfaces; +using Bitfinex.Net.Interfaces; +using Bitget.Net.Enums; +using Bitget.Net.Interfaces; +using BitMart.Net.Interfaces; +using Bybit.Net.Interfaces; +using Coinbase.Net.Interfaces; +using CoinEx.Net.Interfaces; +using CryptoClients.Net.Interfaces; +using CryptoCom.Net.Interfaces; +using CryptoExchange.Net.Interfaces; +using CryptoExchange.Net.SharedApis; +using CryptoExchange.Net.Trackers.Klines; +using CryptoExchange.Net.Trackers.Trades; +using GateIo.Net.Interfaces; +using HTX.Net.Interfaces; +using Kraken.Net.Interfaces; +using Kucoin.Net.Interfaces; +using Mexc.Net.Interfaces; +using OKX.Net.Interfaces; +using System; +using System.Linq; + +namespace CryptoClients.Net +{ + /// + public class ExchangeTrackerFactory : IExchangeTrackerFactory + { + /// + public IBinanceTrackerFactory Binance { get; } + /// + public IBingXTrackerFactory BingX { get; } + /// + public IBitfinexTrackerFactory Bitfinex { get; } + /// + public IBitgetTrackerFactory Bitget { get; } + /// + public IBitMartTrackerFactory BitMart { get; } + /// + public IBybitTrackerFactory Bybit { get; } + /// + public ICoinbaseTrackerFactory Coinbase { get; } + /// + public ICoinExTrackerFactory CoinEx { get; } + /// + public ICryptoComTrackerFactory CryptoCom { get; } + /// + public IGateIoTrackerFactory GateIo { get; } + /// + public IHTXTrackerFactory HTX { get; } + /// + public IKrakenTrackerFactory Kraken { get; } + /// + public IKucoinTrackerFactory Kucoin { get; } + /// + public IMexcTrackerFactory Mexc { get; } + /// + public IOKXTrackerFactory OKX { get; } + + /// + /// DI constructor + /// + public ExchangeTrackerFactory( + IBinanceTrackerFactory binance, + IBingXTrackerFactory bingx, + IBitfinexTrackerFactory bitfinex, + IBitgetTrackerFactory bitget, + IBitMartTrackerFactory bitMart, + IBybitTrackerFactory bybit, + ICoinbaseTrackerFactory coinbase, + ICoinExTrackerFactory coinEx, + ICryptoComTrackerFactory cryptoCom, + IGateIoTrackerFactory gateIo, + IHTXTrackerFactory htx, + IKrakenTrackerFactory kraken, + IKucoinTrackerFactory kucoin, + IMexcTrackerFactory mexc, + IOKXTrackerFactory okx) + { + Binance = binance; + BingX = bingx; + Bitfinex = bitfinex; + Bitget = bitget; + BitMart = bitMart; + Bybit = bybit; + Coinbase = coinbase; + CoinEx = coinEx; + CryptoCom = cryptoCom; + GateIo = gateIo; + HTX = htx; + Kraken = kraken; + Kucoin = kucoin; + Mexc = mexc; + OKX = okx; + } + + /// + public IKlineTracker? CreateKlineTracker(string exchange, SharedSymbol symbol, SharedKlineInterval interval, int? limit = null, TimeSpan? period = null, ExchangeParameters? exchangeParameters = null) + { + switch (exchange) + { + case "Binance": + return Binance.CreateKlineTracker(symbol, interval, limit, period); + case "BingX": + return BingX.CreateKlineTracker(symbol, interval, limit, period); + case "Bitfinex": + return Bitfinex.CreateKlineTracker(symbol, interval, limit, period); + case "Bitget": + var type = ExchangeParameters.GetValue(exchangeParameters, "Bitget", "ProductType") == "UsdtFutures" ? BitgetProductTypeV2.UsdtFutures : BitgetProductTypeV2.UsdcFutures; + return Bitget.CreateKlineTracker(symbol, interval, limit, period); + case "BitMart": + return BitMart.CreateKlineTracker(symbol, interval, limit, period); + case "Bybit": + return Bybit.CreateKlineTracker(symbol, interval, limit, period); + case "Coinbase": + return Coinbase.CreateKlineTracker(symbol, interval, limit, period); + case "CoinEx": + // No tracker available because there is no websocket kline stream + return null; + case "CryptoCom": + return CryptoCom.CreateKlineTracker(symbol, interval, limit, period); + case "GateIo": + return GateIo.CreateKlineTracker(symbol, interval, limit, period); + case "HTX": + return HTX.CreateKlineTracker(symbol, interval, limit, period); + case "Kraken": + return Kraken.CreateKlineTracker(symbol, interval, limit, period); + case "Kucoin": + return Kucoin.CreateKlineTracker(symbol, interval, limit, period); + case "Mexc": + return Mexc.CreateKlineTracker(symbol, interval, limit, period); + case "OKX": + return OKX.CreateKlineTracker(symbol, interval, limit, period); + } + + return null; + } + + /// + public ITradeTracker? CreateTradeTracker(string exchange, SharedSymbol symbol, int? limit = null, TimeSpan? period = null, ExchangeParameters? exchangeParameters = null) + { + switch (exchange) + { + case "Binance": + return Binance.CreateTradeTracker(symbol, limit, period); + case "BingX": + return BingX.CreateTradeTracker(symbol, limit, period); + case "Bitfinex": + return Bitfinex.CreateTradeTracker(symbol, limit, period); + case "Bitget": + var type = ExchangeParameters.GetValue(exchangeParameters, "Bitget", "ProductType") == "UsdtFutures" ? BitgetProductTypeV2.UsdtFutures : BitgetProductTypeV2.UsdcFutures; + return Bitget.CreateTradeTracker(symbol, limit, period); + case "BitMart": + return BitMart.CreateTradeTracker(symbol, limit, period); + case "Bybit": + return Bybit.CreateTradeTracker(symbol, limit, period); + case "Coinbase": + return Coinbase.CreateTradeTracker(symbol, limit, period); + case "CoinEx": + return CoinEx.CreateTradeTracker(symbol, limit, period); + case "CryptoCom": + return CryptoCom.CreateTradeTracker(symbol, limit, period); + case "GateIo": + return GateIo.CreateTradeTracker(symbol, limit, period); + case "HTX": + return HTX.CreateTradeTracker(symbol, limit, period); + case "Kraken": + return Kraken.CreateTradeTracker(symbol, limit, period); + case "Kucoin": + return Kucoin.CreateTradeTracker(symbol, limit, period); + case "Mexc": + return Mexc.CreateTradeTracker(symbol, limit, period); + case "OKX": + return OKX.CreateTradeTracker(symbol, limit, period); + } + + return null; + } + } +} diff --git a/CryptoClients.Net/ExtensionMethods/ServiceCollectionExtensions.cs b/CryptoClients.Net/ExtensionMethods/ServiceCollectionExtensions.cs index 8fae7de..649e454 100644 --- a/CryptoClients.Net/ExtensionMethods/ServiceCollectionExtensions.cs +++ b/CryptoClients.Net/ExtensionMethods/ServiceCollectionExtensions.cs @@ -254,6 +254,7 @@ Action SetGlobalSocketOptions(GlobalExchangeOp }, socketClientLifetime ?? ServiceLifetime.Singleton)); services.AddTransient(); + services.AddTransient(); return services; } } diff --git a/CryptoClients.Net/Interfaces/IExchangeTrackerFactory.cs b/CryptoClients.Net/Interfaces/IExchangeTrackerFactory.cs new file mode 100644 index 0000000..4863af0 --- /dev/null +++ b/CryptoClients.Net/Interfaces/IExchangeTrackerFactory.cs @@ -0,0 +1,110 @@ +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 Coinbase.Net.Interfaces; +using CoinEx.Net.Interfaces; +using CryptoCom.Net.Interfaces; +using CryptoExchange.Net.SharedApis; +using CryptoExchange.Net.Trackers.Klines; +using CryptoExchange.Net.Trackers.Trades; +using GateIo.Net.Interfaces; +using HTX.Net.Interfaces; +using Kraken.Net.Interfaces; +using Kucoin.Net.Interfaces; +using Mexc.Net.Interfaces; +using OKX.Net.Interfaces; +using System; + +namespace CryptoClients.Net.Interfaces +{ + /// + /// Factory for creating tracker instances + /// + public interface IExchangeTrackerFactory + { + /// + /// Binance tracker factory + /// + IBinanceTrackerFactory Binance { get; } + /// + /// BingX tracker factory + /// + IBingXTrackerFactory BingX { get; } + /// + /// Bitfinex tracker factory + /// + IBitfinexTrackerFactory Bitfinex { get; } + /// + /// Bitget tracker factory + /// + IBitgetTrackerFactory Bitget { get; } + /// + /// BitMart tracker factory + /// + IBitMartTrackerFactory BitMart { get; } + /// + /// Bybit tracker factory + /// + IBybitTrackerFactory Bybit { get; } + /// + /// Coinbase tracker factory + /// + ICoinbaseTrackerFactory Coinbase { get; } + /// + /// CoinEx tracker factory + /// + ICoinExTrackerFactory CoinEx { get; } + /// + /// Crypto.com tracker factory + /// + ICryptoComTrackerFactory CryptoCom { get; } + /// + /// Gate.io tracker factory + /// + IGateIoTrackerFactory GateIo { get; } + /// + /// HTX tracker factory + /// + IHTXTrackerFactory HTX { get; } + /// + /// Kraken tracker factory + /// + IKrakenTrackerFactory Kraken { get; } + /// + /// Kucoin tracker factory + /// + IKucoinTrackerFactory Kucoin { get; } + /// + /// Mexc tracker factory + /// + IMexcTrackerFactory Mexc { get; } + /// + /// OKX tracker factory + /// + IOKXTrackerFactory OKX { get; } + + /// + /// Create a new kline tracker + /// + /// The exchange the tracker is for + /// Symbol the tracker is for + /// Interval of the klines + /// The max number of klines to be tracked, when the max is reached the oldest klines are removed to make room for newer klines + /// The max age of the klines to be tracked, any kline older than this period will be removed + /// Exchange specific paramters + IKlineTracker? CreateKlineTracker(string exchange, SharedSymbol symbol, SharedKlineInterval interval, int? limit = null, TimeSpan? period = null, ExchangeParameters? exchangeParameters = null); + + /// + /// Create a new trade tracker + /// + /// The exchange the tracker is for + /// Symbol the tracker is for + /// The max number of trades to be tracked, when the max is reached the oldest trades are removed to make room for newer trades + /// The max age of the trades to be tracked, any trade older than this period will be removed + /// Exchange specific paramters + ITradeTracker? CreateTradeTracker(string exchange, SharedSymbol symbol, int? limit = null, TimeSpan? period = null, ExchangeParameters? exchangeParameters = null); + } +} \ No newline at end of file From 851b49736f55572552fe7473fb1d863910f0f7ca Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 28 Oct 2024 15:01:10 +0100 Subject: [PATCH 2/2] Updated package versions --- CryptoClients.Net/CryptoClients.Net.csproj | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/CryptoClients.Net/CryptoClients.Net.csproj b/CryptoClients.Net/CryptoClients.Net.csproj index a1b7625..66f501f 100644 --- a/CryptoClients.Net/CryptoClients.Net.csproj +++ b/CryptoClients.Net/CryptoClients.Net.csproj @@ -49,22 +49,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + CryptoClients.Net.xml