mirror of
https://github.com/JKorf/CryptoExchange.Net.git
synced 2026-08-13 01:12:59 +00:00
6b14cdbf06
* Added support for Native AOT compilation * Updated all IEnumerable response types to array response types * Added Pass support for ApiCredentials, removing the need for most implementations to add their own ApiCredentials type * Added KeepAliveTimeout setting setting ping frame timeouts for SocketApiClient * Added IBookTickerRestClient Shared interface for requesting book tickers * Added ISpotTriggerOrderRestClient Shared interface for managing spot trigger orders * Added ISpotOrderClientIdClient Shared interface for managing spot orders by client order id * Added IFuturesTriggerOrderRestClient Shared interface for managing futures trigger orders * Added IFuturesOrderClientIdClient Shared interface for managing futures orders by client order id * Added IFuturesTpSlRestClient Shared interface for setting TP/SL on open futures positions * Added GenerateClientOrderId to ISpotOrderRestClient and IFuturesOrderRestClient interface * Added OptionalExchangeParameters and Supported properties to EndpointOptions * Refactor Shared interfaces quantity parameters and properties to use SharedQuantity * Added SharedSymbol property to Shared interface models returning a symbol * Added TriggerPrice, IsTriggerOrder, TakeProfitPrice, StopLossPrice and IsCloseOrder to SharedFuturesOrder response model * Added MaxShortLeverage and MaxLongLeverage to SharedFuturesSymbol response model * Added StopLossPrice and TakeProfitPrice to SharedPosition response model * Added TriggerPrice and IsTriggerOrder to SharedSpotOrder response model * Added QuoteVolume property to SharedSpotTicker response model * Added AssetAlias configuration models * Added static ExchangeSymbolCache for tracking symbol information from exchanges * Added static CallResult.SuccessResult to be used instead of constructing success CallResult instance * Added static ApplyRules, RandomHexString and RandomLong helper methods to ExchangeHelpers class * Added AsErrorWithData To CallResult * Added OriginalData property to CallResult * Added support for adjusting the rate limit key per call, allowing for ratelimiting depending on request parameters * Added implementation for integration testing ISymbolOrderBook instances * Added implementation for integration testing socket subscriptions * Added implementation for testing socket queries * Updated request cancellation logging to Debug level * Updated logging SourceContext to include the client type * Updated some logging logic, errors no longer contain any data, exception are not logged as string but instead forwarded to structured logging * Fixed warning for Enum parsing throwing exception and output warnings for each object in a response to only once to prevent slowing down execution * Fixed memory leak in AsyncAutoRestEvent * Fixed logging for ping frame timeout * Fixed warning getting logged when user stops SymbolOrderBook instance * Fixed socket client `UnsubscribeAll` not unsubscribing dedicated connections * Fixed memory leak in Rest client cache * Fixed integers bigger than int16 not getting correctly parsed to enums * Fixed issue where the default options were overridden when using SetApiCredentials * Removed Newtonsoft.Json dependency * Removed legacy Rest client code * Removed legacy ISpotClient and IFuturesClient support
105 lines
4.7 KiB
C#
105 lines
4.7 KiB
C#
using CryptoExchange.Net.Objects;
|
|
using System;
|
|
|
|
namespace CryptoExchange.Net.SharedApis
|
|
{
|
|
/// <summary>
|
|
/// Support for different quantity notations
|
|
/// </summary>
|
|
public record SharedQuantitySupport
|
|
{
|
|
/// <summary>
|
|
/// Supported quantity notations for buy limit orders
|
|
/// </summary>
|
|
public SharedQuantityType BuyLimit { get; set; }
|
|
/// <summary>
|
|
/// Supported quantity notations for sell limit orders
|
|
/// </summary>
|
|
public SharedQuantityType SellLimit { get; set; }
|
|
/// <summary>
|
|
/// Supported quantity notations for buy market orders
|
|
/// </summary>
|
|
public SharedQuantityType BuyMarket { get; set; }
|
|
/// <summary>
|
|
/// Supported quantity notations for sell market orders
|
|
/// </summary>
|
|
public SharedQuantityType SellMarket { get; set; }
|
|
|
|
/// <summary>
|
|
/// ctor
|
|
/// </summary>
|
|
public SharedQuantitySupport(SharedQuantityType buyLimit, SharedQuantityType sellLimit, SharedQuantityType buyMarket, SharedQuantityType sellMarket)
|
|
{
|
|
BuyLimit = buyLimit;
|
|
SellLimit = sellLimit;
|
|
BuyMarket = buyMarket;
|
|
SellMarket = sellMarket;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the supported quantity type for a specific order configuration
|
|
/// </summary>
|
|
/// <param name="side">Side of the order</param>
|
|
/// <param name="orderType">Type of the order</param>
|
|
/// <returns>The supported quantity type</returns>
|
|
public SharedQuantityType GetSupportedQuantityType(SharedOrderSide side, SharedOrderType orderType)
|
|
{
|
|
if (side == SharedOrderSide.Buy && (orderType == SharedOrderType.Limit || orderType == SharedOrderType.LimitMaker)) return BuyLimit;
|
|
if (side == SharedOrderSide.Buy && orderType == SharedOrderType.Market) return BuyMarket;
|
|
if (side == SharedOrderSide.Sell && (orderType == SharedOrderType.Limit || orderType == SharedOrderType.LimitMaker)) return SellLimit;
|
|
if (side == SharedOrderSide.Sell && orderType == SharedOrderType.Market) return SellMarket;
|
|
|
|
throw new ArgumentException("Unknown side/type combination");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get whether the API supports a specific quantity type for an order configuration
|
|
/// </summary>
|
|
/// <param name="side">Side of the order</param>
|
|
/// <param name="orderType">Type of the order</param>
|
|
/// <param name="quantityType">Type of quantity</param>
|
|
/// <returns>True if supported, false if not</returns>
|
|
public bool IsSupported(SharedOrderSide side, SharedOrderType orderType, SharedQuantityType quantityType)
|
|
{
|
|
var supportedType = GetSupportedQuantityType(side, orderType);
|
|
if (supportedType == quantityType)
|
|
return true;
|
|
|
|
if (supportedType == SharedQuantityType.BaseAndQuoteAsset && (quantityType == SharedQuantityType.BaseAsset || quantityType == SharedQuantityType.QuoteAsset))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Validate a request
|
|
/// </summary>
|
|
public Error? Validate(SharedOrderSide side, SharedOrderType type, SharedQuantity? quantity)
|
|
{
|
|
var supportedType = GetSupportedQuantityType(side, type);
|
|
if (supportedType == SharedQuantityType.BaseAndQuoteAsset)
|
|
return null;
|
|
|
|
if (supportedType == SharedQuantityType.BaseAndQuoteAsset && quantity != null && quantity.QuantityInBaseAsset == null && quantity.QuantityInQuoteAsset == null)
|
|
return new ArgumentError($"Quantity for {side}.{type} required in base or quote asset");
|
|
|
|
if (supportedType == SharedQuantityType.QuoteAsset && quantity != null && quantity.QuantityInQuoteAsset == null)
|
|
return new ArgumentError($"Quantity for {side}.{type} required in quote asset");
|
|
|
|
if (supportedType == SharedQuantityType.BaseAsset && quantity != null && quantity.QuantityInBaseAsset == null && quantity.QuantityInContracts == null)
|
|
return new ArgumentError($"Quantity for {side}.{type} required in base asset");
|
|
|
|
if (supportedType == SharedQuantityType.Contracts && quantity != null && quantity.QuantityInContracts == null)
|
|
return new ArgumentError($"Quantity for {side}.{type} required in contracts");
|
|
|
|
return null;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override string ToString()
|
|
{
|
|
return $"Limit buy: {BuyLimit}, limit sell: {SellLimit}, market buy: {BuyMarket}, market sell: {SellMarket}";
|
|
}
|
|
}
|
|
}
|