mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-11-03 20:07:33 +00:00
Compare commits
No commits in common. "master" and "CryptoExchange.Net.9.10.0" have entirely different histories.
master
...
CryptoExch
@ -6,9 +6,9 @@
|
||||
<PackageId>CryptoExchange.Net.Protobuf</PackageId>
|
||||
<Authors>JKorf</Authors>
|
||||
<Description>Protobuf support for CryptoExchange.Net</Description>
|
||||
<PackageVersion>9.12.0</PackageVersion>
|
||||
<AssemblyVersion>9.12.0</AssemblyVersion>
|
||||
<FileVersion>9.12.0</FileVersion>
|
||||
<PackageVersion>9.9.0</PackageVersion>
|
||||
<AssemblyVersion>9.9.0</AssemblyVersion>
|
||||
<FileVersion>9.9.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.12.0" />
|
||||
<PackageReference Include="CryptoExchange.Net" Version="9.9.0" />
|
||||
<PackageReference Include="protobuf-net" Version="3.2.56" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@ -5,18 +5,6 @@
|
||||
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/
|
||||
|
||||
* Version 9.11.0 - 30 Oct 2025
|
||||
* Updated CryptoExchange.Net version to 9.11.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
||||
|
||||
* Version 9.10.0 - 15 Oct 2025
|
||||
* Updated CryptoExchange.Net version to 9.10.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
||||
|
||||
* Version 9.9.0 - 06 Oct 2025
|
||||
* Updated CryptoExchange.Net version to 9.9.0, see https://github.com/JKorf/CryptoExchange.Net/releases/
|
||||
|
||||
|
||||
@ -6,10 +6,10 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0"></PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1"></PackageReference>
|
||||
<PackageReference Include="Moq" Version="4.20.72" />
|
||||
<PackageReference Include="NUnit" Version="4.4.0"></PackageReference>
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="5.2.0"></PackageReference>
|
||||
<PackageReference Include="NUnit" Version="4.3.2"></PackageReference>
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="5.0.0"></PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -102,6 +102,7 @@ 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;
|
||||
}
|
||||
@ -121,6 +122,7 @@ namespace CryptoExchange.Net.Clients
|
||||
/// </summary>
|
||||
public virtual void Dispose()
|
||||
{
|
||||
_logger.Log(LogLevel.Debug, "Disposing client");
|
||||
foreach (var client in ApiClients)
|
||||
client.Dispose();
|
||||
}
|
||||
|
||||
@ -21,8 +21,6 @@ namespace CryptoExchange.Net.Clients
|
||||
protected BaseRestClient(ILoggerFactory? loggerFactory, string name) : base(loggerFactory, name)
|
||||
{
|
||||
_logger = loggerFactory?.CreateLogger(name + ".RestClient") ?? NullLoggerFactory.Instance.CreateLogger(name);
|
||||
|
||||
LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,8 +40,6 @@ namespace CryptoExchange.Net.Clients
|
||||
protected BaseSocketClient(ILoggerFactory? loggerFactory, string name) : base(loggerFactory, name)
|
||||
{
|
||||
_logger = loggerFactory?.CreateLogger(name + ".SocketClient") ?? NullLoggerFactory.Instance.CreateLogger(name);
|
||||
|
||||
LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger(name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text.Json;
|
||||
@ -48,7 +47,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
if (string.IsNullOrEmpty(value))
|
||||
{
|
||||
if (typeToConvert == typeof(bool))
|
||||
LibraryHelpers.StaticLogger?.LogWarning("Received null bool value, but property type is not a nullable bool");
|
||||
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Received null bool value, but property type is not a nullable bool");
|
||||
return default;
|
||||
}
|
||||
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
@ -40,7 +39,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
if (reader.TokenType == JsonTokenType.Null)
|
||||
{
|
||||
if (typeToConvert == typeof(DateTime))
|
||||
LibraryHelpers.StaticLogger?.LogWarning("DateTime value of null, but property is not nullable");
|
||||
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | DateTime value of null, but property is not nullable");
|
||||
return default;
|
||||
}
|
||||
|
||||
@ -125,7 +124,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
|| !int.TryParse(stringValue.Substring(8, 2), out var hour)
|
||||
|| !int.TryParse(stringValue.Substring(10, 2), out var minute))
|
||||
{
|
||||
LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue);
|
||||
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue);
|
||||
return default;
|
||||
}
|
||||
return new DateTime(year, month, day, hour, minute, 0, DateTimeKind.Utc);
|
||||
@ -138,7 +137,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
|| !int.TryParse(stringValue.Substring(4, 2), out var month)
|
||||
|| !int.TryParse(stringValue.Substring(6, 2), out var day))
|
||||
{
|
||||
LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue);
|
||||
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue);
|
||||
return default;
|
||||
}
|
||||
return new DateTime(year, month, day, 0, 0, 0, DateTimeKind.Utc);
|
||||
@ -151,7 +150,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
|| !int.TryParse(stringValue.Substring(2, 2), out var month)
|
||||
|| !int.TryParse(stringValue.Substring(4, 2), out var day))
|
||||
{
|
||||
LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue);
|
||||
Trace.WriteLine("{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue);
|
||||
return default;
|
||||
}
|
||||
return new DateTime(year + 2000, month, day, 0, 0, 0, DateTimeKind.Utc);
|
||||
@ -180,7 +179,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
|| !int.TryParse(values[1], out var month)
|
||||
|| !int.TryParse(values[2], out var day))
|
||||
{
|
||||
LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue);
|
||||
Trace.WriteLine("{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue);
|
||||
return default;
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,4 @@
|
||||
using CryptoExchange.Net.Attributes;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
@ -81,7 +79,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
}
|
||||
public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
return _enumConverter.ReadNullable(ref reader, typeToConvert, options, out var isEmptyString);
|
||||
return _enumConverter.ReadNullable(ref reader, typeToConvert, options, out var isEmptyString, out var warn);
|
||||
}
|
||||
|
||||
public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options)
|
||||
@ -100,13 +98,20 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
/// <inheritdoc />
|
||||
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
var t = ReadNullable(ref reader, typeToConvert, options, out var isEmptyString);
|
||||
var t = ReadNullable(ref reader, typeToConvert, options, out var isEmptyString, out var warn);
|
||||
if (t == null)
|
||||
{
|
||||
if (isEmptyString && !_unknownValuesWarned.Contains(null))
|
||||
if (warn)
|
||||
{
|
||||
// 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");
|
||||
if (isEmptyString)
|
||||
{
|
||||
// We received an empty string and have no mapping for it, and the property isn't nullable
|
||||
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Received empty string as 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");
|
||||
}
|
||||
else
|
||||
{
|
||||
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Received null 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");
|
||||
}
|
||||
}
|
||||
|
||||
return new T(); // return default value
|
||||
@ -117,9 +122,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
}
|
||||
}
|
||||
|
||||
private T? ReadNullable(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, out bool isEmptyString)
|
||||
private T? ReadNullable(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, out bool isEmptyString, out bool warn)
|
||||
{
|
||||
isEmptyString = false;
|
||||
warn = false;
|
||||
var enumType = typeof(T);
|
||||
if (_mapping == null)
|
||||
_mapping = AddMapping();
|
||||
@ -148,8 +154,9 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
||||
// We received an enum value but weren't able to parse it.
|
||||
if (!_unknownValuesWarned.Contains(stringValue))
|
||||
{
|
||||
warn = true;
|
||||
_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");
|
||||
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | 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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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.12.0</PackageVersion>
|
||||
<AssemblyVersion>9.12.0</AssemblyVersion>
|
||||
<FileVersion>9.12.0</FileVersion>
|
||||
<PackageVersion>9.10.0</PackageVersion>
|
||||
<AssemblyVersion>9.10.0</AssemblyVersion>
|
||||
<FileVersion>9.10.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>
|
||||
@ -51,11 +51,11 @@
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.10" />
|
||||
<PackageReference Include="System.Text.Json" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.6" />
|
||||
<PackageReference Include="System.Text.Json" Version="9.0.6" />
|
||||
</ItemGroup>
|
||||
<ItemGroup Label="Transitive Client Packages">
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.6" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@ -1,5 +1,4 @@
|
||||
using CryptoExchange.Net.Objects;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
@ -13,50 +12,11 @@ namespace CryptoExchange.Net
|
||||
/// </summary>
|
||||
public static class LibraryHelpers
|
||||
{
|
||||
private static ILogger? _staticLogger;
|
||||
/// <summary>
|
||||
/// Static logger
|
||||
/// </summary>
|
||||
public static ILogger? StaticLogger
|
||||
{
|
||||
get => _staticLogger;
|
||||
internal set
|
||||
{
|
||||
if (_staticLogger != null)
|
||||
return;
|
||||
|
||||
_staticLogger = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Client order id separator
|
||||
/// </summary>
|
||||
public const string ClientOrderIdSeparator = "JK";
|
||||
|
||||
private static Dictionary<string, string> _defaultClientReferences = new Dictionary<string, string>()
|
||||
{
|
||||
{ "Binance.Spot", "x-VICEW9VV" },
|
||||
{ "Binance.Futures", "x-d63tKbx3" },
|
||||
{ "BingX", "easytrading" },
|
||||
{ "Bitfinex", "kCCe-CNBO" },
|
||||
{ "Bitget", "6x21p" },
|
||||
{ "BitMart", "EASYTRADING0001" },
|
||||
{ "BitMEX", "Sent from JKorf" },
|
||||
{ "BloFin", "5c07cf695885c282" },
|
||||
{ "Bybit", "Zx000356" },
|
||||
{ "CoinEx", "x-147866029-" },
|
||||
{ "GateIo", "copytraderpw" },
|
||||
{ "HTX", "AA1ef14811" },
|
||||
{ "Kucoin.FuturesName", "Easytradingfutures" },
|
||||
{ "Kucoin.FuturesKey", "9e08c05f-454d-4580-82af-2f4c7027fd00" },
|
||||
{ "Kucoin.SpotName", "Easytrading" },
|
||||
{ "Kucoin.SpotKey", "f8ae62cb-2b3d-420c-8c98-e1c17dd4e30a" },
|
||||
{ "Mexc", "EASYT" },
|
||||
{ "OKX", "1425d83a94fbBCDE" },
|
||||
{ "XT", "4XWeqN10M1fcoI5L" },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Apply broker id to a client order id
|
||||
/// </summary>
|
||||
@ -87,22 +47,6 @@ namespace CryptoExchange.Net
|
||||
return clientOrderId;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the client reference for an exchange if available
|
||||
/// </summary>
|
||||
public static string GetClientReference(Func<string?> optionsReference, string exchange, string? topic = null)
|
||||
{
|
||||
var optionsValue = optionsReference();
|
||||
if (!string.IsNullOrEmpty(optionsValue))
|
||||
return optionsValue!;
|
||||
|
||||
var key = exchange;
|
||||
if (topic != null)
|
||||
key += "." + topic;
|
||||
|
||||
return _defaultClientReferences.TryGetValue(key, out var id) ? id : throw new KeyNotFoundException($"{exchange} not found in configuration");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a new HttpMessageHandler instance
|
||||
/// </summary>
|
||||
|
||||
@ -13,6 +13,7 @@ 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;
|
||||
@ -71,6 +72,11 @@ 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"),
|
||||
@ -228,6 +234,11 @@ 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);
|
||||
|
||||
@ -9,10 +9,6 @@ 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>
|
||||
@ -25,26 +21,10 @@ namespace CryptoExchange.Net.Objects
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// </summary>
|
||||
public AssetAlias(string exchangeName, string commonName, AliasType type = AliasType.BothWays)
|
||||
public AssetAlias(string exchangeName, string commonName)
|
||||
{
|
||||
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,22 +23,12 @@ 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.FirstOrDefault(x => x.CommonAssetName == commonName)?.ExchangeAssetName ?? commonName;
|
||||
public string CommonToExchangeName(string commonName) => !AutoConvertEnabled ? commonName : Aliases.SingleOrDefault(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)
|
||||
{
|
||||
if (!AutoConvertEnabled)
|
||||
return exchangeName;
|
||||
|
||||
var alias = Aliases.FirstOrDefault(x => x.ExchangeAssetName == exchangeName);
|
||||
if (alias == null || alias.Type == AliasType.OnlyToExchange)
|
||||
return exchangeName;
|
||||
|
||||
return alias.CommonAssetName;
|
||||
}
|
||||
public string ExchangeToCommonName(string exchangeName) => !AutoConvertEnabled ? exchangeName : Aliases.SingleOrDefault(x => x.ExchangeAssetName == exchangeName)?.CommonAssetName ?? exchangeName;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@ namespace CryptoExchange.Net.SharedApis
|
||||
/// <summary>
|
||||
/// Mark/index price kline
|
||||
/// </summary>
|
||||
public record SharedFuturesKline : SharedSymbolModel
|
||||
public record SharedFuturesKline
|
||||
{
|
||||
/// <summary>
|
||||
/// Open time
|
||||
@ -31,8 +31,7 @@ namespace CryptoExchange.Net.SharedApis
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// </summary>
|
||||
public SharedFuturesKline(SharedSymbol? sharedSymbol, string symbol, DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice)
|
||||
: base(sharedSymbol, symbol)
|
||||
public SharedFuturesKline(DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice)
|
||||
{
|
||||
OpenTime = openTime;
|
||||
ClosePrice = closePrice;
|
||||
|
||||
@ -5,7 +5,7 @@ namespace CryptoExchange.Net.SharedApis
|
||||
/// <summary>
|
||||
/// Kline info
|
||||
/// </summary>
|
||||
public record SharedKline : SharedSymbolModel
|
||||
public record SharedKline
|
||||
{
|
||||
/// <summary>
|
||||
/// Open time
|
||||
@ -35,8 +35,7 @@ namespace CryptoExchange.Net.SharedApis
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// </summary>
|
||||
public SharedKline(SharedSymbol? sharedSymbol, string symbol, DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice, decimal volume)
|
||||
: base(sharedSymbol, symbol)
|
||||
public SharedKline(DateTime openTime, decimal closePrice, decimal highPrice, decimal lowPrice, decimal openPrice, decimal volume)
|
||||
{
|
||||
OpenTime = openTime;
|
||||
ClosePrice = closePrice;
|
||||
|
||||
@ -5,7 +5,7 @@ namespace CryptoExchange.Net.SharedApis
|
||||
/// <summary>
|
||||
/// Public trade info
|
||||
/// </summary>
|
||||
public record SharedTrade : SharedSymbolModel
|
||||
public record SharedTrade
|
||||
{
|
||||
/// <summary>
|
||||
/// Quantity of the trade
|
||||
@ -27,7 +27,7 @@ namespace CryptoExchange.Net.SharedApis
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// </summary>
|
||||
public SharedTrade(SharedSymbol? sharedSymbol, string symbol, decimal quantity, decimal price, DateTime timestamp) : base(sharedSymbol, symbol)
|
||||
public SharedTrade(decimal quantity, decimal price, DateTime timestamp)
|
||||
{
|
||||
Quantity = quantity;
|
||||
Price = price;
|
||||
|
||||
@ -33,11 +33,6 @@ 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,7 +449,10 @@ namespace CryptoExchange.Net.Sockets
|
||||
}
|
||||
|
||||
if (query == null)
|
||||
{
|
||||
_logger.MessageSentNotPending(SocketId, requestId);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
query.IsSend(query.RequestTimeout ?? ApiClient.ClientOptions.RequestTimeout);
|
||||
return Task.CompletedTask;
|
||||
|
||||
@ -325,12 +325,9 @@ namespace CryptoExchange.Net.Trackers.Trades
|
||||
if (Period != null)
|
||||
items = items.Where(e => e.Timestamp >= DateTime.UtcNow.Add(-Period.Value));
|
||||
|
||||
if (items.Any())
|
||||
{
|
||||
_snapshotId = data.Max(d => d.Timestamp.Ticks);
|
||||
foreach (var item in items.OrderBy(d => d.Timestamp))
|
||||
_data.Add(item);
|
||||
}
|
||||
_snapshotId = data.Max(d => d.Timestamp.Ticks);
|
||||
foreach (var item in items.OrderBy(d => d.Timestamp))
|
||||
_data.Add(item);
|
||||
|
||||
_snapshotSet = true;
|
||||
_changed = true;
|
||||
|
||||
@ -5,32 +5,31 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<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="Binance.Net" Version="11.8.0" />
|
||||
<PackageReference Include="Bitfinex.Net" Version="9.8.0" />
|
||||
<PackageReference Include="BitMart.Net" Version="2.9.0" />
|
||||
<PackageReference Include="BloFin.Net" Version="1.1.0" />
|
||||
<PackageReference Include="Bybit.Net" Version="5.9.0" />
|
||||
<PackageReference Include="CoinEx.Net" Version="9.8.0" />
|
||||
<PackageReference Include="CoinW.Net" Version="1.5.0" />
|
||||
<PackageReference Include="CryptoCom.Net" Version="2.9.0" />
|
||||
<PackageReference Include="DeepCoin.Net" Version="2.8.0" />
|
||||
<PackageReference Include="GateIo.Net" Version="2.9.1" />
|
||||
<PackageReference Include="HyperLiquid.Net" Version="2.13.0" />
|
||||
<PackageReference Include="JK.BingX.Net" Version="2.8.0" />
|
||||
<PackageReference Include="JK.Bitget.Net" Version="2.8.0" />
|
||||
<PackageReference Include="JK.Mexc.Net" Version="3.9.0" />
|
||||
<PackageReference Include="JK.OKX.Net" Version="3.8.0" />
|
||||
<PackageReference Include="Jkorf.Aster.Net" Version="1.0.0" />
|
||||
<PackageReference Include="JKorf.BitMEX.Net" Version="2.8.0" />
|
||||
<PackageReference Include="JKorf.Coinbase.Net" Version="2.8.0" />
|
||||
<PackageReference Include="JKorf.HTX.Net" Version="7.8.0" />
|
||||
<PackageReference Include="KrakenExchange.Net" Version="6.8.0" />
|
||||
<PackageReference Include="Kucoin.Net" Version="7.8.0" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="9.0.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" />
|
||||
<PackageReference Include="Toobit.Net" Version="1.7.0" />
|
||||
<PackageReference Include="WhiteBit.Net" Version="2.9.0" />
|
||||
<PackageReference Include="XT.Net" Version="2.8.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@ -21,7 +21,6 @@
|
||||
@inject IMexcRestClient mexcClient
|
||||
@inject IOKXRestClient okxClient
|
||||
@inject IToobitRestClient toobitClient
|
||||
@inject IUpbitRestClient upbitClient
|
||||
@inject IWhiteBitRestClient whitebitClient
|
||||
@inject IXTRestClient xtClient
|
||||
|
||||
@ -58,7 +57,6 @@
|
||||
var mexcTask = mexcClient.SpotApi.ExchangeData.GetTickerAsync("BTCUSDT");
|
||||
var okxTask = okxClient.UnifiedApi.ExchangeData.GetTickerAsync("BTC-USDT");
|
||||
var toobitTask = toobitClient.SpotApi.ExchangeData.GetTickersAsync("BTCUSDT");
|
||||
var upbitTask = upbitClient.SpotApi.ExchangeData.GetTickerAsync("USDT-BTC");
|
||||
var whitebitTask = whitebitClient.V4Api.ExchangeData.GetTickersAsync();
|
||||
var xtTask = xtClient.SpotApi.ExchangeData.GetTickersAsync("btc_usdt");
|
||||
|
||||
@ -138,9 +136,6 @@
|
||||
if (toobitTask.Result.Success)
|
||||
_prices.Add("Toobit", toobitTask.Result.Data.Single().LastPrice ?? 0);
|
||||
|
||||
if (upbitTask.Result.Success)
|
||||
_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
|
||||
var tickers = whitebitTask.Result.Data;
|
||||
|
||||
@ -21,7 +21,6 @@
|
||||
@inject IMexcSocketClient mexcSocketClient
|
||||
@inject IOKXSocketClient okxSocketClient
|
||||
@inject IToobitSocketClient toobitSocketClient
|
||||
@inject IUpbitSocketClient upbitSocketClient
|
||||
@inject IWhiteBitSocketClient whitebitSocketClient
|
||||
@inject IXTSocketClient xtSocketClient
|
||||
@using System.Collections.Concurrent
|
||||
@ -73,7 +72,6 @@
|
||||
okxSocketClient.UnifiedApi.ExchangeData.SubscribeToTickerUpdatesAsync("ETH-BTC", data => UpdateData("OKX", data.Data.LastPrice ?? 0)),
|
||||
// Toobit doesn't support the ETH/BTC pair
|
||||
//toobitSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("ETHBTC", data => UpdateData("Toobit", data.Data.LastPrice ?? 0)),
|
||||
upbitSocketClient.SpotApi.SubscribeToTickerUpdatesAsync("BTC-ETH", data => UpdateData("Upbit", data.Data.LastPrice)),
|
||||
whitebitSocketClient.V4Api.SubscribeToTickerUpdatesAsync("ETH_BTC", data => UpdateData("WhiteBit", data.Data.Ticker.LastPrice)),
|
||||
};
|
||||
|
||||
|
||||
@ -25,7 +25,6 @@
|
||||
@using Kucoin.Net.Interfaces
|
||||
@using Mexc.Net.Interfaces
|
||||
@using OKX.Net.Interfaces;
|
||||
@using Upbit.Net.Interfaces;
|
||||
@using Toobit.Net.Interfaces;
|
||||
@using WhiteBit.Net.Interfaces
|
||||
@using XT.Net.Interfaces
|
||||
@ -51,7 +50,6 @@
|
||||
@inject IMexcOrderBookFactory mexcFactory
|
||||
@inject IOKXOrderBookFactory okxFactory
|
||||
@inject IToobitOrderBookFactory toobitFactory
|
||||
@inject IUpbitOrderBookFactory upbitFactory
|
||||
@inject IWhiteBitOrderBookFactory whitebitFactory
|
||||
@inject IXTOrderBookFactory xtFactory
|
||||
@implements IDisposable
|
||||
@ -109,7 +107,6 @@
|
||||
{ "Mexc", mexcFactory.CreateSpot("ETHBTC") },
|
||||
{ "OKX", okxFactory.Create("ETH-BTC") },
|
||||
{ "Toobit", toobitFactory.CreateSpot("ETHUSDT") },
|
||||
{ "Upbit", upbitFactory.CreateSpot("BTC-ETH") },
|
||||
{ "WhiteBit", whitebitFactory.CreateV4("ETH_BTC") },
|
||||
{ "XT", xtFactory.CreateSpot("eth_btc") },
|
||||
};
|
||||
|
||||
@ -26,7 +26,6 @@
|
||||
@using Kucoin.Net.Interfaces
|
||||
@using Mexc.Net.Interfaces
|
||||
@using OKX.Net.Interfaces;
|
||||
@using Upbit.Net.Interfaces;
|
||||
@using Toobit.Net.Interfaces;
|
||||
@using WhiteBit.Net.Interfaces
|
||||
@using XT.Net.Interfaces
|
||||
@ -52,12 +51,11 @@
|
||||
@inject IMexcTrackerFactory mexcFactory
|
||||
@inject IOKXTrackerFactory okxFactory
|
||||
@inject IToobitTrackerFactory toobitFactory
|
||||
@inject IUpbitTrackerFactory upbitFactory
|
||||
@inject IWhiteBitTrackerFactory whitebitFactory
|
||||
@inject IXTTrackerFactory xtFactory
|
||||
@implements IDisposable
|
||||
|
||||
<h3>Trade Trackers, live updates:</h3>
|
||||
<h3>ETH-BTC trade Trackers, live updates:</h3>
|
||||
<div style="display:flex; flex-wrap: wrap;">
|
||||
@foreach (var tracker in _trackers.OrderBy(p => p.Exchange))
|
||||
{
|
||||
@ -77,39 +75,39 @@
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
var symbol = new SharedSymbol(TradingMode.Spot, "BTC", SharedSymbol.UsdOrStable);
|
||||
var futuresSymbol = new SharedSymbol(TradingMode.PerpetualLinear, "BTC", SharedSymbol.UsdOrStable);
|
||||
var usdcSpotSymbol = new SharedSymbol(TradingMode.Spot, "BTC", "USDC");
|
||||
var usdtSpotSymbol = new SharedSymbol(TradingMode.Spot, "BTC", "USDT");
|
||||
var usdtPerpLinSymbol = new SharedSymbol(TradingMode.PerpetualLinear, "BTC", "USDT");
|
||||
|
||||
_trackers = new List<ITradeTracker>
|
||||
{
|
||||
{ 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)) },
|
||||
{ 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)) },
|
||||
{ whitebitFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
|
||||
{ xtFactory.CreateTradeTracker(usdtSpotSymbol, period: TimeSpan.FromMinutes(5)) },
|
||||
};
|
||||
|
||||
await Task.WhenAll(_trackers.Select(b => b.StartAsync(false)));
|
||||
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);
|
||||
|
||||
@ -54,7 +54,6 @@ namespace BlazorClient
|
||||
services.AddMexc();
|
||||
services.AddOKX();
|
||||
services.AddToobit();
|
||||
services.AddUpbit();
|
||||
services.AddWhiteBit();
|
||||
services.AddXT();
|
||||
}
|
||||
|
||||
@ -29,7 +29,6 @@
|
||||
@using Kucoin.Net.Interfaces.Clients;
|
||||
@using Mexc.Net.Interfaces.Clients;
|
||||
@using OKX.Net.Interfaces.Clients;
|
||||
@using Upbit.Net.Interfaces.Clients;
|
||||
@using Toobit.Net.Interfaces.Clients;
|
||||
@using WhiteBit.Net.Interfaces.Clients
|
||||
@using XT.Net.Interfaces.Clients
|
||||
|
||||
@ -6,20 +6,20 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<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" />
|
||||
<PackageReference Include="Binance.Net" Version="11.1.0" />
|
||||
<PackageReference Include="Bitfinex.Net" Version="9.1.0" />
|
||||
<PackageReference Include="BitMart.Net" Version="2.1.0" />
|
||||
<PackageReference Include="Bybit.Net" Version="5.1.0" />
|
||||
<PackageReference Include="CoinEx.Net" Version="9.1.0" />
|
||||
<PackageReference Include="CryptoCom.Net" Version="2.1.0" />
|
||||
<PackageReference Include="GateIo.Net" Version="2.1.0" />
|
||||
<PackageReference Include="JK.Bitget.Net" Version="2.1.0" />
|
||||
<PackageReference Include="JK.Mexc.Net" Version="3.1.0" />
|
||||
<PackageReference Include="JK.OKX.Net" Version="3.1.0" />
|
||||
<PackageReference Include="JKorf.Coinbase.Net" Version="2.1.0" />
|
||||
<PackageReference Include="JKorf.HTX.Net" Version="7.1.0" />
|
||||
<PackageReference Include="KrakenExchange.Net" Version="6.1.0" />
|
||||
<PackageReference Include="Kucoin.Net" Version="7.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@ -8,9 +8,9 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<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" />
|
||||
<PackageReference Include="Binance.Net" Version="11.1.0" />
|
||||
<PackageReference Include="BitMart.Net" Version="2.1.0" />
|
||||
<PackageReference Include="JK.OKX.Net" Version="3.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
13
README.md
13
README.md
@ -35,7 +35,6 @@ Full list of all libraries part of the CryptoExchange.Net ecosystem. Consider us
|
||||
||Mexc|CEX|[JKorf/Mexc.Net](https://github.com/JKorf/Mexc.Net)|[](https://www.nuget.org/packages/JK.Mexc.Net)|-|-|
|
||||
||OKX|CEX|[JKorf/OKX.Net](https://github.com/JKorf/OKX.Net)|[](https://www.nuget.org/packages/JK.OKX.Net)|[Link](https://www.okx.com/join/14592495)|20%|
|
||||
||Toobit|CEX|[JKorf/Toobit.Net](https://github.com/JKorf/Toobit.Net)|[](https://www.nuget.org/packages/Toobit.Net)|[Link](https://www.toobit.com/en-US/register?invite_code=zsV19h)|-|
|
||||
||Upbit|CEX|[JKorf/Upbit.Net](https://github.com/JKorf/Upbit.Net)|[](https://www.nuget.org/packages/JKorf.Upbit.Net)|-|-|
|
||||
||WhiteBit|CEX|[JKorf/WhiteBit.Net](https://github.com/JKorf/WhiteBit.Net)|[](https://www.nuget.org/packages/WhiteBit.Net)|[Link](https://whitebit.com/referral/a8e59b59-186c-4662-824c-3095248e0edf)|-|
|
||||
||XT|CEX|[JKorf/XT.Net](https://github.com/JKorf/XT.Net)|[](https://www.nuget.org/packages/XT.Net)|[Link](https://www.xt.com/ru/accounts/register?ref=CZG39C)|25%|
|
||||
|
||||
@ -66,22 +65,10 @@ 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.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
|
||||
* Fixed exception when initial trade snapshot has no items in TradeTracker
|
||||
|
||||
* Version 9.10.0 - 15 Oct 2025
|
||||
* Added ITransferRestClient Shared interface
|
||||
* Added ClientOrderId property to SharedUserTrade model
|
||||
* Updated IBalanceRestClient, GetBalancesRequest now mainly works with SharedAccountType type, allowing more options
|
||||
* Updated IBalanceRestClient, GetBalanceOptions now specifies supported account types
|
||||
* Updated DateTimeConverter to work primarily with decimal instead of double to prevent some floating point issues
|
||||
|
||||
* Version 9.9.0 - 06 Oct 2025
|
||||
* Updated socket Subscription status handling
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user