UNPKG

orderbooks

Version:

In-memory state stores and handlers for caching multiple exchange:symbol orderbook states

110 lines (109 loc) 4.54 kB
import { OrderBookLevelState } from './OrderBookLevel'; export interface OrderBookOptions { checkTimestamps?: boolean; maxDepth?: number; /** Whether to console.log when a snapshot or delta is processed */ traceLog?: boolean; } /** * Storage helper to store/track/manipulate the current state of an symbol's orderbook * @class OrderBook */ export declare class OrderBook<ExtraStateType = unknown> { symbol: string; book: OrderBookLevelState<ExtraStateType>[]; shouldCheckTimestamps: boolean; lastUpdateTimestamp: number; maxDepth: number; constructor(symbol: string, options?: OrderBookOptions); /** * Returns a cloned copy of the current orderbook state */ getBookState(): OrderBookLevelState<ExtraStateType>[]; /** * @public Process orderbook snapshot, replacing existing book in memory * @param {OrderBookLevelState[]} data current orderbook snapshot represented as array, where each child element is a level in the orderbook * @param {number} timestamp */ handleSnapshot(data: OrderBookLevelState<ExtraStateType>[], timestamp?: number): this; /** * @public Process orderbook delta change, either deleting, updating or inserting level data into the existing book. Price is used on each level to find existing index in tracked book state. * * @param {Array} [deleteDelta=[]] levels to delete * @param {Array} [upsertDelta=[]] levels to update (will automatically insert if level does not exist) * @param {Array} [insertDelta=[]] levels to insert * @param {number} timestamp */ handleDelta(deleteDelta?: OrderBookLevelState[], upsertDelta?: OrderBookLevelState[], insertDelta?: OrderBookLevelState[], timestamp?: number): this; /** * @private replace item at index, mutating existing book store */ private replaceLevelAtIndex; /** * @private insert item, mutating existing book store */ private insertLevel; /** * @private find index of level in book, using "price" property as primary key * @param {object} level * @returns {number} index of level in book, if found, else -1 */ private findIndexForSlice; /** * @public throw error if current timestamp is older than last updated timestamp * @param {number} timestamp */ checkTimestamp(timestamp: number): false | undefined; /** Sort orderbook in memory, lowest price last, highest price first */ private sort; /** trim orderbook in place to max depth, evenly across both sides */ private trimToMaxDepth; /** * Trim edges of orderbook to total target * * @param {number} [totalToTrim=0] * @param {boolean} shouldTrimTop - if true, trim from array beginning (top = sells) else from array end (bottom = buys) */ private trimSideCount; /** Track last updated timestamp */ private trackDidUpdate; /** dump orderbook state to console */ print(): this; /** empty current orderbook store to free memory */ reset(): this; /** * get lowest sell order * @param {number} [offset=0] offset from array centre (should be positive) * @returns {number} lowest seller price */ getBestAsk(offset?: number): number | null; /** * get highest buy order price * @param {number} [offset=0] offset from array centre (should be positive) * @returns {number} highest buyer price */ getBestBid(offset?: number): number | null; /** * get current bid/ask spread percentage * @param {number} [n=0] offset from centre of book * @returns {number} percentage spread between best bid & ask */ getSpreadPercent(n?: number): number | null; /** * get current bid/ask spread in basis points * @param {number} [n=0] offset from centre of book * @returns {number} spread between best bid & ask in basis points */ getSpreadBasisPoints(n?: number): number | null; /** * Calculate expected slippage for a market order of a given size * @param {number} baseOrderSize - The size of the order in base units * @param {string} side - 'Buy' or 'Sell' side of the order * @returns {{ executionPrice: number, slippagePercent: number, slippageBasisPoints: number } | null} - The expected execution price and slippage */ getEstimatedSlippage(baseOrderSize: number, side: 'Buy' | 'Sell'): { executionPrice: number; slippagePercent: number; slippageBasisPoints: number; } | null; }