mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-06-08 16:36:15 +00:00
Cleaned up order book
This commit is contained in:
parent
964403d750
commit
3ba0507a79
@ -538,6 +538,13 @@
|
||||
<param name="value">The value of the object</param>
|
||||
<param name="argumentName">Name of the parameter</param>
|
||||
</member>
|
||||
<member name="M:CryptoExchange.Net.ExtensionMethods.ValidateNotNull``1(System.Collections.Generic.IEnumerable{``0},System.String)">
|
||||
<summary>
|
||||
Validates a list is not null or empty
|
||||
</summary>
|
||||
<param name="value">The value of the object</param>
|
||||
<param name="argumentName">Name of the parameter</param>
|
||||
</member>
|
||||
<member name="T:CryptoExchange.Net.Interfaces.IRateLimiter">
|
||||
<summary>
|
||||
Rate limiter interface
|
||||
@ -1637,28 +1644,6 @@
|
||||
<member name="M:CryptoExchange.Net.Objects.SocketClientOptions.ToString">
|
||||
<inheritdoc />
|
||||
</member>
|
||||
<member name="T:CryptoExchange.Net.OrderBook.OrderBookEntry">
|
||||
<summary>
|
||||
Order book entry
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:CryptoExchange.Net.OrderBook.OrderBookEntry.Quantity">
|
||||
<summary>
|
||||
Quantity of the entry
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:CryptoExchange.Net.OrderBook.OrderBookEntry.Price">
|
||||
<summary>
|
||||
Price of the entry
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:CryptoExchange.Net.OrderBook.OrderBookEntry.#ctor(System.Decimal,System.Decimal)">
|
||||
<summary>
|
||||
ctor
|
||||
</summary>
|
||||
<param name="price"></param>
|
||||
<param name="quantity"></param>
|
||||
</member>
|
||||
<member name="T:CryptoExchange.Net.OrderBook.ProcessBufferEntry">
|
||||
<summary>
|
||||
Buffer entry for order book
|
||||
@ -1674,38 +1659,16 @@
|
||||
The last sequence number of the entries
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:CryptoExchange.Net.OrderBook.ProcessBufferEntry.Entries">
|
||||
<member name="P:CryptoExchange.Net.OrderBook.ProcessBufferEntry.Asks">
|
||||
<summary>
|
||||
List of entries
|
||||
List of asks
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:CryptoExchange.Net.OrderBook.ProcessBufferEntry.#ctor">
|
||||
<member name="P:CryptoExchange.Net.OrderBook.ProcessBufferEntry.Bids">
|
||||
<summary>
|
||||
ctor
|
||||
List of bids
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:CryptoExchange.Net.OrderBook.ProcessEntry">
|
||||
<summary>
|
||||
Process entry for order book
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:CryptoExchange.Net.OrderBook.ProcessEntry.Entry">
|
||||
<summary>
|
||||
The entry
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:CryptoExchange.Net.OrderBook.ProcessEntry.Type">
|
||||
<summary>
|
||||
The type
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:CryptoExchange.Net.OrderBook.ProcessEntry.#ctor(CryptoExchange.Net.Objects.OrderBookEntryType,CryptoExchange.Net.Interfaces.ISymbolOrderBookEntry)">
|
||||
<summary>
|
||||
ctor
|
||||
</summary>
|
||||
<param name="type"></param>
|
||||
<param name="entry"></param>
|
||||
</member>
|
||||
<member name="T:CryptoExchange.Net.OrderBook.SymbolOrderBook">
|
||||
<summary>
|
||||
Base for order book implementations
|
||||
@ -1758,7 +1721,7 @@
|
||||
</member>
|
||||
<member name="E:CryptoExchange.Net.OrderBook.SymbolOrderBook.OnOrderBookUpdate">
|
||||
<summary>
|
||||
Event when order book was updated. Be careful! It can generate a lot of events at high-liquidity markets
|
||||
Event when order book was updated, containing the changed bids and asks. Be careful! It can generate a lot of events at high-liquidity markets
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:CryptoExchange.Net.OrderBook.SymbolOrderBook.LastOrderBookUpdate">
|
||||
@ -1852,13 +1815,14 @@
|
||||
<param name="askList">List of asks</param>
|
||||
<param name="bidList">List of bids</param>
|
||||
</member>
|
||||
<member name="M:CryptoExchange.Net.OrderBook.SymbolOrderBook.UpdateOrderBook(System.Int64,System.Int64,System.Collections.Generic.List{CryptoExchange.Net.OrderBook.ProcessEntry})">
|
||||
<member name="M:CryptoExchange.Net.OrderBook.SymbolOrderBook.UpdateOrderBook(System.Int64,System.Int64,System.Collections.Generic.IEnumerable{CryptoExchange.Net.Interfaces.ISymbolOrderBookEntry},System.Collections.Generic.IEnumerable{CryptoExchange.Net.Interfaces.ISymbolOrderBookEntry})">
|
||||
<summary>
|
||||
Update the order book with entries
|
||||
</summary>
|
||||
<param name="firstSequenceNumber">First sequence number</param>
|
||||
<param name="lastSequenceNumber">Last sequence number</param>
|
||||
<param name="entries">List of entries</param>
|
||||
<param name="bids">List of bids</param>
|
||||
<param name="asks">List of asks</param>
|
||||
</member>
|
||||
<member name="M:CryptoExchange.Net.OrderBook.SymbolOrderBook.CheckProcessBuffer">
|
||||
<summary>
|
||||
|
@ -262,6 +262,17 @@ namespace CryptoExchange.Net
|
||||
if (value == null)
|
||||
throw new ArgumentException($"No value provided for parameter {argumentName}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validates a list is not null or empty
|
||||
/// </summary>
|
||||
/// <param name="value">The value of the object</param>
|
||||
/// <param name="argumentName">Name of the parameter</param>
|
||||
public static void ValidateNotNull<T>(this IEnumerable<T> value, string argumentName)
|
||||
{
|
||||
if (value == null || !value.Any())
|
||||
throw new ArgumentException($"No values provided for parameter {argumentName}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@ namespace CryptoExchange.Net.Interfaces
|
||||
/// <summary>
|
||||
/// Event when order book was updated. Be careful! It can generate a lot of events at high-liquidity markets
|
||||
/// </summary>
|
||||
event Action OnOrderBookUpdate;
|
||||
event Action<IEnumerable<ISymbolOrderBookEntry>, IEnumerable<ISymbolOrderBookEntry>> OnOrderBookUpdate;
|
||||
/// <summary>
|
||||
/// Timestamp of the last update
|
||||
/// </summary>
|
||||
|
@ -1,30 +0,0 @@
|
||||
using CryptoExchange.Net.Interfaces;
|
||||
|
||||
namespace CryptoExchange.Net.OrderBook
|
||||
{
|
||||
/// <summary>
|
||||
/// Order book entry
|
||||
/// </summary>
|
||||
public class OrderBookEntry : ISymbolOrderBookEntry
|
||||
{
|
||||
/// <summary>
|
||||
/// Quantity of the entry
|
||||
/// </summary>
|
||||
public decimal Quantity { get; set; }
|
||||
/// <summary>
|
||||
/// Price of the entry
|
||||
/// </summary>
|
||||
public decimal Price { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// </summary>
|
||||
/// <param name="price"></param>
|
||||
/// <param name="quantity"></param>
|
||||
public OrderBookEntry(decimal price, decimal quantity)
|
||||
{
|
||||
Quantity = quantity;
|
||||
Price = price;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using CryptoExchange.Net.Interfaces;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace CryptoExchange.Net.OrderBook
|
||||
{
|
||||
@ -16,16 +17,12 @@ namespace CryptoExchange.Net.OrderBook
|
||||
/// </summary>
|
||||
public long LastSequence { get; set; }
|
||||
/// <summary>
|
||||
/// List of entries
|
||||
/// List of asks
|
||||
/// </summary>
|
||||
public List<ProcessEntry> Entries { get; set; }
|
||||
|
||||
public IEnumerable<ISymbolOrderBookEntry> Asks { get; set; } = new List<ISymbolOrderBookEntry>();
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// List of bids
|
||||
/// </summary>
|
||||
public ProcessBufferEntry()
|
||||
{
|
||||
Entries = new List<ProcessEntry>();
|
||||
}
|
||||
public IEnumerable<ISymbolOrderBookEntry> Bids { get; set; } = new List<ISymbolOrderBookEntry>();
|
||||
}
|
||||
}
|
||||
|
@ -1,31 +0,0 @@
|
||||
using CryptoExchange.Net.Interfaces;
|
||||
using CryptoExchange.Net.Objects;
|
||||
|
||||
namespace CryptoExchange.Net.OrderBook
|
||||
{
|
||||
/// <summary>
|
||||
/// Process entry for order book
|
||||
/// </summary>
|
||||
public class ProcessEntry
|
||||
{
|
||||
/// <summary>
|
||||
/// The entry
|
||||
/// </summary>
|
||||
public ISymbolOrderBookEntry Entry { get; set; }
|
||||
/// <summary>
|
||||
/// The type
|
||||
/// </summary>
|
||||
public OrderBookEntryType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="entry"></param>
|
||||
public ProcessEntry(OrderBookEntryType type, ISymbolOrderBookEntry entry)
|
||||
{
|
||||
Type = type;
|
||||
Entry = entry;
|
||||
}
|
||||
}
|
||||
}
|
@ -77,9 +77,9 @@ namespace CryptoExchange.Net.OrderBook
|
||||
/// </summary>
|
||||
public 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
|
||||
/// Event when order book was updated, containing the changed bids and asks. Be careful! It can generate a lot of events at high-liquidity markets
|
||||
/// </summary>
|
||||
public event Action? OnOrderBookUpdate;
|
||||
public event Action<IEnumerable<ISymbolOrderBookEntry>, IEnumerable<ISymbolOrderBookEntry>>? OnOrderBookUpdate;
|
||||
/// <summary>
|
||||
/// Timestamp of the last update
|
||||
/// </summary>
|
||||
@ -268,10 +268,10 @@ namespace CryptoExchange.Net.OrderBook
|
||||
|
||||
asks.Clear();
|
||||
foreach (var ask in askList)
|
||||
asks.Add(ask.Price, new OrderBookEntry(ask.Price, ask.Quantity));
|
||||
asks.Add(ask.Price, ask);
|
||||
bids.Clear();
|
||||
foreach (var bid in bidList)
|
||||
bids.Add(bid.Price, new OrderBookEntry(bid.Price, bid.Quantity));
|
||||
bids.Add(bid.Price, bid);
|
||||
|
||||
LastSequenceNumber = orderBookSequenceNumber;
|
||||
|
||||
@ -281,7 +281,7 @@ namespace CryptoExchange.Net.OrderBook
|
||||
CheckProcessBuffer();
|
||||
bookSet = true;
|
||||
LastOrderBookUpdate = DateTime.UtcNow;
|
||||
OnOrderBookUpdate?.Invoke();
|
||||
OnOrderBookUpdate?.Invoke(bidList, askList);
|
||||
log.Write(LogVerbosity.Debug, $"{Id} order book {Symbol} data set: {BidCount} bids, {AskCount} asks");
|
||||
}
|
||||
}
|
||||
@ -291,8 +291,9 @@ namespace CryptoExchange.Net.OrderBook
|
||||
/// </summary>
|
||||
/// <param name="firstSequenceNumber">First sequence number</param>
|
||||
/// <param name="lastSequenceNumber">Last sequence number</param>
|
||||
/// <param name="entries">List of entries</param>
|
||||
protected void UpdateOrderBook(long firstSequenceNumber, long lastSequenceNumber, List<ProcessEntry> entries)
|
||||
/// <param name="bids">List of bids</param>
|
||||
/// <param name="asks">List of asks</param>
|
||||
protected void UpdateOrderBook(long firstSequenceNumber, long lastSequenceNumber, IEnumerable<ISymbolOrderBookEntry> bids, IEnumerable<ISymbolOrderBookEntry> asks)
|
||||
{
|
||||
lock (bookLock)
|
||||
{
|
||||
@ -305,7 +306,8 @@ namespace CryptoExchange.Net.OrderBook
|
||||
{
|
||||
FirstSequence = firstSequenceNumber,
|
||||
LastSequence = lastSequenceNumber,
|
||||
Entries = entries
|
||||
Asks = asks,
|
||||
Bids = bids
|
||||
};
|
||||
processBuffer.Add(entry);
|
||||
log.Write(LogVerbosity.Debug, $"{Id} order book {Symbol} update before synced; buffering");
|
||||
@ -318,13 +320,15 @@ namespace CryptoExchange.Net.OrderBook
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var entry in entries)
|
||||
ProcessUpdate(entry.Type, entry.Entry);
|
||||
foreach (var entry in asks)
|
||||
ProcessUpdate(OrderBookEntryType.Ask, entry);
|
||||
foreach (var entry in bids)
|
||||
ProcessUpdate(OrderBookEntryType.Bid, entry);
|
||||
LastSequenceNumber = lastSequenceNumber;
|
||||
CheckProcessBuffer();
|
||||
LastOrderBookUpdate = DateTime.UtcNow;
|
||||
OnOrderBookUpdate?.Invoke();
|
||||
log.Write(LogVerbosity.Debug, $"{Id} order book {Symbol} update: {entries.Count} entries processed");
|
||||
OnOrderBookUpdate?.Invoke(bids, asks);
|
||||
log.Write(LogVerbosity.Debug, $"{Id} order book {Symbol} update: {asks.Count()} asks, {bids.Count()} bids processed");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -345,8 +349,11 @@ namespace CryptoExchange.Net.OrderBook
|
||||
if (bufferEntry.FirstSequence > LastSequenceNumber + 1)
|
||||
break;
|
||||
|
||||
foreach (var entry in bufferEntry.Entries)
|
||||
ProcessUpdate(entry.Type, entry.Entry);
|
||||
foreach (var entry in bufferEntry.Asks)
|
||||
ProcessUpdate(OrderBookEntryType.Ask, entry);
|
||||
foreach (var entry in bufferEntry.Bids)
|
||||
ProcessUpdate(OrderBookEntryType.Bid, entry);
|
||||
|
||||
processBuffer.Remove(bufferEntry);
|
||||
LastSequenceNumber = bufferEntry.LastSequence;
|
||||
}
|
||||
@ -373,7 +380,7 @@ namespace CryptoExchange.Net.OrderBook
|
||||
{
|
||||
if (!listToChange.ContainsKey(entry.Price))
|
||||
{
|
||||
listToChange.Add(entry.Price, new OrderBookEntry(entry.Price, entry.Quantity));
|
||||
listToChange.Add(entry.Price, entry);
|
||||
if (type == OrderBookEntryType.Ask) AskCount++;
|
||||
else BidCount++;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user