diff --git a/CryptoClients.Net/CryptoClients.Net.csproj b/CryptoClients.Net/CryptoClients.Net.csproj
index 5b027bd..66f501f 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