mirror of
https://github.com/JKorf/CryptoExchange.Net.git
synced 2026-08-16 02:43:00 +00:00
e823114623
* Result types: * (Web)CallResult types are replaced by HttpResult, WebSocketResult and QueryResult with the same logic * Updated result types to record type * Result creation can be done with (Http/WebSocket/Query)Result.Ok(..) and .Fail(..) * Removed implicit result type conversion to bool, `if (result)` no longer works, instead use `if (result.Success)` * Replaced CallResult.SuccessResult with CallResult.Ok() * Fixed result object nullability hinting, for example Data might be null if Success isn't checked for true * Parameters & serialization: * Added support for `enabled` and `disabled` strings to bool converter * Removed ParameterCollection type, has been replaced by Parameters type * Removed ArraySerialization, OrderParameters and ParameterOrderComparer properties from RestApiClient, moved to ParameterSerializationsSettings * Updated RestRequestConfiguration in AuthenticationProvider.ProcessRequest to contain the full RequestDefinition instead of copied fields * Clients: * Updated Api client constructor logging parameter from ILogger to ILoggerFactory? * Added Api client constructor exchange name parameter * Added ToString overrides on base API types * Added Exchange property on BaseApiClient * Added ApiCredentials property on IRestApiClient and ISocketApiClient interfaces * Updated ILogger source from client name to topic specific client name * Removed logging from client creation * Fixed BaseRestClient SetApiCredentials not marked as virtual * Rest: * Added BaseAddress to RequestDefinition object * Updated RestApiClient AuthenticationProvider logic from private to protected and virtual * Removed RestApiClient.SendAsync baseAddress parameter removed * Removed RestApiClient.SendAsync without type parameter * WebSocket: * Updated MessageRouting definition into CreateForEvent for subscriptions and CreateForQuery for queries * Improved Query type safety with CeateForQuery which allows second parameter for specifying the result type * Renamed MessageRouter.CreateWithoutHandler to CreateVoid * Updated SocketApiClient.GetSocketConnection to check connection uri instead of Tag for finding compatible connections * Removed unused UnhandledMessageExpected property SocketApiClient * Fixed issue in SocketApiClient.GetSocketConnection causing requests to always wait the full max 10 seconds when there was a reconnecting socket * Shared APIs: * Updated Option definitions to always require the exchange name as first parameter * Added missing dedicated option types * Added Discover method on ISharedClient interface, returning info on supported capabilities and operations * Added SharedRequest GetParamValue helper method accepting multiple parameter names * Added ResetStaticExchangeParameters method on ExchangeParameters * Added Status property to SharedWithdrawal model * Added TradingModes property to SharedBalance model * Updated ExchangeSymbolCache to support multiple environments and additional key separation * Updated Shared ExchangeParameters parameter names to be case insensitive * Updated code comments * Replaced ExchangeResult with ExchangeCallResult type * Removed AsExchangeResult/ExchangeWebResult * Removed TradingMode from the response model, only maintained on models where it makes sense * Removed IListenKey support, listen keys now rely on internal management with TokenManager * Rate limiting: * Fixed websocket connection attempts counting towards rate limit even when server could not be reached * Removed host from rate limit methods, now part of the already provided RequestDefinition * Added amount parameter to RateLimit Reset method to allow partially resetting the limit * Added TokenManager implementation for automatic listenkey/token management * Added UserClientProvider base class * Added async streaming on UserDataTracker items with StreamUpdatesAsync * Added cancellation token support to UserDataTracker starting * Added Unit type for non-result types * Added ServerError constructor taking ErrorType and message to make it easier to create * Added SupportedEnvironments property to PlatformInfo * Updated SymbolOrderBook DoResyncAsync to return CallResult instead of CallResult<bool> which was redundant * Various small performance improvements
151 lines
5.7 KiB
C#
151 lines
5.7 KiB
C#
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using CryptoExchange.Net.Objects;
|
|
|
|
namespace CryptoExchange.Net.Interfaces
|
|
{
|
|
/// <summary>
|
|
/// Interface for order book
|
|
/// </summary>
|
|
public interface ISymbolOrderBook
|
|
{
|
|
/// <summary>
|
|
/// The exchange the book is for
|
|
/// </summary>
|
|
string Exchange { get; }
|
|
|
|
/// <summary>
|
|
/// The Api the book is for
|
|
/// </summary>
|
|
string Api { get; }
|
|
|
|
/// <summary>
|
|
/// The status of the order book. Order book is up to date when the status is `Synced`
|
|
/// </summary>
|
|
OrderBookStatus Status { get; set; }
|
|
|
|
/// <summary>
|
|
/// Last update identifier
|
|
/// </summary>
|
|
long LastSequenceNumber { get; }
|
|
/// <summary>
|
|
/// The symbol of the order book
|
|
/// </summary>
|
|
string Symbol { get; }
|
|
|
|
/// <summary>
|
|
/// Event when the state changes
|
|
/// </summary>
|
|
event Action<OrderBookStatus, OrderBookStatus> OnStatusChange;
|
|
/// <summary>
|
|
/// Event when order book was updated. Be careful! It can generate a lot of events at high-liquidity markets
|
|
/// </summary>
|
|
event Action<(ISymbolOrderBookEntry[] Bids, ISymbolOrderBookEntry[] Asks)> OnOrderBookUpdate;
|
|
/// <summary>
|
|
/// Event when the BestBid or BestAsk changes ie a Pricing Tick
|
|
/// </summary>
|
|
event Action<(ISymbolOrderBookEntry BestBid, ISymbolOrderBookEntry BestAsk)> OnBestOffersChanged;
|
|
/// <summary>
|
|
/// Timestamp of when the last update was applied to the book, local time
|
|
/// </summary>
|
|
DateTime UpdateTime { get; }
|
|
/// <summary>
|
|
/// Timestamp of the last event that was applied, server time
|
|
/// </summary>
|
|
DateTime? UpdateServerTime { get; }
|
|
/// <summary>
|
|
/// Timestamp of the last event that was applied, in local time, estimated based on timestamp difference between client and server
|
|
/// </summary>
|
|
DateTime? UpdateLocalTime { get; }
|
|
/// <summary>
|
|
/// Age of the data, in local time, estimated based on timestamp difference between client and server + the period since last update
|
|
/// </summary>
|
|
TimeSpan? DataAge { get; }
|
|
|
|
/// <summary>
|
|
/// The number of asks in the book
|
|
/// </summary>
|
|
int AskCount { get; }
|
|
/// <summary>
|
|
/// The number of bids in the book
|
|
/// </summary>
|
|
int BidCount { get; }
|
|
|
|
/// <summary>
|
|
/// Get a snapshot of the book at this moment
|
|
/// </summary>
|
|
(ISymbolOrderBookEntry[] bids, ISymbolOrderBookEntry[] asks) Book { get; }
|
|
|
|
/// <summary>
|
|
/// The list of asks
|
|
/// </summary>
|
|
ISymbolOrderBookEntry[] Asks { get; }
|
|
|
|
/// <summary>
|
|
/// The list of bids
|
|
/// </summary>
|
|
ISymbolOrderBookEntry[] Bids { get; }
|
|
|
|
/// <summary>
|
|
/// The best bid currently in the order book
|
|
/// </summary>
|
|
ISymbolOrderBookEntry BestBid { get; }
|
|
|
|
/// <summary>
|
|
/// The best ask currently in the order book
|
|
/// </summary>
|
|
ISymbolOrderBookEntry BestAsk { get; }
|
|
|
|
/// <summary>
|
|
/// BestBid/BesAsk returned as a pair
|
|
/// </summary>
|
|
(ISymbolOrderBookEntry Bid, ISymbolOrderBookEntry Ask) BestOffers { get; }
|
|
|
|
/// <summary>
|
|
/// Start connecting and synchronizing the order book
|
|
/// </summary>
|
|
/// <param name="ct">A cancellation token to stop the order book when canceled</param>
|
|
/// <returns></returns>
|
|
Task<CallResult> StartAsync(CancellationToken? ct = null);
|
|
|
|
/// <summary>
|
|
/// Stop syncing the order book
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
Task StopAsync();
|
|
|
|
/// <summary>
|
|
/// Get the average price that a market order would fill at at the current order book state. This is no guarantee that an order of that quantity would actually be filled
|
|
/// at that price since between this calculation and the order placement the book might have changed.
|
|
/// </summary>
|
|
/// <param name="quantity">The quantity in base asset to fill</param>
|
|
/// <param name="type">The type</param>
|
|
/// <returns>Average fill price</returns>
|
|
CallResult<decimal> CalculateAverageFillPrice(decimal quantity, OrderBookEntryType type);
|
|
|
|
/// <summary>
|
|
/// Get the amount of base asset which can be traded with the quote quantity when placing a market order at at the current order book state.
|
|
/// This is no guarantee that an order of that quantity would actually be fill the quantity returned by this since between this calculation and the order placement the book might have changed.
|
|
/// </summary>
|
|
/// <param name="quoteQuantity">The quantity in quote asset looking to trade</param>
|
|
/// <param name="type">The type</param>
|
|
/// <returns>Amount of base asset tradable with the specified amount of quote asset</returns>
|
|
CallResult<decimal> CalculateTradableAmount(decimal quoteQuantity, OrderBookEntryType type);
|
|
|
|
/// <summary>
|
|
/// String representation of the top x entries
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
string ToString(int rows);
|
|
|
|
/// <summary>
|
|
/// Output the orderbook to the console
|
|
/// </summary>
|
|
/// <param name="numberOfEntries">Number of rows to display</param>
|
|
/// <param name="refreshInterval">Refresh interval</param>
|
|
/// <param name="ct">Cancellation token</param>
|
|
Task OutputToConsoleAsync(int numberOfEntries, TimeSpan refreshInterval, CancellationToken ct = default);
|
|
}
|
|
}
|