Skip to content

Releases: SlickQuant/slick-ladder

Release v0.2.0

Choose a tag to compare

@github-actions github-actions released this 10 Apr 00:23

[0.2.0] - 2026-04-09

Added

  • displayTickSize config option (price level aggregation): When displayTickSize > tickSize, the ladder aggregates raw price levels into coarser display buckets before rendering. Quantities and order counts are summed; hasOwnOrders and isDirty are OR'd across merged levels.
    • Web (aggregation.ts): Pure bucketPrice, aggregateLevels, remapDirtyChanges utilities applied in main.ts and wasm-adapter.ts at snapshot time — raw data stores are unchanged
    • Desktop (PriceLadderViewModel.cs): AggregateLevels applied in OnSnapshotReady before the snapshot reaches the renderer; ViewportManager.DisplayTickSize drives the price grid step size
    • PriceLadder.updateConfig({ displayTickSize }) live-updates aggregation without recreating the ladder (web)
    • Bids bucket with Math.floor, asks with Math.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)

Fixed

  • Show Empty Rows + aggregation (desktop): The show-empty-rows price grid was generated at raw tickSize intervals even when displayTickSize was set coarser. Empty rows now step at displayTickSize intervals, matching web behaviour.

Release v0.1.8

Choose a tag to compare

@github-actions github-actions released this 06 Apr 14:35

[0.1.8] - 2026-04-06

Added

  • hasOwnOrders highlighting in PriceLevel mode: When a BookLevel has hasOwnOrders = 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): strokeRect on bid/ask quantity cell when level.hasOwnOrders is true
    • Desktop (SkiaRenderer.cs): DrawRect with _ownOrderBorderPaint on bid/ask quantity cell when level.HasOwnOrders is true
  • Own-order flag preservation: hasOwnOrders/HasOwnOrders is now preserved across market data updates (previously reset to false on every update)
    • Web: processUpdate() in main.ts carries the flag forward from the existing level
    • Desktop: OrderBook.UpdateLevel() preserves the flag from the existing level in the sorted array
  • setHasOwnOrders / SetHasOwnOrders API:
    • 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 the OrderBook and immediately emits a fresh snapshot via UpdateBatcher.EmitCurrentSnapshot()
  • 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 onTrade to OnLevelClick. Renamed TradeRequest to LevelClickEventArgs

Release v0.1.7

Choose a tag to compare

@github-actions github-actions released this 30 Mar 16:06

[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 fires Side.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 with price = null so consumers can handle it explicitly
    • TradeRequest.Price is now decimal? in C#; onTrade signature is (price: number | null, side: Side) in TypeScript
  • screenXToColumn ignores dynamic column widths: Fixed hit detection to use actual pixel positions of bid/ask quantity columns instead of a fixed Math.floor(x / COL_WIDTH) calculation

Release v0.1.6

Choose a tag to compare

@github-actions github-actions released this 30 Mar 16:00

[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 estimateRowForRemovedLevel logic 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 buildDensePackingLayout to ensure correct price ordering
    • Fixed off-by-one error in markRowDirty bounds check (rowIndex >= visibleRows instead of >)
    • Synchronized across TypeScript (canvas-renderer.ts) and C# (SkiaRenderer.cs) renderers

Release v0.1.5

Choose a tag to compare

@github-actions github-actions released this 25 Mar 14:22

[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 estimateRowForRemovedLevel helper 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

Choose a tag to compare

@github-actions github-actions released this 25 Mar 01:33

[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

Choose a tag to compare

@github-actions github-actions released this 24 Mar 17:16

[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

Choose a tag to compare

@github-actions github-actions released this 21 Mar 23:30

[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
  • removalMode configuration option in PriceLadderConfig for web implementation

Changed

  • Exposed MBO order filter in demo applications
  • removalMode can now be set during PriceLadder initialization via config
  • Updated README.md documentation with removalMode and mboOrderSizeFilter options

Release v0.1.1

Choose a tag to compare

@github-actions github-actions released this 18 Jan 04:21

[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

Choose a tag to compare

@kzhdev kzhdev released this 18 Jan 01:06

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