Releases: SlickQuant/slick-ladder
Releases · SlickQuant/slick-ladder
Release list
Release v0.2.0
[0.2.0] - 2026-04-09
Added
displayTickSizeconfig option (price level aggregation): WhendisplayTickSize > tickSize, the ladder aggregates raw price levels into coarser display buckets before rendering. Quantities and order counts are summed;hasOwnOrdersandisDirtyare OR'd across merged levels.- Web (
aggregation.ts): PurebucketPrice,aggregateLevels,remapDirtyChangesutilities applied inmain.tsandwasm-adapter.tsat snapshot time — raw data stores are unchanged - Desktop (
PriceLadderViewModel.cs):AggregateLevelsapplied inOnSnapshotReadybefore the snapshot reaches the renderer;ViewportManager.DisplayTickSizedrives the price grid step size PriceLadder.updateConfig({ displayTickSize })live-updates aggregation without recreating the ladder (web)- Bids bucket with
Math.floor, asks withMath.ceil— prevents bid and ask from collapsing into the same row when the spread straddles a bucket boundary - Demo controls added to Web, WPF, and Avalonia demos (Display Tick Size dropdown with options: same as tick size, 0.05, 0.10, 0.25, 0.50, 1.00, 5.00)
- Web (
Fixed
- Show Empty Rows + aggregation (desktop): The show-empty-rows price grid was generated at raw
tickSizeintervals even whendisplayTickSizewas set coarser. Empty rows now step atdisplayTickSizeintervals, matching web behaviour.
Release v0.1.8
[0.1.8] - 2026-04-06
Added
hasOwnOrdershighlighting in PriceLevel mode: When aBookLevelhashasOwnOrders = true, the quantity cell is highlighted with a 2px gold border (#ffd700) — consistent with the existing MBO own-order highlight style- Web (
canvas-renderer.ts):strokeRecton bid/ask quantity cell whenlevel.hasOwnOrdersis true - Desktop (
SkiaRenderer.cs):DrawRectwith_ownOrderBorderPainton bid/ask quantity cell whenlevel.HasOwnOrdersis true
- Web (
- Own-order flag preservation:
hasOwnOrders/HasOwnOrdersis now preserved across market data updates (previously reset tofalseon every update)- Web:
processUpdate()inmain.tscarries the flag forward from the existing level - Desktop:
OrderBook.UpdateLevel()preserves the flag from the existing level in the sorted array
- Web:
setHasOwnOrders/SetHasOwnOrdersAPI:- Web (
PriceLadder):setHasOwnOrders(price, side, value)mutates the level in the local bid/ask map - Web (
WasmPriceLadder): overrides with an overlay map applied to every WASM snapshot, so the flag survives worker-driven updates - Desktop (
PriceLadderCore):SetHasOwnOrders(price, side, value)updates theOrderBookand immediately emits a fresh snapshot viaUpdateBatcher.EmitCurrentSnapshot()
- Web (
- Demo: click-to-mark own order (Web, WPF, Avalonia): clicking the bid/ask quantity cell of a price level, after closing the confirmation pop-up, marks that level with
hasOwnOrders = true; a random timer (2–8 s) then clears the flag to simulate order removal
Changed
- Renamed
onTradetoOnLevelClick. RenamedTradeRequesttoLevelClickEventArgs
Release v0.1.7
[0.1.7] - 2026-03-30
Fixed
- Inverted trade side on click: Clicking the BID quantity column now correctly fires
Side.BID(BUY) and ASK column firesSide.ASK(SELL) — was reversed across all platforms (Web, WPF, Avalonia) - Empty row clicks now invoke
onTrade: Clicking a quantity column on an empty row previously silently returned; now fires the callback withprice = nullso consumers can handle it explicitlyTradeRequest.Priceis nowdecimal?in C#;onTradesignature is(price: number | null, side: Side)in TypeScript
screenXToColumnignores dynamic column widths: Fixed hit detection to use actual pixel positions of bid/ask quantity columns instead of a fixedMath.floor(x / COL_WIDTH)calculation
Release v0.1.6
[0.1.6] - 2026-03-25
Fixed
- RemoveRow mode structural changes: Simplified rendering logic for add/remove operations to ensure correctness
- Structural changes (add/remove levels) now trigger full redraw instead of complex incremental dirty tracking
- Fixes stale rendering when levels are added (e.g., new limit order) or removed (e.g., market order fills)
- Fixes duplicate price levels appearing after partial fills until scroll
- Removed complex
estimateRowForRemovedLevellogic in favor of reliable full redraw approach - Full redraws are still very fast (< 1ms) and only triggered on structural changes, not quantity updates
- Added dirty change deduplication to prevent duplicate processing within same frame
- Added explicit sorting after deduplication in
buildDensePackingLayoutto ensure correct price ordering - Fixed off-by-one error in
markRowDirtybounds check (rowIndex >= visibleRowsinstead of>) - Synchronized across TypeScript (
canvas-renderer.ts) and C# (SkiaRenderer.cs) renderers
Release v0.1.5
[0.1.5] - 2026-03-25
Fixed
- RemoveRow mode stale rendering: Fixed critical bug where rows below a removed level weren't redrawn, causing stale data to display until scroll
- When a level is removed (e.g., fully consumed by market order), all rows below now properly shift up and redraw immediately
- Added
estimateRowForRemovedLevelhelper function to calculate affected row range after level removals - Structural changes (add/remove) now correctly mark all impacted rows as dirty for incremental redraw
- Synchronized fix across both TypeScript (
canvas-renderer.ts) and C# (SkiaRenderer.cs) renderers
Release v0.1.4
[0.1.4] - 2026-03-24
Fixed
- RemoveRow mode duplicate levels: Fixed rendering bug where duplicate price levels could appear after partial fills in MBO mode (e.g., same price showing both old and new quantities)
- Added deduplication logic in both TypeScript and C# renderers to ensure only one row per price level
- MBO manager now includes defensive duplicate detection with console warnings
Release v0.1.3
[0.1.3] - 2026-03-22
Added
- Dynamic column auto-sizing: Price and quantity columns now automatically resize based on content across all platforms (Web, WPF, Avalonia)
- Min Quantity Threshold: Configurable threshold with visual indicator - quantities below threshold display as
<0.0001 - Decimal quantity support: Full decimal precision support with smart formatting based on threshold value
- Min Quantity Threshold and MBO Order Filter controls in all demo applications
Fixed
- Avalonia demo input controls: Improved hover/focus visibility with light background colors
- Cross-platform consistency: Synchronized decimal formatting between TypeScript and C# implementations
Release v0.1.2
[0.1.2] - 2026-03-21
Added
- Shift+Wheel zoom and Mouse Drag horizontal scroll interaction features
- Dynamic zoom scale functionality
- MBO order size filter capability
removalModeconfiguration option inPriceLadderConfigfor web implementation
Changed
- Exposed MBO order filter in demo applications
removalModecan now be set during PriceLadder initialization via config- Updated README.md documentation with
removalModeandmboOrderSizeFilteroptions
Release v0.1.1
[0.1.1] - 2026-01-17
Added
- GitHub Action release workflow
- Added CHANGELOG.md
Changed
- Updated NPM release command for public access publishing
Fixed
- Preparation for npm publishing
Release v0.1.0
Initial Release
- Ultra-low latency price ladder component with dual rendering modes (TypeScript Canvas & WASM)
- Market-by-Order (MBO) support across all platforms (Web, WPF, Avalonia)
- Configurable tick size for both Web and Desktop implementations
- Click-to-trade functionality
- Own order marking/highlighting feature
- Volume bar visualization for bid/ask quantities
- Dirty row optimization for efficient partial redraws
- Debug overlay for dirty row visualization