1
0
mirror of https://github.com/JKorf/CryptoExchange.Net.git synced 2026-08-11 16:32:57 +00:00

Compare commits

..

16 Commits

Author SHA1 Message Date
Jkorf 0e55e5f065 Updated to version 9.13.0 2025-11-10 13:15:48 +01:00
Jkorf b1c5cf318a Cleanup 2025-11-10 13:12:16 +01:00
Jkorf 9d94a24862 Added IExchangeService interface 2025-11-10 09:15:29 +01:00
Jkorf 6cf9684f55 Added SharedTickerType for defining time used for ticker calculations by the API 2025-11-10 09:15:20 +01:00
Jkorf 8043a48c49 Fixed incorrect exchange name in static logger when using multiple libraries 2025-11-10 09:14:14 +01:00
Jkorf 7d657dd533 Updated examples 2025-11-03 15:29:19 +01:00
Jkorf 1bfdec1484 Added SharedSymbolModel base class to SharedFuturesKline, SharedKline, SharedTrade models 2025-11-03 11:25:10 +01:00
Jkorf 8d5b6a53f3 Updated to version 9.12.0 2025-11-03 10:39:05 +01:00
Jkorf ad97102e7c Updated CryptoExchange.Net version 2025-11-03 10:38:53 +01:00
Jkorf d8dc121386 Updated to version 9.12.0 2025-11-03 09:48:29 +01:00
Jkorf 10c3868c00 Revert "Updated to version 9.11.0"
This reverts commit 411ba00a82.
2025-11-03 09:46:55 +01:00
Jkorf 411ba00a82 Updated to version 9.11.0 2025-11-03 09:45:41 +01:00
JKorf c1b2b62dbc Added AliasType to specify only one way conversion for AssetAliases 2025-11-02 15:17:44 +01:00
JKorf 3960cab7a7 Merge branch 'master' of https://github.com/JKorf/CryptoExchange.Net 2025-11-02 11:41:30 +01:00
JKorf 34e9447e55 Added constant for selecting a USD asset for use in a Shared API/SharedSymbol 2025-11-02 11:41:26 +01:00
Jkorf 9d3295acc7 Removed some unhelpful verbose logs 2025-10-31 15:08:14 +01:00
31 changed files with 308 additions and 114 deletions
@@ -6,9 +6,9 @@
<PackageId>CryptoExchange.Net.Protobuf</PackageId>
<Authors>JKorf</Authors>
<Description>Protobuf support for CryptoExchange.Net</Description>
<PackageVersion>9.11.1</PackageVersion>
<AssemblyVersion>9.11.1</AssemblyVersion>
<FileVersion>9.11.1</FileVersion>
<PackageVersion>9.12.0</PackageVersion>
<AssemblyVersion>9.12.0</AssemblyVersion>
<FileVersion>9.12.0</FileVersion>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageTags>CryptoExchange;CryptoExchange.Net</PackageTags>
<RepositoryType>git</RepositoryType>
@@ -41,7 +41,7 @@
<DocumentationFile>CryptoExchange.Net.Protobuf.xml</DocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CryptoExchange.Net" Version="9.11.0" />
<PackageReference Include="CryptoExchange.Net" Version="9.12.0" />
<PackageReference Include="protobuf-net" Version="3.2.56" />
</ItemGroup>
</Project>
+3
View File
@@ -5,6 +5,9 @@
Protobuf support for CryptoExchange.Net.
## Release notes
* Version 9.12.0 - 03 Nov 2025
* Updated CryptoExchange.Net version to 9.12.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
* Version 9.11.1 - 30 Oct 2025
* Updated CryptoExchange.Net version to 9.11.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
-2
View File
@@ -102,7 +102,6 @@ namespace CryptoExchange.Net.Clients
if (ClientOptions == null)
throw new InvalidOperationException("Client should have called Initialize before adding API clients");
_logger.Log(LogLevel.Trace, $" {apiClient.GetType().Name}, base address: {apiClient.BaseAddress}");
ApiClients.Add(apiClient);
return apiClient;
}
@@ -122,7 +121,6 @@ namespace CryptoExchange.Net.Clients
/// </summary>
public virtual void Dispose()
{
_logger.Log(LogLevel.Debug, "Disposing client");
foreach (var client in ApiClients)
client.Dispose();
}
+1 -1
View File
@@ -22,7 +22,7 @@ namespace CryptoExchange.Net.Clients
{
_logger = loggerFactory?.CreateLogger(name + ".RestClient") ?? NullLoggerFactory.Instance.CreateLogger(name);
LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger(name);
LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger("CryptoExchange");
}
}
}
@@ -41,7 +41,7 @@ namespace CryptoExchange.Net.Clients
{
_logger = loggerFactory?.CreateLogger(name + ".SocketClient") ?? NullLoggerFactory.Instance.CreateLogger(name);
LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger(name);
LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger("CryptoExchange");
}
/// <summary>
@@ -106,7 +106,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
if (isEmptyString && !_unknownValuesWarned.Contains(null))
{
// We received an empty string and have no mapping for it, and the property isn't nullable
LibraryHelpers.StaticLogger?.LogWarning($"Received null or empty enum value, but property type is not a nullable enum. EnumType: {typeof(T).Name}. If you think {typeof(T).Name} should be nullable please open an issue on the Github repo");
LibraryHelpers.StaticLogger?.LogWarning($"Received null or empty enum value, but property type is not a nullable enum. EnumType: {typeof(T).FullName}. If you think {typeof(T).FullName} should be nullable please open an issue on the Github repo");
}
return new T(); // return default value
@@ -149,7 +149,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
if (!_unknownValuesWarned.Contains(stringValue))
{
_unknownValuesWarned.Add(stringValue!);
LibraryHelpers.StaticLogger?.LogWarning($"Cannot map enum value. EnumType: {enumType.Name}, Value: {stringValue}, Known values: {string.Join(", ", _mapping.Select(m => m.Value))}. If you think {stringValue} should added please open an issue on the Github repo");
LibraryHelpers.StaticLogger?.LogWarning($"Cannot map enum value. EnumType: {enumType.FullName}, Value: {stringValue}, Known values: {string.Join(", ", _mapping.Select(m => m.Value))}. If you think {stringValue} should added please open an issue on the Github repo");
}
}
+3 -3
View File
@@ -6,9 +6,9 @@
<PackageId>CryptoExchange.Net</PackageId>
<Authors>JKorf</Authors>
<Description>CryptoExchange.Net is a base library which is used to implement different cryptocurrency (exchange) API's. It provides a standardized way of implementing different API's, which results in a very similar experience for users of the API implementations.</Description>
<PackageVersion>9.11.0</PackageVersion>
<AssemblyVersion>9.11.0</AssemblyVersion>
<FileVersion>9.11.0</FileVersion>
<PackageVersion>9.13.0</PackageVersion>
<AssemblyVersion>9.13.0</AssemblyVersion>
<FileVersion>9.13.0</FileVersion>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageTags>OKX;OKX.Net;Mexc;Mexc.Net;Kucoin;Kucoin.Net;Kraken;Kraken.Net;Huobi;Huobi.Net;CoinEx;CoinEx.Net;Bybit;Bybit.Net;Bitget;Bitget.Net;Bitfinex;Bitfinex.Net;Binance;Binance.Net;CryptoCurrency;CryptoCurrency Exchange;CryptoExchange.Net</PackageTags>
<RepositoryType>git</RepositoryType>
@@ -0,0 +1,13 @@
namespace CryptoExchange.Net.Interfaces
{
/// <summary>
/// Service for an exchange
/// </summary>
public interface IExchangeService
{
/// <summary>
/// The exchange the service is for
/// </summary>
public string ExchangeName { get; }
}
}
@@ -13,7 +13,6 @@ namespace CryptoExchange.Net.Logging.Extensions
private static readonly Action<ILogger, int, Exception?> _unknownExceptionWhileProcessingReconnection;
private static readonly Action<ILogger, int, WebSocketError, string?, Exception?> _webSocketErrorCodeAndDetails;
private static readonly Action<ILogger, int, string?, Exception?> _webSocketError;
private static readonly Action<ILogger, int, int, Exception?> _messageSentNotPending;
private static readonly Action<ILogger, int, string, Exception?> _receivedData;
private static readonly Action<ILogger, int, string, Exception?> _failedToParse;
private static readonly Action<ILogger, int, string, Exception?> _failedToEvaluateMessage;
@@ -72,11 +71,6 @@ namespace CryptoExchange.Net.Logging.Extensions
new EventId(2005, "WebSocketError"),
"[Sckt {SocketId}] error: {ErrorMessage}");
_messageSentNotPending = LoggerMessage.Define<int, int>(
LogLevel.Debug,
new EventId(2006, "MessageSentNotPending"),
"[Sckt {SocketId}] [Req {RequestId}] message sent, but not pending");
_receivedData = LoggerMessage.Define<int, string>(
LogLevel.Trace,
new EventId(2007, "ReceivedData"),
@@ -234,11 +228,6 @@ namespace CryptoExchange.Net.Logging.Extensions
_webSocketError(logger, socketId, errorMessage, e);
}
public static void MessageSentNotPending(this ILogger logger, int socketId, int requestId)
{
_messageSentNotPending(logger, socketId, requestId, null);
}
public static void ReceivedData(this ILogger logger, int socketId, string originalData)
{
_receivedData(logger, socketId, originalData, null);
+21 -1
View File
@@ -9,6 +9,10 @@ namespace CryptoExchange.Net.Objects
/// </summary>
public class AssetAlias
{
/// <summary>
/// Alias type
/// </summary>
public AliasType Type { get; set; }
/// <summary>
/// The name of the asset on the exchange
/// </summary>
@@ -21,10 +25,26 @@ namespace CryptoExchange.Net.Objects
/// <summary>
/// ctor
/// </summary>
public AssetAlias(string exchangeName, string commonName)
public AssetAlias(string exchangeName, string commonName, AliasType type = AliasType.BothWays)
{
ExchangeAssetName = exchangeName;
CommonAssetName = commonName;
Type = type;
}
}
/// <summary>
/// Alias type
/// </summary>
public enum AliasType
{
/// <summary>
/// Translate both from and to exchange
/// </summary>
BothWays,
/// <summary>
/// Only translate when converting to exchange
/// </summary>
OnlyToExchange
}
}
@@ -23,12 +23,22 @@ namespace CryptoExchange.Net.Objects
/// <summary>
/// Map the common name to an exchange name for an asset. If there is no alias the input name is returned
/// </summary>
public string CommonToExchangeName(string commonName) => !AutoConvertEnabled ? commonName : Aliases.SingleOrDefault(x => x.CommonAssetName == commonName)?.ExchangeAssetName ?? commonName;
public string CommonToExchangeName(string commonName) => !AutoConvertEnabled ? commonName : Aliases.FirstOrDefault(x => x.CommonAssetName == commonName)?.ExchangeAssetName ?? commonName;
/// <summary>
/// Map the exchange name to a common name for an asset. If there is no alias the input name is returned
/// </summary>
public string ExchangeToCommonName(string exchangeName) => !AutoConvertEnabled ? exchangeName : Aliases.SingleOrDefault(x => x.ExchangeAssetName == exchangeName)?.CommonAssetName ?? exchangeName;
public string ExchangeToCommonName(string exchangeName)
{
if (!AutoConvertEnabled)
return exchangeName;
var alias = Aliases.FirstOrDefault(x => x.ExchangeAssetName == exchangeName);
if (alias == null || alias.Type == AliasType.OnlyToExchange)
return exchangeName;
return alias.CommonAssetName;
}
}
}
@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace CryptoExchange.Net.SharedApis
{
/// <summary>
/// Type of ticker
/// </summary>
public enum SharedTickerType
{
/// <summary>
/// The ticker data is calculated based on the last 24 hours
/// </summary>
Day24H,
/// <summary>
/// The ticker data is calculated based on the start of the day at 00:00 on UTC+0
/// </summary>
DayUtc0,
/// <summary>
/// Ticker data is calculated in a different way or not consistent
/// </summary>
Other
}
}
@@ -12,7 +12,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Futures get ticker request options
/// </summary>
EndpointOptions<GetTickerRequest> GetFuturesTickerOptions { get; }
GetTickerOptions GetFuturesTickerOptions { get; }
/// <summary>
/// Get ticker info for a specific futures symbol
/// </summary>
@@ -23,7 +23,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Futures get tickers request options
/// </summary>
EndpointOptions<GetTickersRequest> GetFuturesTickersOptions { get; }
GetTickersOptions GetFuturesTickersOptions { get; }
/// <summary>
/// Get ticker info for all futures symbols
/// </summary>
@@ -12,7 +12,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Spot ticker request options
/// </summary>
EndpointOptions<GetTickerRequest> GetSpotTickerOptions { get; }
GetTickerOptions GetSpotTickerOptions { get; }
/// <summary>
/// Get ticker for a specific spot symbol
/// </summary>
@@ -22,7 +22,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Spot tickers request options
/// </summary>
EndpointOptions<GetTickersRequest> GetSpotTickersOptions { get; }
GetTickersOptions GetSpotTickersOptions { get; }
/// <summary>
/// Get tickers for all spot symbols
/// </summary>
@@ -13,7 +13,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Ticker subscription options
/// </summary>
EndpointOptions<SubscribeTickerRequest> SubscribeTickerOptions { get; }
SubscribeTickerOptions SubscribeTickerOptions { get; }
/// <summary>
/// Subscribe to ticker updates for a symbol
@@ -14,7 +14,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Tickers subscription options
/// </summary>
EndpointOptions<SubscribeAllTickersRequest> SubscribeAllTickersOptions { get; }
SubscribeTickersOptions SubscribeAllTickersOptions { get; }
/// <summary>
/// Subscribe to tickers updates for all symbols
@@ -0,0 +1,35 @@
using CryptoExchange.Net.Objects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CryptoExchange.Net.SharedApis
{
/// <summary>
/// Options for requesting ticker
/// </summary>
public class GetTickerOptions : EndpointOptions<GetTickerRequest>
{
/// <summary>
/// Type of ticker calculation
/// </summary>
public SharedTickerType TickerType { get; set; } = SharedTickerType.Day24H;
/// <summary>
/// ctor
/// </summary>
public GetTickerOptions(SharedTickerType? tickerCalcType = null) : base(false)
{
TickerType = tickerCalcType ?? SharedTickerType.Day24H;
}
/// <inheritdoc />
public override string ToString(string exchange)
{
var sb = new StringBuilder(base.ToString(exchange));
sb.AppendLine($"Ticker time calc type: {TickerType}");
return sb.ToString();
}
}
}
@@ -0,0 +1,35 @@
using CryptoExchange.Net.Objects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CryptoExchange.Net.SharedApis
{
/// <summary>
/// Options for requesting tickers
/// </summary>
public class GetTickersOptions : EndpointOptions<GetTickersRequest>
{
/// <summary>
/// Type of ticker calculation
/// </summary>
public SharedTickerType TickerType { get; set; } = SharedTickerType.Day24H;
/// <summary>
/// ctor
/// </summary>
public GetTickersOptions(SharedTickerType? tickerCalcType = null) : base(false)
{
TickerType = tickerCalcType ?? SharedTickerType.Day24H;
}
/// <inheritdoc />
public override string ToString(string exchange)
{
var sb = new StringBuilder(base.ToString(exchange));
sb.AppendLine($"Ticker time calc type: {TickerType}");
return sb.ToString();
}
}
}
@@ -0,0 +1,26 @@
using CryptoExchange.Net.Objects;
using System;
using System.Collections.Generic;
using System.Linq;
namespace CryptoExchange.Net.SharedApis
{
/// <summary>
/// Options for subscribing to ticker updates
/// </summary>
public class SubscribeTickerOptions : EndpointOptions<SubscribeTickerRequest>
{
/// <summary>
/// Type of ticker calculation
/// </summary>
public SharedTickerType TickerType { get; set; }
/// <summary>
/// ctor
/// </summary>
public SubscribeTickerOptions(SharedTickerType? tickerCalcType = null) : base(false)
{
TickerType = tickerCalcType ?? SharedTickerType.Day24H;
}
}
}
@@ -0,0 +1,26 @@
using CryptoExchange.Net.Objects;
using System;
using System.Collections.Generic;
using System.Linq;
namespace CryptoExchange.Net.SharedApis
{
/// <summary>
/// Options for subscribing to ticker updates
/// </summary>
public class SubscribeTickersOptions : EndpointOptions<SubscribeAllTickersRequest>
{
/// <summary>
/// Type of ticker calculation
/// </summary>
public SharedTickerType TickerType { get; set; }
/// <summary>
/// ctor
/// </summary>
public SubscribeTickersOptions(SharedTickerType? tickerCalcType = null) : base(false)
{
TickerType = tickerCalcType ?? SharedTickerType.Day24H;
}
}
}
@@ -5,7 +5,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Mark/index price kline
/// </summary>
public record SharedFuturesKline
public record SharedFuturesKline : SharedSymbolModel
{
/// <summary>
/// Open time
@@ -31,7 +31,8 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// ctor
/// </summary>
public SharedFuturesKline(DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice)
public SharedFuturesKline(SharedSymbol? sharedSymbol, string symbol, DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice)
: base(sharedSymbol, symbol)
{
OpenTime = openTime;
ClosePrice = closePrice;
@@ -5,7 +5,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Kline info
/// </summary>
public record SharedKline
public record SharedKline : SharedSymbolModel
{
/// <summary>
/// Open time
@@ -35,7 +35,8 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// ctor
/// </summary>
public SharedKline(DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice, decimal volume)
public SharedKline(SharedSymbol? sharedSymbol, string symbol, DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice, decimal volume)
: base(sharedSymbol, symbol)
{
OpenTime = openTime;
ClosePrice = closePrice;
@@ -5,7 +5,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// Public trade info
/// </summary>
public record SharedTrade
public record SharedTrade : SharedSymbolModel
{
/// <summary>
/// Quantity of the trade
@@ -27,7 +27,7 @@ namespace CryptoExchange.Net.SharedApis
/// <summary>
/// ctor
/// </summary>
public SharedTrade(decimal quantity, decimal price, DateTime timestamp)
public SharedTrade(SharedSymbol? sharedSymbol, string symbol, decimal quantity, decimal price, DateTime timestamp) : base(sharedSymbol, symbol)
{
Quantity = quantity;
Price = price;
@@ -33,6 +33,11 @@ namespace CryptoExchange.Net.SharedApis
/// </summary>
public DateTime? DeliverTime { get; set; }
/// <summary>
/// Use this constant to dynamically select a USD or USD equivalent asset (stable coin) supported on the exchange
/// </summary>
public const string UsdOrStable = "CE-UsdStable";
/// <summary>
/// Create a new SharedSymbol
/// </summary>
@@ -449,10 +449,7 @@ namespace CryptoExchange.Net.Sockets
}
if (query == null)
{
_logger.MessageSentNotPending(SocketId, requestId);
return Task.CompletedTask;
}
return Task.CompletedTask;
query.IsSend(query.RequestTimeout ?? ApiClient.ClientOptions.RequestTimeout);
return Task.CompletedTask;
+25 -25
View File
@@ -5,32 +5,32 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Binance.Net" Version="11.9.0" />
<PackageReference Include="Bitfinex.Net" Version="9.9.0" />
<PackageReference Include="BitMart.Net" Version="2.10.0" />
<PackageReference Include="BloFin.Net" Version="1.2.0" />
<PackageReference Include="Bybit.Net" Version="5.10.1" />
<PackageReference Include="CoinEx.Net" Version="9.9.0" />
<PackageReference Include="CoinW.Net" Version="1.6.0" />
<PackageReference Include="CryptoCom.Net" Version="2.10.0" />
<PackageReference Include="DeepCoin.Net" Version="2.9.0" />
<PackageReference Include="GateIo.Net" Version="2.11.0" />
<PackageReference Include="HyperLiquid.Net" Version="2.14.0" />
<PackageReference Include="JK.BingX.Net" Version="2.9.0" />
<PackageReference Include="JK.Bitget.Net" Version="2.9.0" />
<PackageReference Include="JK.Mexc.Net" Version="3.10.0" />
<PackageReference Include="JK.OKX.Net" Version="3.9.0" />
<PackageReference Include="Jkorf.Aster.Net" Version="1.1.0" />
<PackageReference Include="JKorf.BitMEX.Net" Version="2.9.0" />
<PackageReference Include="JKorf.Coinbase.Net" Version="2.9.0" />
<PackageReference Include="JKorf.HTX.Net" Version="7.9.0" />
<PackageReference Include="JKorf.Upbit.Net" Version="1.0.0" />
<PackageReference Include="KrakenExchange.Net" Version="6.9.0" />
<PackageReference Include="Kucoin.Net" Version="7.9.0" />
<PackageReference Include="Binance.Net" Version="11.10.0" />
<PackageReference Include="Bitfinex.Net" Version="9.10.0" />
<PackageReference Include="BitMart.Net" Version="2.11.0" />
<PackageReference Include="BloFin.Net" Version="1.3.0" />
<PackageReference Include="Bybit.Net" Version="5.12.0" />
<PackageReference Include="CoinEx.Net" Version="9.10.0" />
<PackageReference Include="CoinW.Net" Version="1.7.0" />
<PackageReference Include="CryptoCom.Net" Version="2.11.0" />
<PackageReference Include="DeepCoin.Net" Version="2.10.0" />
<PackageReference Include="GateIo.Net" Version="2.12.0" />
<PackageReference Include="HyperLiquid.Net" Version="2.16.0" />
<PackageReference Include="JK.BingX.Net" Version="2.10.0" />
<PackageReference Include="JK.Bitget.Net" Version="2.11.0" />
<PackageReference Include="JK.Mexc.Net" Version="3.11.0" />
<PackageReference Include="JK.OKX.Net" Version="3.10.0" />
<PackageReference Include="Jkorf.Aster.Net" Version="1.2.0" />
<PackageReference Include="JKorf.BitMEX.Net" Version="2.10.0" />
<PackageReference Include="JKorf.Coinbase.Net" Version="2.10.0" />
<PackageReference Include="JKorf.HTX.Net" Version="7.10.0" />
<PackageReference Include="JKorf.Upbit.Net" Version="1.1.0" />
<PackageReference Include="KrakenExchange.Net" Version="6.10.0" />
<PackageReference Include="Kucoin.Net" Version="7.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Toobit.Net" Version="1.8.0" />
<PackageReference Include="WhiteBit.Net" Version="2.10.0" />
<PackageReference Include="XT.Net" Version="2.9.0" />
<PackageReference Include="Toobit.Net" Version="1.9.0" />
<PackageReference Include="WhiteBit.Net" Version="2.11.0" />
<PackageReference Include="XT.Net" Version="2.10.0" />
</ItemGroup>
</Project>
+1 -1
View File
@@ -139,7 +139,7 @@
_prices.Add("Toobit", toobitTask.Result.Data.Single().LastPrice ?? 0);
if (upbitTask.Result.Success)
_prices.Add("Upbit", upbitTask.Result.Data.LastPrice);
_prices.Add("Upbit", upbitTask.Result.Data.LastPrice ?? 0);
if (whitebitTask.Result.Success){
// WhiteBit API doesn't offer an endpoint to filter for a specific ticker, so we have to filter client side
+27 -28
View File
@@ -77,37 +77,36 @@
protected override async Task OnInitializedAsync()
{
var usdcSpotSymbol = new SharedSymbol(TradingMode.Spot, "BTC", "USDC");
var usdtSpotSymbol = new SharedSymbol(TradingMode.Spot, "BTC", "USDT");
var usdtPerpLinSymbol = new SharedSymbol(TradingMode.PerpetualLinear, "BTC", "USDT");
var symbol = new SharedSymbol(TradingMode.Spot, "BTC", SharedSymbol.UsdOrStable);
var futuresSymbol = new SharedSymbol(TradingMode.PerpetualLinear, "BTC", SharedSymbol.UsdOrStable);
_trackers = new List<ITradeTracker>
{
{ asterFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ binanceFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ bingXFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ bitfinexFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ bitgetFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ bitmartFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ bitmexFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ bloFinFactory.CreateTradeTracker(usdtPerpLinSymbol, period: TimeSpan.FromMinutes(5)) },
{ bybitFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ coinbaseFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ coinExFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ coinWFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ cryptocomFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ deepCoinFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ gateioFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ htxFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ hyperLiquidFactory.CreateTradeTracker(usdcSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ krakenFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ kucoinFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ mexcFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ okxFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ toobitFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ upbitFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ whitebitFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ xtFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
{ asterFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ 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)) },
{ bitmexFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ bloFinFactory.CreateTradeTracker(futuresSymbol, 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)) },
{ coinWFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ cryptocomFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ deepCoinFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ gateioFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ htxFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ hyperLiquidFactory.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)) },
{ toobitFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ upbitFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ whitebitFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
{ xtFactory.CreateTradeTracker(symbol, period: TimeSpan.FromMinutes(5)) },
};
await Task.WhenAll(_trackers.Select(b => b.StartAsync(false)));
+14 -14
View File
@@ -6,20 +6,20 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Binance.Net" Version="11.9.0" />
<PackageReference Include="Bitfinex.Net" Version="9.9.0" />
<PackageReference Include="BitMart.Net" Version="2.10.0" />
<PackageReference Include="Bybit.Net" Version="5.10.1" />
<PackageReference Include="CoinEx.Net" Version="9.9.0" />
<PackageReference Include="CryptoCom.Net" Version="2.10.0" />
<PackageReference Include="GateIo.Net" Version="2.11.0" />
<PackageReference Include="JK.Bitget.Net" Version="2.9.0" />
<PackageReference Include="JK.Mexc.Net" Version="3.10.0" />
<PackageReference Include="JK.OKX.Net" Version="3.9.0" />
<PackageReference Include="JKorf.Coinbase.Net" Version="2.9.0" />
<PackageReference Include="JKorf.HTX.Net" Version="7.9.0" />
<PackageReference Include="KrakenExchange.Net" Version="6.9.0" />
<PackageReference Include="Kucoin.Net" Version="7.9.0" />
<PackageReference Include="Binance.Net" Version="11.10.0" />
<PackageReference Include="Bitfinex.Net" Version="9.10.0" />
<PackageReference Include="BitMart.Net" Version="2.11.0" />
<PackageReference Include="Bybit.Net" Version="5.12.0" />
<PackageReference Include="CoinEx.Net" Version="9.10.0" />
<PackageReference Include="CryptoCom.Net" Version="2.11.0" />
<PackageReference Include="GateIo.Net" Version="2.12.0" />
<PackageReference Include="JK.Bitget.Net" Version="2.11.0" />
<PackageReference Include="JK.Mexc.Net" Version="3.11.0" />
<PackageReference Include="JK.OKX.Net" Version="3.10.0" />
<PackageReference Include="JKorf.Coinbase.Net" Version="2.10.0" />
<PackageReference Include="JKorf.HTX.Net" Version="7.10.0" />
<PackageReference Include="KrakenExchange.Net" Version="6.10.0" />
<PackageReference Include="Kucoin.Net" Version="7.10.0" />
</ItemGroup>
</Project>
+3 -3
View File
@@ -8,9 +8,9 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Binance.Net" Version="11.9.0" />
<PackageReference Include="BitMart.Net" Version="2.10.0" />
<PackageReference Include="JK.OKX.Net" Version="3.9.0" />
<PackageReference Include="Binance.Net" Version="11.10.0" />
<PackageReference Include="BitMart.Net" Version="2.11.0" />
<PackageReference Include="JK.OKX.Net" Version="3.10.0" />
</ItemGroup>
</Project>
+11
View File
@@ -66,6 +66,17 @@ Make a one time donation in a crypto currency of your choice. If you prefer to d
Alternatively, sponsor me on Github using [Github Sponsors](https://github.com/sponsors/JKorf).
## Release notes
* Version 9.13.0 - 10 Nov 2025
* Added SharedTickerType for defining time used for ticker calculations by the API
* Added SharedSymbolModel base class to SharedFuturesKline, SharedKline, SharedTrade models
* Added IExchangeService interface
* Fixed incorrect exchange name in static logger when using multiple libraries
* Version 9.12.0 - 03 Nov 2025
* Added constant for selecting a supported USD asset for use in a Shared API/SharedSymbol
* Added AliasType to specify only one way conversion for AssetAliases
* Removed some unhelpful verbose logs
* Version 9.11.0 - 30 Oct 2025
* Added StaticLogger to LibraryHelpers, updated warning logging for converters to use StaticLogger
* Added client reference helper to LibraryHelpers