1
0
mirror of https://github.com/JKorf/CryptoExchange.Net.git synced 2026-08-13 01:12:59 +00:00
Files
CryptoExchange.Net/CryptoExchange.Net/SharedApis/Models/SharedQuantitySupport.cs
T
Jan Korf 6b14cdbf06 Feature/9.0.0 (#236)
* 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
2025-05-13 10:15:30 +02:00

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}";
}
}
}