System audit

What it does, and how fast it does it.

Everything on this page ships in @tradecanvas/chart 1.26.0. Frame times were measured in Chrome on a laptop with integrated graphics (Intel UHD); node scripts/bench-render.mjs in the repository runs the same scenes on yours.

Architecture: How it stays fast on an ordinary laptop. →

In numbers

18
chart types
134
built-in indicators
69
drawing tools
30
widget languages
101
style keys
114
widget feature switches
0
third-party runtime dependencies
3,000+
unit tests

Measure it on your machine

The numbers above come from our laptop. These run the same scenes in your browser, with the library you would ship. Nothing is pre-recorded.

1,000,000 bars: Canvas 2D, then WebGL

A million one-minute candles with Bollinger Bands, EMA, RSI and MACD, zoomed all the way out and panned for 150 frames, drawn first with Canvas 2D and then with WebGL 2.

Live ticks on 100,000 bars

Twenty ticks land in every frame on a chart of 100,000 bars with four indicators. Each indicator updates from the last bar instead of recalculating the series.

A 1,000-symbol price board

bo-grid with 1,000 symbols patched 50 times a second. Every changed cell flashes, and only those cells repaint.

WebGL 2, with Canvas 2D underneath

  • renderer: 'webgl' draws the plot on the GPU: candles, volume, indicator lines and fills, the depth heatmap. Text stays on a Canvas 2D layer above it. 'auto' picks WebGL wherever WebGL 2 is available.
  • Where WebGL 2 is missing, or its context is lost, the same chart carries on with Canvas 2D. Nothing changes in your code.
  • Up to 8 charts on a page draw with WebGL at once (setMaxWebGLCharts); the others draw with Canvas 2D and move back to WebGL when a context frees up.
  • Candles land on the same device pixels in both renderers, so a chart looks the same whichever one draws it.

Frame time

Time to draw one frame while panning. 16.7 ms is 60 frames a second.

ChartPixel ratioCanvas 2DWebGLCanvas 2D / WebGL
1600×900, 500 candles + 4 indicators2×27.4 ms19.6 ms
1600×900, zoomed out on 200,000 bars + 4 indicators2×34.5 ms20.2 ms
1600×900, zoomed out on 1,000,000 bars + 4 indicators2×34.5 ms16.7 ms
1600×900, depth heatmap, 240 snapshots × 80 levels2×25.5 ms16.8 ms
Six charts, 500 candles and 2 indicators each2×23.5 ms17.2 ms
2560×1400, 2,000 candles + 4 indicators1×41.6 ms17.7 ms
2560×1400, 2,000 candles + 4 indicators1.5×70.8 ms17.6 ms
2560×1400, 2,000 candles + 4 indicators2×114.5 ms29.1 ms

Canvas 2D is the default. renderer: 'webgl' (or 'auto') draws the plot with WebGL 2 and falls back to Canvas 2D where WebGL 2 is missing or its context is lost.

Data path

A live tick with Bollinger Bands, EMA, RSI and MACD on 100,000 bars
~0.001 ms
The same four indicators recalculated in full on 100,000 bars
~27 ms
A line of 1,000,000 visible points, downsampled for one frame
~2.6 ms
A hover redraw (crosshair, legend)
~0.2 ms
A symbol or timeframe switch shows a loading veil only after
200 ms

Download size

Minified and gzipped, with everything it imports.

Chart, the headless API
176 KB
ChartWidget, the full interface
315 KB
The WebGL renderer, loaded on first use
18 KB

How it is checked

  • More than 3,000 unit tests across the seven packages run in CI on every pull request.
  • The WebGL renderer draws candles on the same device pixels as Canvas 2D; lines and fills differ only on a few antialiased edge pixels.
  • The WebGL renderer has been checked in Chromium, Firefox and WebKit. Without WebGL 2, or when its context is lost, the chart carries on with Canvas 2D.
  • The code examples in the docs and in the agent skill are type-checked against the real API.
  • Charts read out to screen readers and work from the keyboard; the widget reads right to left in Arabic, Hebrew and Persian.

Capabilities

Filter by area, or search by name or API.

CapabilityAreaDetails and API
Candles, OHLC bars, line, area, baseline, Heikin-Ashi, hollow candlesChart typescandlestick, bar, line, area, baseline, heikinAshi, hollowCandle
Renko, line break, Kagi, point & figure, range barsChart typesBox size or ATR, lines to break, reversal in percent or price, range per bar
Volume candles, Equivolume, HLC area, step line, line with markers, high-lowChart types18 chart types in all
The main series hiddenChart typesOnly the indicators and drawings stay
Charts for dashboardsChart typesBars (grouped, stacked, sideways), donut and pie, scatter and bubbles, histograms, calendars, correlation matrices, sector maps, counter-clock charts, sparklines, gauges, heatmaps and treemaps, waterfalls, depth, equity curves
Canvas 2D or WebGL 2Renderingrenderer: 'canvas' | 'webgl' | 'auto', setRenderer, the rendererChange event
One span per pixel column when zoomed outRenderingIndicator lines, bands and histograms below a pixel per bar
A million bars panned smoothlyRenderingWith four indicators, at a pixel ratio of 2
Depth heatmap, volume profile and market profile on the GPURenderingpushDepthSnapshot(book, time)
Several WebGL charts on a pageRenderingUp to 8 (setMaxWebGLCharts); the rest draw with Canvas 2D; back to WebGL when the context returns
Sharp at any screen scaleRenderingCandles, volume and drawings on device pixels at 100%, 125% and 200%
No third-party runtime dependenciesRenderingNothing else to install or audit
134 built-in indicatorsIndicatorsPivot points in six kinds, MA Cross, correlation with another symbol
Price sourceIndicatorsopen, high, low, hl2, hlc3, ohlc4, hlcc4
An indicator on an indicatorIndicatorsSuch as a moving average of RSI, updated on every tick
Several indicators in one pane, moved between panesIndicatorsmoveIndicatorToPane
Several of the same indicatorIndicatorsEMA 20 and EMA 50 side by side
Levels and thresholdsIndicatorsRSI 30/70, CCI ±100, saved with the layout
Last value on the axisIndicatorsOn the price axis and each pane’s axis, in the line’s colour
Panes collapsed, maximised and reorderedIndicatorsSaved with the layout
Indicator templatesIndicatorsInputs, style, levels and pane, saved and applied together
Each line’s style and visibilityIndicatorsA hidden line doesn’t stretch the scale; setIndicatorDefaults
Volume delta and CVDIndicatorsEstimated from the bars
Indicator values exportedIndicatorsCSV or JSON, one column per line
Incremental updates on live ticksIndicatorsupdate() recomputes only the forming bar
69 drawing toolsDrawing toolsLines, channels, Fibonacci, Gann, pitchforks, Elliott waves, patterns, cycles, projections
Each tool’s own settingsDrawing toolsStyle, properties and coordinates on the market’s price grid
Long and short positionsDrawing toolsRisk:reward, quantity from risk in percent or money
Alerts on a drawingDrawing toolsWhen price crosses a trend line or channel as drawn, log scale included
Order, groups and templatesDrawing toolsBring forward, send back, group, lock, hide
Notes, callouts, arrows, flags, brush, path, curveDrawing toolsFreehand and multi-point drawing
Anchored VWAP and fixed-range volume profileDrawing toolsRead the chart’s bars
Eraser, zoom box, strong magnet, keyboard shortcutsDrawing toolsAlt+T, Alt+H, Alt+J, Alt+V, Alt+C, Alt+F
Go to a date; 1D to All rangesScales and timeNo zoom-out limit
IANA time zones with daylight savingScales and timeOr the exchange’s own zone
Any timeframe, and tick barsScales and time7m, 90m, 2d built from what the feed serves; 100T from its trades
Left and right scales; log, inverted and percent per paneScales and timeThe left scale for an overlay or a copy of the price scale
Compare symbols, spread and ratioScales and timeOn their own scale or pane, matched by time
Extended hoursScales and timeFrom the symbol’s session hours
Price and time formatsScales and timepriceFormat as a function or fractions such as 1/32; timeFormatter
The scale in the symbol’s decimals and price stepScales and timepricePrecision, minTick: a stock that moves in 10 never shows 21,705
High and low lines, bid and askScales and timeBid and ask from the feed’s ticks
Event marks on the chartScales and timesignalMarkerHover, signalMarkerClick
Ready-made feeds and your ownData and realtimeBinance, Bybit, Coinbase, Kraken, mock; WebSocketAdapter, PollingAdapter
Older history loaded while scrolling leftData and realtimefetchHistoryBefore
Symbol search with detailsData and realtimesearchSymbols, resolveSymbol: decimals, price step, sessions, time zone
Symbol details learned after connectingData and realtimeThe adapter’s symbolInfo event
Depth-of-market ladderData and realtimeBid and ask size by price; click to trade
Live quotes for watchlistsData and realtimesubscribeQuotes, setQuotes, getQuote
News and market statusData and realtimefetchNews; a countdown to the open or close
Exchange rulesData and realtimesetMarket: steps by price band, daily ceiling and floor, lots, sessions; HOSE, HNX, UPCoM and VN30 futures
Orders and positions on the chartTradingDrag to modify; cancel, close and reverse from the line
Fill marksTradingReason and profit or loss in executionFill
Order ticketTradingQuantity, type, stop-loss and take-profit, time in force, checked as you type; the exchange’s price step, ceiling, floor and lots
Account panelTradingPositions with live profit and loss, working orders, fills
Signals and trade zonesTradingmarkers.*, tradeZones.* style keys
Backtesting and risk metricsTrading@tradecanvas/analytics: commission, slippage, Sharpe, Sortino, Calmar, drawdown
Alerts beyond a price levelAlerts and replayLine crossing line, a move of N% in N bars, on bar close, with expiry
Bar replay in finer stepsAlerts and replayA larger timeframe replayed from smaller bars
Paper trading on a replayAlerts and replayOrders filled at the replayed prices
Replay across a grid of chartsAlerts and replayKept in step
Replay for applicationsAlerts and replaystartTime, hideHistory, duration, marks revealed as it plays, replayComplete
A grid of synchronised widgetsWorkspaceUp to 6, sharing symbol, timeframe, crosshair, time and drawings
Named layouts on your own storageWorkspaceSave, open, rename, autosave; LayoutStorage for a server
Undo and redo for everythingWorkspaceDrawings, indicators, settings and chart type; recordUndo
Context menus by areaWorkspaceDrawings, plot, panes, price axis, time axis
WatchlistsWorkspaceSeveral lists, reordered by dragging
Events for the hostWorkspacesymbolChange, timeframeChange, ordersChange, executionFill, styleChange and more
Three looks for the widgetCustomizationStudio, Terminal, Capsule; ui and setUI; --tcw-* CSS variables
The chart’s look by keyCustomizationapplyOverrides over 101 typed keys, on a host layer and a user layer
Settings that reach every keyCustomizationA style tab for the chart type on view, a trading tab
112 feature switchesCustomizationfeatures, setFeatures, isFeatureOn; changed while running
Your own parts in the widgetCustomizationToolbar buttons and dropdowns, sidebar buttons, status items, slots, menu items
Your own shortcutsCustomizationaddHotkey by the keyboard layout
The widget in 30 languagesLanguages and accessArabic, Hebrew and Persian right to left
Screen readers and the keyboardLanguages and accessA chart summary, bars read one by one, dialogs by keyboard
This site and its docs in four languagesLanguages and accessEnglish, Tiếng Việt, 한국어, 日本語
React, Vue and Svelte componentsDevelopersReactive props: overrides, indicators, features
PluginsDevelopersIndicators, drawing tools, chart types and overlays; overlayScale and getPriceStep to draw on the price grid
Docs for coding agentsDevelopersllms.txt, llms-full.txt and an agent skill

Known limits

  • Canvas 2D stays the default renderer until WebGL has been tried on more devices; its frame rate on Safari and on 5K screens has not been measured yet.
  • At a pixel ratio of 2 on a 2560×1400 chart, the browser’s compositing alone takes about 23 ms on integrated graphics, so WebGL frames there average 29 ms.
  • Tick timeframes are built from the recent trades a feed returns; older tick history cannot be loaded.
  • Volume delta and CVD are estimated from the bars, not from each trade’s side.
  • At most 8 charts on a page draw with WebGL at once; the others draw with Canvas 2D.

Building a trading screen with TradeCanvas?

We'd like to hear about it.

Get in touch