From 58131765876a125a8e93238fb9f54deb3f1d89bd Mon Sep 17 00:00:00 2001 From: javier Date: Wed, 29 Apr 2026 14:17:32 +0200 Subject: [PATCH 1/4] Add ohlc_bar, depth_chart visualization functions and web console features Restructure the visualization functions page to add ohlc_bar/ohlc_bar_labels (OHLC candlestick rendering with aggregate and scalar variants) and depth_chart/depth_chart_labels (market depth profiles from bid/ask arrays). New page structure: resolution caveat at top, all six functions as separate sections with sample output, web console section covering colorizing (ohlc_bar, depth_chart) and rotation to vertical chart (bar, ohlc_bar). --- .../query/functions/visualization.md | 473 +++++++++++++++++- 1 file changed, 468 insertions(+), 5 deletions(-) diff --git a/documentation/query/functions/visualization.md b/documentation/query/functions/visualization.md index 7ddb12c67..84de3f417 100644 --- a/documentation/query/functions/visualization.md +++ b/documentation/query/functions/visualization.md @@ -6,13 +6,35 @@ description: SQL functions for rendering inline charts in query results using Un Visualization functions render numeric data as compact Unicode block charts directly in query results. The output is a `varchar` cell that works everywhere: -psql, the web console, JDBC clients, CSV exports. +psql, the web console, JDBC clients, CSV exports, ... | Function | Type | Description | | :------- | :--- | :---------- | | [bar](#bar) | Scalar | Horizontal bar proportional to a value within a range | +| [depth_chart](#depth_chart) | Scalar | Market depth profile from bid/ask volume arrays | +| [depth_chart_labels](#depth_chart_labels) | Scalar | Market depth profile with volume statistics | +| [ohlc_bar](#ohlc_bar) | Aggregate or Scalar | OHLC candlestick bar from price data or precomputed values | +| [ohlc_bar_labels](#ohlc_bar_labels) | Aggregate or Scalar | OHLC candlestick bar with labeled values | | [sparkline](#sparkline) | Aggregate | Vertical block chart of values within a group | +## Resolution and rendering + +Visualization functions render data as Unicode text characters. Each character +position represents a range of values, not a single precise point. A bar +rendered at width 40 can only distinguish 40 distinct levels across its scale +range. Values that fall within the same character-width bucket are +indistinguishable in the output. + +These functions are designed for quick visual inspection of trends, relative +magnitudes, and data structure directly in query results. They are not a +replacement for pixel-level charting tools. For precise values, query the +underlying numbers directly or use the `_labels` variants where available. + +Some monospaced fonts render Unicode characters from different blocks at +slightly different pixel widths, which can cause minor horizontal misalignment. +For best results, use a font with consistent Unicode coverage such as JetBrains +Mono, Fira Code, or Cascadia Code. + ## bar `bar(value, min, max, width)` - Renders a single numeric value as a horizontal @@ -31,6 +53,10 @@ Characters range from `▏` (1/8 fill, U+258F) to `█` (full fill, U+2588). A Since `bar` is a scalar function, it can wrap aggregates like `sum()`, `avg()`, or `count()` to visualize their results inline. +The web console can +[rotate](#rotating-to-vertical-chart) `bar` output to a vertical chart when the +query returns exactly two columns (timestamp + bar). + #### Parameters All four arguments are required: @@ -115,6 +141,371 @@ LATEST ON timestamp PARTITION BY symbol; #### See also - [sparkline](#sparkline) - Aggregate trend chart +- [Web console features](#web-console-features) - rotation to vertical chart + +## depth_chart + +`depth_chart(bid_volumes[], ask_volumes[] [, width])` - Renders a market depth +profile from bid and ask volume arrays as a single-line sparkline-style chart. +Bids appear on the left (tallest at the edges representing deepest liquidity), +asks on the right, with a spread marker (`╎`) in the center. + +See also [depth_chart_labels](#depth_chart_labels), which appends volume +statistics after the chart. + +The web console [colorizes](#colorizing) bid and ask sides in green and red. + +Characters used: + +| Purpose | Character | Code point | +| :------ | :-------- | :--------- | +| Depth levels | `▁▂▃▄▅▆▇█` | U+2581 through U+2588 | +| Spread marker | `╎` | U+254E | + +#### Parameters + +| Parameter | Type | Description | +| :-------- | :--- | :---------- | +| bid_volumes | DOUBLE[] | Per-level bid volumes, ordered best-to-worst | +| ask_volumes | DOUBLE[] | Per-level ask volumes, ordered best-to-worst | +| width | INT (optional) | Total chart width in characters. Default: array lengths + 1. Minimum: 3. | + +Arrays must be one-dimensional. They can have different lengths (asymmetric +books are valid). + +#### Return value + +Return value type is `varchar`. + +#### How scaling works + +The function computes cumulative sums from each array, then applies `log1p()` to +compress the dynamic range. This is necessary because cumulative depth grows +exponentially - without log scale, only the deepest levels would be visible and +all near-spread levels would appear as the lowest character. + +The log-scaled values are mapped to sparkline characters (`▁` through `█`) +relative to the global min/max across both sides. + +#### Width behavior + +- **Default**: one character per array element plus the spread marker. A 30-level + book on each side produces a 61-character chart. +- **Explicit width**: the cumulative curve is subsampled if the width is smaller + than the arrays. If the width is larger, remaining positions are padded with + `▁` on the far sides (bids pad on the left, asks pad on the right), keeping + real data adjacent to the spread. + +#### NULL handling + +- NULL or empty arrays return NULL +- Non-finite elements (NaN, Infinity) throw an error +- Negative volumes throw an error +- Zero volumes are valid and render as `▁` + +#### Examples + +```questdb-sql demo title="Latest depth for multiple symbols" +SELECT timestamp, symbol, + depth_chart(bids[2], asks[2]) +FROM market_data +WHERE timestamp IN '$today' + AND symbol IN ('EURUSD', 'GBPUSD', + 'USDJPY', 'USDCAD', 'USDCHF') +LATEST ON timestamp PARTITION BY symbol; +``` + +| timestamp | symbol | depth_chart | +| :-------- | :----- | :---------- | +| 2026-04-29T12:11:46.703189Z | USDCAD | █▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▄▄▄▄▄▃▃▃▃▃▂▂▁▁╎▁▁▂▂▂▃▃▃▃▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇ | +| 2026-04-29T12:11:47.128542Z | USDJPY | ▇▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▄▄▄▄▄▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▄▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇█ | +| 2026-04-29T12:11:47.139327Z | USDCHF | ▇▇▇▇▇▆▆▆▆▆▅▅▅▅▄▄▄▄▄▃▃▃▃▂▂▁▁╎▁▁▂▂▂▃▃▃▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇█ | +| 2026-04-29T12:11:47.188192Z | GBPUSD | ▇▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇█ | +| 2026-04-29T12:11:47.189339Z | EURUSD | ▇▇▆▅▃▁╎▁▃▅▆▇█ | + +Each symbol has a different number of depth levels. The chart width adjusts +automatically. Symmetric shapes indicate balanced books; one side taller than the +other indicates a liquidity imbalance. + +```questdb-sql demo title="Fixed-width comparison" +SELECT symbol, + depth_chart(bids[2], asks[2], 21) +FROM market_data +WHERE timestamp IN '$today' + AND symbol IN ('EURUSD', 'GBPUSD', + 'USDJPY') +LATEST ON timestamp PARTITION BY symbol; +``` + +| symbol | depth_chart | +| :----- | :---------- | +| EURUSD | ▇▇▆▅▅▄▃▃▂▁╎▁▂▃▃▄▅▅▆▇█ | +| GBPUSD | ▇▇▆▆▅▄▄▃▂▁╎▁▂▃▄▄▅▆▆▇█ | +| USDJPY | ▁▁▁▁█▇▇▇▇▆╎▆▇▇▇▇▇▁▁▁▁ | + +At a fixed width, books with different numbers of levels are directly +comparable. The shape reveals structural differences: USDJPY shows an unusual +profile with thin liquidity near the spread and heavy volume at the edges. + +#### See also + +- [depth_chart_labels](#depth_chart_labels) - same chart with volume statistics +- [sparkline](#sparkline) - for time-series trends rather than point-in-time depth +- [Web console features](#web-console-features) - colorizing of bid/ask sides + +## depth_chart_labels + +`depth_chart_labels(bid_volumes[], ask_volumes[] [, width])` - Identical to +[depth_chart](#depth_chart) but appends volume statistics after the chart: +`bb: ba: tb: ta:`. + +Labels show: + +- `bb` - best bid volume (first element of bid array) +- `ba` - best ask volume (first element of ask array) +- `tb` - total bid volume (sum of all bid levels) +- `ta` - total ask volume (sum of all ask levels) + +See [depth_chart](#depth_chart) for parameters, scaling behavior, and additional +examples. + +#### Examples + +```questdb-sql demo title="Depth with volume labels" +SELECT timestamp, symbol, + depth_chart_labels(bids[2], asks[2]) +FROM market_data +WHERE timestamp IN '$today' + AND symbol IN ('EURUSD', 'GBPUSD') +LATEST ON timestamp PARTITION BY symbol; +``` + +| timestamp | symbol | depth_chart_labels | +| :-------- | :----- | :----------------- | +| 2026-04-29T12:11:47.188192Z | GBPUSD | ▇▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇█ bb:61656.0 ba:93520.0 tb:6.33657709E8 ta:6.7937576E8 | +| 2026-04-29T12:11:47.189339Z | EURUSD | ▇▇▆▅▃▁╎▁▃▅▆▇█ bb:55648.0 ba:70550.0 tb:973577.0 ta:1009598.0 | + +#### See also + +- [depth_chart](#depth_chart) - same chart without labels +- [Web console features](#web-console-features) - colorizing of bid/ask sides + +## ohlc_bar + +Renders OHLC (Open, High, Low, Close) candlestick data as horizontal Unicode +bars. Each row produces a text candlestick showing wick (high-low range) and +body (open-close range), directly in query results. + +See also [ohlc_bar_labels](#ohlc_bar_labels), which appends OHLC values after the +bar. + +The web console [colorizes](#colorizing) bullish bodies green and bearish bodies +red, and can [rotate](#rotating-to-vertical-chart) the output to a vertical +candlestick chart. + +Visual encoding: + +| Purpose | Character | Code point | +| :------ | :-------- | :--------- | +| Blank (padding) | `⠀` | U+2800 | +| Wick | `─` | U+2500 | +| Bullish body (close >= open) | `█` | U+2588 | +| Bearish body (close < open) | `░` | U+2591 | +| Doji (close == open at bar resolution) | `│` | U+2502 | + +All candles in a result set are scaled against the same min/max bounds, so their +horizontal positions are directly comparable across rows. + +### Aggregate variant + +`ohlc_bar(price, min, max [, width])` - A GROUP BY / SAMPLE BY aggregate. +Computes Open (first value by row order), High (max), Low (min), and Close (last +value by row order) from raw price observations within each group. Renders using +the supplied min/max bounds for scaling. + +**When to use:** raw tick or trade data where you want OHLC candles computed and +rendered in one step with SAMPLE BY. + +#### Parameters + +| Parameter | Type | Description | +| :-------- | :--- | :---------- | +| price | DOUBLE | Value column to aggregate into OHLC | +| min | DOUBLE | Lower bound for scaling (left edge of bar) | +| max | DOUBLE | Upper bound for scaling (right edge of bar) | +| width | INT (optional) | Bar width in characters, default 40 | + +The min and max parameters accept column references, lateral join results, +constants, and bind variables. + +#### Bounds + +Both variants require explicit min and max bounds for scaling. These bounds +define what price maps to the left edge (position 0) and what price maps to the +right edge (position width-1). + +The bounds are not auto-computed from the data. This is deliberate: +auto-computing global bounds inside an aggregate function would be +non-deterministic in QuestDB's parallel execution engine. + +Common patterns for supplying bounds: + +- **Constants or DECLARE variables** for known price ranges +- **CROSS JOIN subquery** for single-symbol dynamic bounds +- **LATERAL JOIN** for per-symbol bounds in multi-symbol queries + +#### FILL support + +The aggregate variant supports `FILL(NULL)`, `FILL(PREV)`, and `FILL(NONE)`. +`FILL(LINEAR)` is not supported (interpolating OHLC is undefined). + +#### Examples + +```questdb-sql demo title="OHLC candles with dynamic bounds" +SELECT timestamp, + ohlc_bar(price, lo, hi, 50) +FROM fx_trades +CROSS JOIN ( + SELECT min(price) lo, max(price) hi + FROM fx_trades + WHERE symbol = 'EURUSD' +) +WHERE symbol = 'EURUSD' +SAMPLE BY 1h +LIMIT -10; +``` + +| timestamp | ohlc_bar | +| :-------- | :------- | +| 2026-01-27T00:00:00.000000Z | ⠀⠀⠀───────────────────────███──────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | +| 2026-01-27T01:00:00.000000Z | ⠀⠀⠀⠀───────────░░░░░░░░░░░░░────────────────⠀⠀⠀⠀⠀⠀ | +| 2026-01-27T02:00:00.000000Z | ──────░░░░░░░░░░░░░░░░░░────────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | +| 2026-01-27T03:00:00.000000Z | ────░░░───────────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | +| 2026-01-27T04:00:00.000000Z | ───██████████───────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | +| 2026-01-27T05:00:00.000000Z | ──────────███████────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | + +Bullish candles (`█`) show close above open, bearish candles (`░`) show close +below open. The wick (`─`) extends from high to low. + +```questdb-sql title="Candles with constant bounds" +DECLARE @lo := 1.05, @hi := 1.15 + +SELECT timestamp, + ohlc_bar(price, @lo, @hi, 50) +FROM fx_trades +WHERE symbol = 'EURUSD' +SAMPLE BY 30m +LIMIT -10; +``` + +### Scalar variant + +`ohlc_bar(open, high, low, close, min, max [, width])` - A per-row scalar +function. Takes precomputed OHLC values and explicit bounds. Does not +aggregate - renders one candle per input row. + +**When to use:** OHLC values are already computed (from a subquery, materialized +view, or external source) and you want to render them with precise control over +the scaling bounds. + +#### Parameters + +| Parameter | Type | Description | +| :-------- | :--- | :---------- | +| open | DOUBLE | Opening price | +| high | DOUBLE | Highest price | +| low | DOUBLE | Lowest price | +| close | DOUBLE | Closing price | +| min | DOUBLE | Lower bound for scaling (left edge) | +| max | DOUBLE | Upper bound for scaling (right edge) | +| width | INT (optional) | Bar width in characters, default 40 | + +#### Examples + +```questdb-sql demo title="Render precomputed OHLC with window bounds" +SELECT timestamp, + ohlc_bar(o, h, l, c, mn, mx, 50) +FROM ( + SELECT timestamp, o, h, l, c, + min(l) OVER () mn, + max(h) OVER () mx + FROM ( + SELECT timestamp, + first(price) o, max(price) h, + min(price) l, last(price) c + FROM fx_trades + WHERE symbol = 'EURUSD' + SAMPLE BY 1h + ) +) +LIMIT -10; +``` + +### NULL handling and validation + +**Aggregate variant:** + +- NULL price values are skipped. If all prices in a group are NULL, the result + is NULL. +- If either min or max is NULL after reconciliation, the function throws an + error. +- If `min > max`, the function throws an error. + +**Scalar variant:** + +- If any OHLC parameter (open, high, low, close) is NULL, the result is NULL. +- If either min or max is NULL, the function throws an error. +- If `low > high`, the function throws an error (catches invalid upstream data). +- If `min > max`, the function throws an error. +- Validation order: NULL check first, then `low > high`, then `min > max`. + +#### See also + +- [bar](#bar) - simpler single-value horizontal bar +- [ohlc_bar_labels](#ohlc_bar_labels) - same chart with labeled OHLC values +- [Web console features](#web-console-features) - colorizing and rotation + +## ohlc_bar_labels + +Identical to [ohlc_bar](#ohlc_bar) but appends `O: H: L: +C:` after each candlestick bar. Available in both aggregate and scalar +forms: + +- `ohlc_bar_labels(price, min, max [, width])` - aggregate +- `ohlc_bar_labels(open, high, low, close, min, max [, width])` - scalar + +See [ohlc_bar](#ohlc_bar) for parameters, bounds, FILL support, NULL handling, +and additional examples. + +#### Examples + +```questdb-sql demo title="Per-symbol candles with labels" +SELECT timestamp, symbol, + ohlc_bar_labels(price, lo, hi, 30) +FROM fx_trades t +JOIN LATERAL ( + SELECT min(price) lo, max(price) hi + FROM fx_trades t2 + WHERE t.symbol = t2.symbol +) +WHERE symbol IN ('EURUSD', 'GBPUSD') +SAMPLE BY 1h +LIMIT -10; +``` + +| timestamp | symbol | ohlc_bar_labels | +| :-------- | :----- | :-------------- | +| 2026-01-27T00:00:00.000000Z | EURUSD | ⠀⠀─────────────██────⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1982 H:1.2025 L:1.1864 C:1.1992 | +| 2026-01-27T01:00:00.000000Z | EURUSD | ⠀⠀───────░░░░░░░░─────────⠀⠀⠀⠀ O:1.1987 H:1.207 L:1.1868 C:1.1927 | +| 2026-01-27T02:00:00.000000Z | EURUSD | ────░░░░░░░░░░──────────⠀⠀⠀⠀⠀⠀ O:1.1966 H:1.2052 L:1.1851 C:1.1883 | +| 2026-01-27T03:00:00.000000Z | EURUSD | ──░░────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1879 H:1.1977 L:1.1851 C:1.1868 | +| 2026-01-27T04:00:00.000000Z | EURUSD | ──██████─────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1867 H:1.1987 L:1.185 C:1.191 | +| 2026-01-27T05:00:00.000000Z | EURUSD | ──────████───⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1903 H:1.1955 L:1.1851 C:1.1932 | + +#### See also + +- [ohlc_bar](#ohlc_bar) - same chart without labels +- [Web console features](#web-console-features) - colorizing and rotation ## sparkline @@ -248,10 +639,82 @@ When explicit `min`/`max` are provided, out-of-range values are clamped: reference - [SAMPLE BY](/docs/query/sql/sample-by/) - Time-series aggregation +## Web console features + +The QuestDB web console automatically detects visualization function output and +enhances the display with coloring, monospace font rendering, and an interactive +rotation feature. + +Detection is automatic: the console checks that the SQL query text contains a +visualization function call, then validates that the output column matches the +expected Unicode signature. + +### Colorizing + +The web console colorizes output from `ohlc_bar`, `ohlc_bar_labels`, +`depth_chart`, and `depth_chart_labels`. Coloring applies regardless of how many +columns the query returns. + +**OHLC coloring** (`ohlc_bar` / `ohlc_bar_labels`): + +- Bullish bodies (`█`, close >= open) are displayed in green +- Bearish bodies (`░`, close < open) are displayed in red +- Wick, doji, and padding characters remain in the default text color +- For `ohlc_bar_labels`, the label prefixes (`O:`, `H:`, `L:`, `C:`) are + displayed in orange + +**Market depth coloring** (`depth_chart` / `depth_chart_labels`): + +- Bid side (characters before the spread separator `╎`) is displayed in green +- Ask side (characters after the spread separator) is displayed in red +- The spread separator itself remains in the default text color +- For `depth_chart_labels`, the label prefixes (`bb:`, `ba:`, `tb:`, `ta:`) are + displayed in orange + +`bar` and `sparkline` output is not colorized. + +### Rotating to vertical chart + +The web console can rotate `bar` and `ohlc_bar` / `ohlc_bar_labels` output into +a vertical chart view. This feature is available when all of these conditions are +met: + +- The query result has exactly two columns +- One column is TIMESTAMP or TIMESTAMP_NS +- The other column is VARCHAR containing `bar` or `ohlc_bar` output + +When these conditions are met, a rotate icon appears at the right side of the +VARCHAR column header. Clicking it toggles between: + +- **Normal (horizontal) view**: the default grid layout. Rows are listed + vertically with bars rendered horizontally. +- **Rotated (vertical) view**: a transposed layout where time flows + left-to-right along a horizontal scroll axis, and bars are rendered + vertically, resembling a traditional candlestick or bar chart. Timestamps + appear at the bottom of each column (time in green, date in gray). OHLC + green/red coloring is preserved. + +The rotate icon turns cyan when the rotated view is active. + +The rotation state persists across consecutive queries that produce rotatable +results. If you run a query that does not meet the rotation conditions (different +functions, extra columns, or no visualization function), the state resets. + +For `ohlc_bar_labels`, labels are shown inline in normal view and as a tooltip +on hover in rotated view. + +:::note +In rotated view, `bar()` output replaces fractional block characters +(U+2589 through U+258F) with full blocks, as partial-width characters do not +render correctly when the text flow is vertical. +::: + +`depth_chart` and `sparkline` do not support rotation. + ## Configuration -Both functions enforce a maximum output size controlled by an existing server -property: +All visualization functions enforce a maximum output size controlled by an +existing server property: ```ini # server.conf @@ -263,8 +726,8 @@ Default is 1,048,576 bytes (1 MB). This is the same property used by Each output character is 3 bytes in UTF-8, so the default allows up to 349,525 characters of output. For `sparkline`, this limits the number of values -accumulated per group. For `bar`, this limits the `width` parameter. If the -limit is exceeded, the function throws a non-critical error. +accumulated per group. For `bar` and `ohlc_bar`, this limits the `width` +parameter. If the limit is exceeded, the function throws a non-critical error. In practice these limits are generous - a sparkline or bar of 349K characters would be unusable. The limit exists to prevent accidental memory exhaustion. From b8680d0e4d1e2ffa9f05a98ebf78090d6c4df8df Mon Sep 17 00:00:00 2001 From: javier Date: Wed, 29 Apr 2026 21:34:24 +0200 Subject: [PATCH 2/4] Refine visualization page structure, examples, and sample output Update SAMPLE BY intervals to 30m for richer OHLC output, add sample output blocks for all queries, use fx_trades for bar inline example, fix sparkline cross-symbol comparison with shared fixed scale, remove stale dates, and clean up Unicode code point references. --- .../query/functions/visualization.md | 391 ++++++++++++------ 1 file changed, 266 insertions(+), 125 deletions(-) diff --git a/documentation/query/functions/visualization.md b/documentation/query/functions/visualization.md index 84de3f417..c59558ae1 100644 --- a/documentation/query/functions/visualization.md +++ b/documentation/query/functions/visualization.md @@ -27,13 +27,7 @@ indistinguishable in the output. These functions are designed for quick visual inspection of trends, relative magnitudes, and data structure directly in query results. They are not a -replacement for pixel-level charting tools. For precise values, query the -underlying numbers directly or use the `_labels` variants where available. - -Some monospaced fonts render Unicode characters from different blocks at -slightly different pixel widths, which can cause minor horizontal misalignment. -For best results, use a font with consistent Unicode coverage such as JetBrains -Mono, Fira Code, or Cascadia Code. +replacement for pixel-level charting tools. ## bar @@ -44,11 +38,12 @@ for sub-character precision. Characters used (varying width): ``` -▏▎▍▌▋▊▉█ +█▉▊▋▌▍▎▏ ``` -Characters range from `▏` (1/8 fill, U+258F) to `█` (full fill, U+2588). A -`width` of 20 characters gives 160 discrete levels of resolution (20 x 8). +A full block fills the character cell; fractional blocks at the end provide +sub-character precision. A `width` of 20 characters gives 160 discrete levels +of resolution (20 x 8). Since `bar` is a scalar function, it can wrap aggregates like `sum()`, `avg()`, or `count()` to visualize their results inline. @@ -83,8 +78,19 @@ SELECT timestamp, symbol, bar(sum(amount), 0, 50, 30) FROM trades WHERE symbol IN ('BTC-USDT', 'ETH-USDT') + AND timestamp IN '$today' SAMPLE BY 1m -LIMIT -10; +LIMIT -5; +``` + +``` + timestamp | symbol | total | bar +-----------------------------+----------+--------+-------------------------------- + 2026-04-29T15:41:00.000000Z | BTC-USDT | 5.89 | ███▌ + 2026-04-29T15:42:00.000000Z | ETH-USDT | 119.54 | ██████████████████████████████ + 2026-04-29T15:42:00.000000Z | BTC-USDT | 3.53 | ██ + 2026-04-29T15:43:00.000000Z | ETH-USDT | 41.15 | ████████████████████████▋ + 2026-04-29T15:43:00.000000Z | BTC-USDT | 1.6 | ▉ ``` ```questdb-sql demo title="Per-symbol scaling with window functions" @@ -95,23 +101,21 @@ FROM ( SELECT timestamp, symbol, sum(amount) total FROM trades WHERE symbol IN ('BTC-USDT', 'ETH-USDT') + AND timestamp IN '$today' SAMPLE BY 1m ) -LIMIT -10; -``` - -| timestamp | symbol | total | bar | -| :-------------------------- | :------- | :----- | :----------------- | -| 2026-03-06T17:18:00.000000Z | ETH-USDT | 72.94 | ██ | -| 2026-03-06T17:18:00.000000Z | BTC-USDT | 6.76 | ██████ | -| 2026-03-06T17:19:00.000000Z | ETH-USDT | 118.19 | ███ | -| 2026-03-06T17:19:00.000000Z | BTC-USDT | 1.59 | █ | -| 2026-03-06T17:20:00.000000Z | ETH-USDT | 246.87 | ███████ | -| 2026-03-06T17:20:00.000000Z | BTC-USDT | 14.36 | █████████████ | -| 2026-03-06T17:21:00.000000Z | BTC-USDT | 2.9 | ██ | -| 2026-03-06T17:21:00.000000Z | ETH-USDT | 375.3 | ██████████ | -| 2026-03-06T17:22:00.000000Z | BTC-USDT | 8.07 | ███████ | -| 2026-03-06T17:22:00.000000Z | ETH-USDT | 529.74 | ███████████████ | +LIMIT -5; +``` + +``` + timestamp | symbol | total | bar +-----------------------------+----------+--------+------ + 2026-04-29T15:41:00.000000Z | ETH-USDT | 44.7 | █▍ + 2026-04-29T15:42:00.000000Z | BTC-USDT | 3.53 | █▏ + 2026-04-29T15:42:00.000000Z | ETH-USDT | 119.54 | ███▋ + 2026-04-29T15:43:00.000000Z | BTC-USDT | 1.6 | ▌ + 2026-04-29T15:43:00.000000Z | ETH-USDT | 41.15 | █▎ +``` Each symbol's bars scale independently because `PARTITION BY symbol` gives each its own min/max range. @@ -124,20 +128,43 @@ FROM ( SELECT timestamp, symbol, sum(amount) total FROM trades WHERE symbol IN ('BTC-USDT', 'ETH-USDT') + AND timestamp IN '$today' SAMPLE BY 1m ) -LIMIT -10; +LIMIT -5; +``` + +``` + timestamp | symbol | total | bar +-----------------------------+----------+--------+----- + 2026-04-29T15:41:00.000000Z | ETH-USDT | 44.7 | █▍ + 2026-04-29T15:42:00.000000Z | BTC-USDT | 3.53 | + 2026-04-29T15:42:00.000000Z | ETH-USDT | 119.54 | ███▋ + 2026-04-29T15:43:00.000000Z | BTC-USDT | 1.6 | + 2026-04-29T15:43:00.000000Z | ETH-USDT | 41.15 | █▎ ``` All symbols share the same min/max, making bars comparable across groups. ```questdb-sql demo title="Inline with row-level data" -SELECT symbol, price, - bar(price, 0, 100000, 25) -FROM trades +SELECT symbol, round(price, 4) price, + bar(price, 0.5, 1.5, 25) +FROM fx_trades +WHERE symbol IN ('EURUSD', 'GBPUSD', + 'USDCHF', 'USDCAD', 'AUDUSD') LATEST ON timestamp PARTITION BY symbol; ``` +``` + symbol | price | bar +--------+--------+------------------------ + AUDUSD | 0.7128 | █████▎ + USDCAD | 1.3708 | █████████████████████▊ + USDCHF | 0.7836 | ███████ + EURUSD | 1.1618 | ████████████████▌ + GBPUSD | 1.3417 | █████████████████████ +``` + #### See also - [sparkline](#sparkline) - Aggregate trend chart @@ -157,10 +184,10 @@ The web console [colorizes](#colorizing) bid and ask sides in green and red. Characters used: -| Purpose | Character | Code point | -| :------ | :-------- | :--------- | -| Depth levels | `▁▂▃▄▅▆▇█` | U+2581 through U+2588 | -| Spread marker | `╎` | U+254E | +| Purpose | Character | +| :------ | :-------- | +| Depth levels | `█▇▆▅▄▃▂▁▁▂▃▄▅▆▇█` | +| Spread marker | `╎` | #### Parameters @@ -215,13 +242,15 @@ WHERE timestamp IN '$today' LATEST ON timestamp PARTITION BY symbol; ``` -| timestamp | symbol | depth_chart | -| :-------- | :----- | :---------- | -| 2026-04-29T12:11:46.703189Z | USDCAD | █▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▄▄▄▄▄▃▃▃▃▃▂▂▁▁╎▁▁▂▂▂▃▃▃▃▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇ | -| 2026-04-29T12:11:47.128542Z | USDJPY | ▇▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▄▄▄▄▄▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▄▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇█ | -| 2026-04-29T12:11:47.139327Z | USDCHF | ▇▇▇▇▇▆▆▆▆▆▅▅▅▅▄▄▄▄▄▃▃▃▃▂▂▁▁╎▁▁▂▂▂▃▃▃▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇█ | -| 2026-04-29T12:11:47.188192Z | GBPUSD | ▇▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇█ | -| 2026-04-29T12:11:47.189339Z | EURUSD | ▇▇▆▅▃▁╎▁▃▅▆▇█ | +``` + timestamp | symbol | depth_chart +-----------------------------+--------+----------------------------------------------------------------------- + 2026-04-29T13:18:09.646733Z | EURUSD | █▇▇▇▇▇▆▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇▇ + 2026-04-29T13:18:09.783631Z | GBPUSD | █▇▇▇▆▆▆▆▅▅▅▄▄▄▃▃▂▂▁╎▁▂▃▃▃▄▄▄▅▅▅▆▆▆▆▇▇▇▇ + 2026-04-29T13:18:10.044379Z | USDCHF | ▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▄▄▄▄▃▃▃▃▂▂▁▁╎▁▁▂▂▃▃▃▃▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇█ + 2026-04-29T13:18:10.106524Z | USDCAD | ▇▇▇▇▆▆▆▆▅▅▅▅▄▄▄▃▃▃▂▁▁╎▁▂▂▃▃▃▄▄▄▅▅▅▅▆▆▆▇▇▇▇█ + 2026-04-29T13:18:10.159159Z | USDJPY | ▇▆▄▁╎▁▄▆█ +``` Each symbol has a different number of depth levels. The chart width adjusts automatically. Symmetric shapes indicate balanced books; one side taller than the @@ -237,11 +266,13 @@ WHERE timestamp IN '$today' LATEST ON timestamp PARTITION BY symbol; ``` -| symbol | depth_chart | -| :----- | :---------- | -| EURUSD | ▇▇▆▅▅▄▃▃▂▁╎▁▂▃▃▄▅▅▆▇█ | -| GBPUSD | ▇▇▆▆▅▄▄▃▂▁╎▁▂▃▄▄▅▆▆▇█ | -| USDJPY | ▁▁▁▁█▇▇▇▇▆╎▆▇▇▇▇▇▁▁▁▁ | +``` + symbol | depth_chart +--------+------------------------ + EURUSD | █▇▆▅▅▄▃▃▂▁╎▁▂▃▃▄▅▅▆▇▇ + GBPUSD | █▇▆▆▅▅▄▃▂▁╎▁▂▃▄▅▅▆▆▇▇ + USDJPY | ▁▁▁▁▁▁▇▇▇▆╎▆▇▇█▁▁▁▁▁▁ +``` At a fixed width, books with different numbers of levels are directly comparable. The shape reveals structural differences: USDJPY shows an unusual @@ -280,10 +311,12 @@ WHERE timestamp IN '$today' LATEST ON timestamp PARTITION BY symbol; ``` -| timestamp | symbol | depth_chart_labels | -| :-------- | :----- | :----------------- | -| 2026-04-29T12:11:47.188192Z | GBPUSD | ▇▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇█ bb:61656.0 ba:93520.0 tb:6.33657709E8 ta:6.7937576E8 | -| 2026-04-29T12:11:47.189339Z | EURUSD | ▇▇▆▅▃▁╎▁▃▅▆▇█ bb:55648.0 ba:70550.0 tb:973577.0 ta:1009598.0 | +``` + timestamp | symbol | depth_chart_labels +-----------------------------+--------+---------------------------------------------------------------------------------------------------------------------- + 2026-04-29T13:18:09.646733Z | EURUSD | █▇▇▇▇▇▆▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇▇ bb:55076.0 ba:79588.0 tb:1.044909019E9 ta:1.033808641E9 + 2026-04-29T13:18:09.783631Z | GBPUSD | █▇▇▇▆▆▆▆▅▅▅▄▄▄▃▃▂▂▁╎▁▂▃▃▃▄▄▄▅▅▅▆▆▆▆▇▇▇▇ bb:53119.0 ba:92211.0 tb:2.9577178E7 ta:2.9154932E7 +``` #### See also @@ -305,13 +338,11 @@ candlestick chart. Visual encoding: -| Purpose | Character | Code point | -| :------ | :-------- | :--------- | -| Blank (padding) | `⠀` | U+2800 | -| Wick | `─` | U+2500 | -| Bullish body (close >= open) | `█` | U+2588 | -| Bearish body (close < open) | `░` | U+2591 | -| Doji (close == open at bar resolution) | `│` | U+2502 | +``` +⠀⠀⠀───██████─────⠀⠀⠀ Bullish (close >= open): █ body, ─ wick +⠀⠀───────░░░░──⠀⠀⠀⠀ Bearish (close < open): ░ body, ─ wick +⠀⠀⠀⠀──│──⠀⠀⠀⠀⠀⠀⠀⠀ Doji (close == open): │ line, ─ wick +``` All candles in a result set are scaled against the same min/max bounds, so their horizontal positions are directly comparable across rows. @@ -350,7 +381,8 @@ non-deterministic in QuestDB's parallel execution engine. Common patterns for supplying bounds: -- **Constants or DECLARE variables** for known price ranges +- **Constants** for known price ranges +- **DECLARE variables** for parameterized queries - **CROSS JOIN subquery** for single-symbol dynamic bounds - **LATERAL JOIN** for per-symbol bounds in multi-symbol queries @@ -361,43 +393,106 @@ The aggregate variant supports `FILL(NULL)`, `FILL(PREV)`, and `FILL(NONE)`. #### Examples -```questdb-sql demo title="OHLC candles with dynamic bounds" +```questdb-sql demo title="Constant bounds" SELECT timestamp, - ohlc_bar(price, lo, hi, 50) + ohlc_bar(price, 1.15, 1.19, 40) FROM fx_trades -CROSS JOIN ( - SELECT min(price) lo, max(price) hi - FROM fx_trades - WHERE symbol = 'EURUSD' -) WHERE symbol = 'EURUSD' -SAMPLE BY 1h -LIMIT -10; + AND timestamp IN '$today' +SAMPLE BY 30m +LIMIT -5; ``` -| timestamp | ohlc_bar | -| :-------- | :------- | -| 2026-01-27T00:00:00.000000Z | ⠀⠀⠀───────────────────────███──────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | -| 2026-01-27T01:00:00.000000Z | ⠀⠀⠀⠀───────────░░░░░░░░░░░░░────────────────⠀⠀⠀⠀⠀⠀ | -| 2026-01-27T02:00:00.000000Z | ──────░░░░░░░░░░░░░░░░░░────────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | -| 2026-01-27T03:00:00.000000Z | ────░░░───────────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | -| 2026-01-27T04:00:00.000000Z | ───██████████───────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | -| 2026-01-27T05:00:00.000000Z | ──────────███████────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | +``` + timestamp | ohlc_bar +--------------------------------+------------------------------------------ + 2026-04-29T11:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀─░░░░░░░░░░░░───────────⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T11:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀──██─────────────────────⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T12:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀─███████████████───────⠀⠀⠀⠀⠀⠀ + 2026-04-29T12:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀─────░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T13:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀────██─────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +``` Bullish candles (`█`) show close above open, bearish candles (`░`) show close below open. The wick (`─`) extends from high to low. -```questdb-sql title="Candles with constant bounds" -DECLARE @lo := 1.05, @hi := 1.15 +```questdb-sql title="DECLARE variables" +DECLARE @lo := 1.15, @hi := 1.19 SELECT timestamp, - ohlc_bar(price, @lo, @hi, 50) + ohlc_bar(price, @lo, @hi, 40) FROM fx_trades WHERE symbol = 'EURUSD' + AND timestamp IN '$today' SAMPLE BY 30m -LIMIT -10; +LIMIT -5; ``` +``` + timestamp | ohlc_bar +--------------------------------+------------------------------------------ + 2026-04-29T11:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀─░░░░░░░░░░░░───────────⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T11:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀──██─────────────────────⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T12:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀─███████████████───────⠀⠀⠀⠀⠀⠀ + 2026-04-29T12:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀─────░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T13:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀────██─────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +``` + +```questdb-sql demo title="Dynamic bounds via CROSS JOIN" +SELECT timestamp, + ohlc_bar(price, lo, hi, 50) +FROM fx_trades +CROSS JOIN ( + SELECT min(price) lo, max(price) hi + FROM fx_trades + WHERE symbol = 'EURUSD' + AND timestamp IN '$today' +) +WHERE symbol = 'EURUSD' + AND timestamp IN '$today' +SAMPLE BY 30m +LIMIT -5; +``` + +``` + timestamp | ohlc_bar +--------------------------------+---------------------------------------------------- + 2026-04-29T11:00:00.000000000Z | ⠀⠀⠀──░░░░░░░░░░░░░░░░░░░░░░──────────────────────⠀ + 2026-04-29T11:30:00.000000000Z | ⠀⠀────███───────────────────────────────────────── + 2026-04-29T12:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀──█████████████████████████████──────────── + 2026-04-29T12:30:00.000000000Z | ────────░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T13:00:00.000000000Z | ────────│──────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +``` + +```questdb-sql demo title="Per-symbol bounds via LATERAL JOIN" +SELECT timestamp, symbol, + ohlc_bar(price, lo, hi, 40) +FROM fx_trades t +JOIN LATERAL ( + SELECT min(price) lo, max(price) hi + FROM fx_trades t2 + WHERE t.symbol = t2.symbol + AND t2.timestamp IN '$today' +) +WHERE symbol IN ('EURUSD', 'GBPUSD') + AND timestamp IN '$today' +SAMPLE BY 30m +LIMIT -5; +``` + +``` + timestamp | symbol | ohlc_bar +--------------------------------+--------+------------------------------------------ + 2026-04-29T12:00:00.000000000Z | GBPUSD | ⠀──░░░░░░░░░░░░░░░░░░░░░░░░░────────── + 2026-04-29T12:00:00.000000000Z | EURUSD | ⠀⠀⠀⠀⠀──███████████████████████────────── + 2026-04-29T12:30:00.000000000Z | EURUSD | ───────░░░░░░░░░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T12:30:00.000000000Z | GBPUSD | ───████────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T13:00:00.000000000Z | GBPUSD | ───██████─────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +``` + +Each symbol gets its own min/max scale via the lateral join, so candles are +comparable within a symbol regardless of absolute price level. + ### Scalar variant `ohlc_bar(open, high, low, close, min, max [, width])` - A per-row scalar @@ -435,10 +530,21 @@ FROM ( min(price) l, last(price) c FROM fx_trades WHERE symbol = 'EURUSD' - SAMPLE BY 1h + AND timestamp IN '$today' + SAMPLE BY 30m ) ) -LIMIT -10; +LIMIT -5; +``` + +``` + timestamp | ohlc_bar +--------------------------------+---------------------------------------------------- + 2026-04-29T11:00:00.000000000Z | ⠀⠀⠀──░░░░░░░░░░░░░░░░░░░░░░──────────────────────⠀ + 2026-04-29T11:30:00.000000000Z | ⠀⠀────███───────────────────────────────────────── + 2026-04-29T12:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀──█████████████████████████████──────────── + 2026-04-29T12:30:00.000000000Z | ────────░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T13:00:00.000000000Z | ────────│──────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ``` ### NULL handling and validation @@ -487,20 +593,23 @@ JOIN LATERAL ( SELECT min(price) lo, max(price) hi FROM fx_trades t2 WHERE t.symbol = t2.symbol + AND t2.timestamp IN '$today' ) WHERE symbol IN ('EURUSD', 'GBPUSD') -SAMPLE BY 1h -LIMIT -10; + AND timestamp IN '$today' +SAMPLE BY 30m +LIMIT -5; ``` -| timestamp | symbol | ohlc_bar_labels | -| :-------- | :----- | :-------------- | -| 2026-01-27T00:00:00.000000Z | EURUSD | ⠀⠀─────────────██────⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1982 H:1.2025 L:1.1864 C:1.1992 | -| 2026-01-27T01:00:00.000000Z | EURUSD | ⠀⠀───────░░░░░░░░─────────⠀⠀⠀⠀ O:1.1987 H:1.207 L:1.1868 C:1.1927 | -| 2026-01-27T02:00:00.000000Z | EURUSD | ────░░░░░░░░░░──────────⠀⠀⠀⠀⠀⠀ O:1.1966 H:1.2052 L:1.1851 C:1.1883 | -| 2026-01-27T03:00:00.000000Z | EURUSD | ──░░────────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1879 H:1.1977 L:1.1851 C:1.1868 | -| 2026-01-27T04:00:00.000000Z | EURUSD | ──██████─────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1867 H:1.1987 L:1.185 C:1.191 | -| 2026-01-27T05:00:00.000000Z | EURUSD | ──────████───⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.1903 H:1.1955 L:1.1851 C:1.1932 | +``` + timestamp | symbol | ohlc_bar_labels +--------------------------------+--------+------------------------------------------------------------------------------ + 2026-04-29T12:00:00.000000000Z | GBPUSD | ⠀─░░░░░░░░░░░░░░░░░░░░░─────── O:1.3577 H:1.3651 L:1.3368 C:1.3378 + 2026-04-29T12:00:00.000000000Z | EURUSD | ⠀⠀⠀⠀─██████████████████─────── O:1.162 H:1.1834 L:1.161 C:1.177 + 2026-04-29T12:30:00.000000000Z | EURUSD | ─────░░░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀ O:1.1784 H:1.1784 L:1.1574 C:1.1618 + 2026-04-29T12:30:00.000000000Z | GBPUSD | ──███─────────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.3378 H:1.3493 L:1.3358 C:1.3403 + 2026-04-29T13:00:00.000000000Z | GBPUSD | ──█████──────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ O:1.3382 H:1.3482 L:1.3358 C:1.3417 +``` #### See also @@ -519,8 +628,8 @@ Characters used (varying height): ▁▂▃▄▅▆▇█ ``` -Characters range from `▁` (lowest, U+2581) to `█` (highest, U+2588), giving 8 -levels of vertical resolution per character. +Characters range from `▁` (lowest) to `█` (highest), giving 8 levels of +vertical resolution per character. Since `sparkline` is an aggregate, it pairs naturally with [SAMPLE BY](/docs/query/sql/sample-by/) to show intra-bucket trends. @@ -566,52 +675,83 @@ SELECT timestamp, symbol, sparkline(price, NULL, NULL, 20) FROM trades WHERE symbol IN ('BTC-USDT', 'ETH-USDT') - AND timestamp IN '2026-03-07' + AND timestamp IN '$yesterday' SAMPLE BY 1h -LIMIT 10; +LIMIT -5; ``` | timestamp | symbol | avg_price | sparkline | | :-------------------------- | :------- | :-------- | :------------------- | -| 2026-03-07T00:00:00.000000Z | BTC-USDT | 68229 | ▄▄▄▄▄▄▃▂▁▁▂▃▃▄▆▇▇▇▇▇ | -| 2026-03-07T00:00:00.000000Z | ETH-USDT | 1981 | ▆▅▄▅▅▄▅▅▆▆▆▄▂▂▂▄▇▆▇▇ | -| 2026-03-07T01:00:00.000000Z | BTC-USDT | 68239 | ▇▅▃▃▂▃▃▂▂▂▂▁▁▁▂▃▃▃▅▅ | -| 2026-03-07T01:00:00.000000Z | ETH-USDT | 1979 | ▇▅▃▃▃▃▂▁▁▃▄▃▂▂▃▂▂▁▂▅ | -| 2026-03-07T02:00:00.000000Z | BTC-USDT | 68182 | ▇▇▇▆▆▆▄▃▂▃▂▂▂▁▂▄▅▆▆▆ | -| 2026-03-07T02:00:00.000000Z | ETH-USDT | 1978 | ▆▆▅▄▃▃▃▃▃▂▂▂▃▅▅▆▆▇▇▇ | -| 2026-03-07T03:00:00.000000Z | BTC-USDT | 68286 | ▇▆▆▆▅▅▅▅▅▄▄▃▂▂▃▃▃▁▁▁ | -| 2026-03-07T03:00:00.000000Z | ETH-USDT | 1986 | ▁▄▇▇▇▆▆▅▅▅▅▅▃▃▃▄▃▂▂▂ | -| 2026-03-07T04:00:00.000000Z | ETH-USDT | 1973 | ▁▁▂▂▃▃▃▄▄▅▇▇▇▇▇▇▆▆▆▆ | -| 2026-03-07T04:00:00.000000Z | BTC-USDT | 68026 | ▁▃▃▃▃▄▄▄▄▅▅▅▇▇▇▇▇▇▆▆ | +| 2026-04-28T21:00:00.000000Z | ETH-USDT | 2291 | ▆▇▆▅▄▃▃▄▃▃▂▃▃▃▃▁▂▁▃▃ | +| 2026-04-28T22:00:00.000000Z | BTC-USDT | 76343 | ▅▆▅▆▇▇▆▅▅▄▄▄▄▄▄▃▂▂▁▁ | +| 2026-04-28T22:00:00.000000Z | ETH-USDT | 2290 | ▅▅▅▆▆▇▆▄▄▄▄▄▃▃▂▂▂▁▁▁ | +| 2026-04-28T23:00:00.000000Z | BTC-USDT | 76288 | ▂▂▂▁▁▂▄▅▆▄▅▄▄▃▄▅▅▅▆▆ | +| 2026-04-28T23:00:00.000000Z | ETH-USDT | 2287 | ▃▂▂▃▄▅▅▆▅▄▃▃▃▃▄▄▆▆▆▇ | The `width` of 20 sub-samples each hour's tick data into 20 characters, regardless of how many ticks exist within each bucket. ```questdb-sql demo title="Compare intra-day trends across symbols" -SELECT symbol, sparkline(price) +SELECT symbol, sparkline(price, NULL, NULL, 24) FROM trades -WHERE timestamp IN '2026-03-07' +WHERE timestamp IN '$yesterday' SAMPLE BY 1h; ``` +``` + symbol | sparkline +----------+-------------------------- + ETH-USDT | ▃▂▃▂▂▃▄▄▄▃▂▁▁▁▁▃▅▅▇▇▆▅▆▅ + BTC-USDT | ▅▄▃▃▂▄▅▄▅▂▂▁▁▂▂▅▆▆▆▇▅▃▅▅ + LTC-USDT | ▄▃▄▅▅▆▆▄▅▃▂▂▂▁▂▂▃▄▃▃▂▂▁▁ + XLM-USDT | ▇▅▅▅▅▅▆▆▆▅▆▅▄▄▃▁▁▁▂▄▄▃▂▂ + SOL-USDT | ▆▅▄▅▅▆▅▅▅▅▄▄▄▃▃▃▃▄▅▆▇▇▆▆ +``` + ```questdb-sql demo title="Fixed scale for cross-symbol comparison" -SELECT symbol, sparkline(amount, 0, 1000000, 24) -FROM trades -SAMPLE BY 1d -LIMIT -5; +SELECT symbol, + sparkline(price, 0.5, 1.5, 24) +FROM fx_trades +WHERE symbol IN ('EURUSD', 'GBPUSD', + 'USDCHF', 'AUDUSD', 'USDCAD') + AND timestamp IN '$today' +SAMPLE BY 1d; ``` -This ensures 0 is always `▁` and 1,000,000 is always `█` across all symbols, -making the sparklines visually comparable. +``` + symbol | sparkline +--------+-------------------------- + AUDUSD | ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ + USDCHF | ▃▃▃▃▃▃▃▃▂▃▃▃▃▂▂▃▃▃▃▂▂▂▂▂ + GBPUSD | ▆▆▆▆▆▆▆▆▆▆▇▇▆▆▆▆▆▆▆▆▆▆▆▆ + EURUSD | ▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅ + USDCAD | ▇▇▇▆▆▆▇▇▇▇▇▇▇▇▇▇▇▇▆▇▇▇▇▇ +``` + +All symbols share the 0.5-1.5 scale, so their relative price levels are +directly comparable. USDCAD trades near the top, AUDUSD near the bottom. ```questdb-sql demo title="Partial auto-scaling with fixed floor" -SELECT symbol, sparkline(price, 0, NULL, 24) -FROM trades -SAMPLE BY 1d +SELECT timestamp, + sparkline(price, 1.15, NULL, 24) +FROM fx_trades +WHERE symbol = 'EURUSD' + AND timestamp IN '$today' +SAMPLE BY 30m LIMIT -5; ``` -Fixes the floor at 0 but auto-computes the ceiling from the data. +``` + timestamp | sparkline +--------------------------------+-------------------------- + 2026-04-29T11:00:00.000000000Z | ▅▅▅▅▆▆▅▆▇▆▆▆▇▇▆▆▆▅▅▅▄▄▃▃ + 2026-04-29T11:30:00.000000000Z | ▃▃▄▄▄▅▅▅▆▇▇▇▇▅▅▆▆▅▅▅▅▃▃▃ + 2026-04-29T12:00:00.000000000Z | ▃▄▄▅▄▄▅▆▆▆▇▇▇▅▅▆▆▆▆▆▆▆▇▇ + 2026-04-29T12:30:00.000000000Z | ▆▄▄▃▃▄▄▅▅▄▃▃▃▃▄▅▅▅▆▅▆▅▄▃ + 2026-04-29T13:00:00.000000000Z | ▅▅▄▄▅▆▅▄▄▅▅▄▆▆▆▆▅▅▄▅▄▅▅▅ +``` + +Fixes the floor at 1.15 but auto-computes the ceiling from the data. #### Clamping @@ -692,7 +832,8 @@ VARCHAR column header. Clicking it toggles between: left-to-right along a horizontal scroll axis, and bars are rendered vertically, resembling a traditional candlestick or bar chart. Timestamps appear at the bottom of each column (time in green, date in gray). OHLC - green/red coloring is preserved. + green/red coloring is preserved. For `ohlc_bar_labels`, labels are stripped + from the visual bar and shown as a tooltip on hover instead. The rotate icon turns cyan when the rotated view is active. @@ -700,13 +841,11 @@ The rotation state persists across consecutive queries that produce rotatable results. If you run a query that does not meet the rotation conditions (different functions, extra columns, or no visualization function), the state resets. -For `ohlc_bar_labels`, labels are shown inline in normal view and as a tooltip -on hover in rotated view. - :::note -In rotated view, `bar()` output replaces fractional block characters -(U+2589 through U+258F) with full blocks, as partial-width characters do not -render correctly when the text flow is vertical. +In rotated view, `bar()` fractional block characters are replaced because +partial-width characters do not render correctly when the text flow is vertical. +Fractional blocks that are half or more (`▉▊▋▌`) become a full block (`█`), +while smaller fractions (`▍▎▏`) become a faded tip (`░`). ::: `depth_chart` and `sparkline` do not support rotation. @@ -727,7 +866,9 @@ Default is 1,048,576 bytes (1 MB). This is the same property used by Each output character is 3 bytes in UTF-8, so the default allows up to 349,525 characters of output. For `sparkline`, this limits the number of values accumulated per group. For `bar` and `ohlc_bar`, this limits the `width` -parameter. If the limit is exceeded, the function throws a non-critical error. +parameter. For `depth_chart`, this limits the total chart width (bid levels + +spread + ask levels). If the limit is exceeded, the function throws a +non-critical error. In practice these limits are generous - a sparkline or bar of 349K characters would be unusable. The limit exists to prevent accidental memory exhaustion. From 88cea7ca39a6070abc419b24ac33108453856584 Mon Sep 17 00:00:00 2001 From: javier Date: Thu, 30 Apr 2026 09:50:25 +0200 Subject: [PATCH 3/4] Convert sparkline sample output from markdown table to code block --- documentation/query/functions/visualization.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/documentation/query/functions/visualization.md b/documentation/query/functions/visualization.md index c59558ae1..5c70caabe 100644 --- a/documentation/query/functions/visualization.md +++ b/documentation/query/functions/visualization.md @@ -680,13 +680,15 @@ SAMPLE BY 1h LIMIT -5; ``` -| timestamp | symbol | avg_price | sparkline | -| :-------------------------- | :------- | :-------- | :------------------- | -| 2026-04-28T21:00:00.000000Z | ETH-USDT | 2291 | ▆▇▆▅▄▃▃▄▃▃▂▃▃▃▃▁▂▁▃▃ | -| 2026-04-28T22:00:00.000000Z | BTC-USDT | 76343 | ▅▆▅▆▇▇▆▅▅▄▄▄▄▄▄▃▂▂▁▁ | -| 2026-04-28T22:00:00.000000Z | ETH-USDT | 2290 | ▅▅▅▆▆▇▆▄▄▄▄▄▃▃▂▂▂▁▁▁ | -| 2026-04-28T23:00:00.000000Z | BTC-USDT | 76288 | ▂▂▂▁▁▂▄▅▆▄▅▄▄▃▄▅▅▅▆▆ | -| 2026-04-28T23:00:00.000000Z | ETH-USDT | 2287 | ▃▂▂▃▄▅▅▆▅▄▃▃▃▃▄▄▆▆▆▇ | +``` + timestamp | symbol | avg_price | sparkline +-----------------------------+----------+-----------+---------------------- + 2026-04-28T21:00:00.000000Z | ETH-USDT | 2291 | ▆▇▆▅▄▃▃▄▃▃▂▃▃▃▃▁▂▁▃▃ + 2026-04-28T22:00:00.000000Z | BTC-USDT | 76343 | ▅▆▅▆▇▇▆▅▅▄▄▄▄▄▄▃▂▂▁▁ + 2026-04-28T22:00:00.000000Z | ETH-USDT | 2290 | ▅▅▅▆▆▇▆▄▄▄▄▄▃▃▂▂▂▁▁▁ + 2026-04-28T23:00:00.000000Z | BTC-USDT | 76288 | ▂▂▂▁▁▂▄▅▆▄▅▄▄▃▄▅▅▅▆▆ + 2026-04-28T23:00:00.000000Z | ETH-USDT | 2287 | ▃▂▂▃▄▅▅▆▅▄▃▃▃▃▄▄▆▆▆▇ +``` The `width` of 20 sub-samples each hour's tick data into 20 characters, regardless of how many ticks exist within each bucket. From bbf9bbc2d9f50748932d0597f8c2f5229ce07514 Mon Sep 17 00:00:00 2001 From: javier Date: Thu, 30 Apr 2026 14:17:08 +0200 Subject: [PATCH 4/4] Restructure function sections, add screenshots, clean up style Reorder each function: signature, params, return value, hero example, visual encoding, then remaining examples. Add web console screenshots using Screenshot component for colorizing and rotation. Remove dashes from function signatures, fix LLM mannerisms, add inline samples to function intros. Convert parameter tables to bullet points. --- .../query/functions/visualization.md | 389 ++++++++++-------- .../docs/query/functions/bars-vertical.webp | Bin 0 -> 27168 bytes .../docs/query/functions/depth_chart.webp | Bin 0 -> 25102 bytes .../docs/query/functions/ohlc-horizontal.webp | Bin 0 -> 43284 bytes .../docs/query/functions/ohlc-vertical.webp | Bin 0 -> 41510 bytes .../docs/query/functions/rotate-icon.svg | 1 + 6 files changed, 208 insertions(+), 182 deletions(-) create mode 100644 static/images/docs/query/functions/bars-vertical.webp create mode 100644 static/images/docs/query/functions/depth_chart.webp create mode 100644 static/images/docs/query/functions/ohlc-horizontal.webp create mode 100644 static/images/docs/query/functions/ohlc-vertical.webp create mode 100644 static/images/docs/query/functions/rotate-icon.svg diff --git a/documentation/query/functions/visualization.md b/documentation/query/functions/visualization.md index 5c70caabe..5349d0f89 100644 --- a/documentation/query/functions/visualization.md +++ b/documentation/query/functions/visualization.md @@ -6,7 +6,7 @@ description: SQL functions for rendering inline charts in query results using Un Visualization functions render numeric data as compact Unicode block charts directly in query results. The output is a `varchar` cell that works everywhere: -psql, the web console, JDBC clients, CSV exports, ... +psql, the web console, JDBC clients, or CSV exports. | Function | Type | Description | | :------- | :--- | :---------- | @@ -19,7 +19,8 @@ psql, the web console, JDBC clients, CSV exports, ... ## Resolution and rendering -Visualization functions render data as Unicode text characters. Each character +Visualization functions render data as Unicode text characters, for example +`⠀⠀───░░░░──⠀⠀` (OHLC candle) or `▃▅▇▆▄▂▁▃▅▇` (sparkline). Each character position represents a range of values, not a single precise point. A bar rendered at width 40 can only distinguish 40 distinct levels across its scale range. Values that fall within the same character-width bucket are @@ -31,26 +32,9 @@ replacement for pixel-level charting tools. ## bar -`bar(value, min, max, width)` - Renders a single numeric value as a horizontal -bar. The bar is made of full block characters with a fractional block at the end -for sub-character precision. - -Characters used (varying width): - -``` -█▉▊▋▌▍▎▏ -``` - -A full block fills the character cell; fractional blocks at the end provide -sub-character precision. A `width` of 20 characters gives 160 discrete levels -of resolution (20 x 8). - -Since `bar` is a scalar function, it can wrap aggregates like `sum()`, `avg()`, -or `count()` to visualize their results inline. - -The web console can -[rotate](#rotating-to-vertical-chart) `bar` output to a vertical chart when the -query returns exactly two columns (timestamp + bar). +`bar(value, min, max, width)` renders a single numeric value as a horizontal +bar (`████████████▌`), made of full block characters with a fractional block +at the end for sub-character precision. #### Parameters @@ -70,6 +54,42 @@ if `min >= max`, the function returns `NULL`. Return value type is `varchar`. +```questdb-sql demo title="Inline with row-level data" +SELECT symbol, round(price, 4) price, + bar(price, 0.5, 1.5, 25) +FROM fx_trades +WHERE symbol IN ('EURUSD', 'GBPUSD', + 'USDCHF', 'USDCAD', 'AUDUSD') +LATEST ON timestamp PARTITION BY symbol; +``` + +``` + symbol | price | bar +--------+--------+------------------------ + AUDUSD | 0.7128 | █████▎ + USDCAD | 1.3708 | █████████████████████▊ + USDCHF | 0.7836 | ███████ + EURUSD | 1.1618 | ████████████████▌ + GBPUSD | 1.3417 | █████████████████████ +``` + +#### Visual encoding + +``` +█▉▊▋▌▍▎▏ +``` + +A full block fills the character cell; fractional blocks at the end provide +sub-character precision. A `width` of 20 characters gives 160 discrete levels +of resolution (20 x 8). + +Since `bar` is a scalar function, it can wrap aggregates like `sum()`, `avg()`, +or `count()` to visualize their results inline. + +The web console can +[rotate](#rotating-to-vertical-chart) `bar` output to a vertical chart when the +query returns exactly two columns (timestamp + bar). + #### Examples ```questdb-sql demo title="Visualize aggregated volume per minute" @@ -146,25 +166,6 @@ LIMIT -5; All symbols share the same min/max, making bars comparable across groups. -```questdb-sql demo title="Inline with row-level data" -SELECT symbol, round(price, 4) price, - bar(price, 0.5, 1.5, 25) -FROM fx_trades -WHERE symbol IN ('EURUSD', 'GBPUSD', - 'USDCHF', 'USDCAD', 'AUDUSD') -LATEST ON timestamp PARTITION BY symbol; -``` - -``` - symbol | price | bar ---------+--------+------------------------ - AUDUSD | 0.7128 | █████▎ - USDCAD | 1.3708 | █████████████████████▊ - USDCHF | 0.7836 | ███████ - EURUSD | 1.1618 | ████████████████▌ - GBPUSD | 1.3417 | █████████████████████ -``` - #### See also - [sparkline](#sparkline) - Aggregate trend chart @@ -172,30 +173,20 @@ LATEST ON timestamp PARTITION BY symbol; ## depth_chart -`depth_chart(bid_volumes[], ask_volumes[] [, width])` - Renders a market depth -profile from bid and ask volume arrays as a single-line sparkline-style chart. -Bids appear on the left (tallest at the edges representing deepest liquidity), -asks on the right, with a spread marker (`╎`) in the center. +`depth_chart(bid_volumes[], ask_volumes[] [, width])` renders a market depth +profile (`█▇▆▅▄▃▂▁╎▁▂▃▄▅▆▇█`) from bid and ask volume arrays. Bids appear on +the left (tallest at the edges representing deepest liquidity), asks on the +right, with a spread marker (`╎`) in the center. See also [depth_chart_labels](#depth_chart_labels), which appends volume statistics after the chart. -The web console [colorizes](#colorizing) bid and ask sides in green and red. - -Characters used: - -| Purpose | Character | -| :------ | :-------- | -| Depth levels | `█▇▆▅▄▃▂▁▁▂▃▄▅▆▇█` | -| Spread marker | `╎` | - #### Parameters -| Parameter | Type | Description | -| :-------- | :--- | :---------- | -| bid_volumes | DOUBLE[] | Per-level bid volumes, ordered best-to-worst | -| ask_volumes | DOUBLE[] | Per-level ask volumes, ordered best-to-worst | -| width | INT (optional) | Total chart width in characters. Default: array lengths + 1. Minimum: 3. | +- `bid_volumes` (`DOUBLE[]`): per-level bid volumes, ordered best-to-worst. +- `ask_volumes` (`DOUBLE[]`): per-level ask volumes, ordered best-to-worst. +- `width` (optional, `int`): total chart width in characters. Default: array + lengths + 1. Minimum: 3. Arrays must be one-dimensional. They can have different lengths (asymmetric books are valid). @@ -204,15 +195,45 @@ books are valid). Return value type is `varchar`. -#### How scaling works +```questdb-sql demo title="Latest depth for multiple symbols" +SELECT timestamp, symbol, + depth_chart(bids[2], asks[2]) +FROM market_data +WHERE timestamp IN '$today' + AND symbol IN ('EURUSD', 'GBPUSD', + 'USDJPY', 'USDCAD', 'USDCHF') +LATEST ON timestamp PARTITION BY symbol; +``` + +``` + timestamp | symbol | depth_chart +-----------------------------+--------+----------------------------------------------------------------------- + 2026-04-29T13:18:09.646733Z | EURUSD | █▇▇▇▇▇▆▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇▇ + 2026-04-29T13:18:09.783631Z | GBPUSD | █▇▇▇▆▆▆▆▅▅▅▄▄▄▃▃▂▂▁╎▁▂▃▃▃▄▄▄▅▅▅▆▆▆▆▇▇▇▇ + 2026-04-29T13:18:10.044379Z | USDCHF | ▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▄▄▄▄▃▃▃▃▂▂▁▁╎▁▁▂▂▃▃▃▃▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇█ + 2026-04-29T13:18:10.106524Z | USDCAD | ▇▇▇▇▆▆▆▆▅▅▅▅▄▄▄▃▃▃▂▁▁╎▁▂▂▃▃▃▄▄▄▅▅▅▅▆▆▆▇▇▇▇█ + 2026-04-29T13:18:10.159159Z | USDJPY | ▇▆▄▁╎▁▄▆█ +``` + +Each symbol has a different number of depth levels. The chart width adjusts +automatically. Symmetric shapes indicate balanced books, and one side taller +than the other indicates a liquidity imbalance. Use the optional `width` +parameter to force all charts to the same number of characters for side-by-side +comparison. + +#### Visual encoding + +| Purpose | Character | +| :------ | :-------- | +| Depth levels | `█▇▆▅▄▃▂▁▁▂▃▄▅▆▇█` | +| Spread marker | `╎` | The function computes cumulative sums from each array, then applies `log1p()` to compress the dynamic range. This is necessary because cumulative depth grows -exponentially - without log scale, only the deepest levels would be visible and +exponentially. Without log scale, only the deepest levels would be visible and all near-spread levels would appear as the lowest character. -The log-scaled values are mapped to sparkline characters (`▁` through `█`) -relative to the global min/max across both sides. +The web console [colorizes](#colorizing) bid and ask sides in green and red. #### Width behavior @@ -232,30 +253,6 @@ relative to the global min/max across both sides. #### Examples -```questdb-sql demo title="Latest depth for multiple symbols" -SELECT timestamp, symbol, - depth_chart(bids[2], asks[2]) -FROM market_data -WHERE timestamp IN '$today' - AND symbol IN ('EURUSD', 'GBPUSD', - 'USDJPY', 'USDCAD', 'USDCHF') -LATEST ON timestamp PARTITION BY symbol; -``` - -``` - timestamp | symbol | depth_chart ------------------------------+--------+----------------------------------------------------------------------- - 2026-04-29T13:18:09.646733Z | EURUSD | █▇▇▇▇▇▆▆▆▆▆▆▅▅▅▅▅▅▄▄▄▄▄▄▃▃▃▃▃▂▂▂▁▁╎▁▁▂▂▂▃▃▃▃▃▄▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇▇ - 2026-04-29T13:18:09.783631Z | GBPUSD | █▇▇▇▆▆▆▆▅▅▅▄▄▄▃▃▂▂▁╎▁▂▃▃▃▄▄▄▅▅▅▆▆▆▆▇▇▇▇ - 2026-04-29T13:18:10.044379Z | USDCHF | ▇▇▇▇▇▆▆▆▆▆▅▅▅▅▅▄▄▄▄▃▃▃▃▂▂▁▁╎▁▁▂▂▃▃▃▃▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇█ - 2026-04-29T13:18:10.106524Z | USDCAD | ▇▇▇▇▆▆▆▆▅▅▅▅▄▄▄▃▃▃▂▁▁╎▁▂▂▃▃▃▄▄▄▅▅▅▅▆▆▆▇▇▇▇█ - 2026-04-29T13:18:10.159159Z | USDJPY | ▇▆▄▁╎▁▄▆█ -``` - -Each symbol has a different number of depth levels. The chart width adjusts -automatically. Symmetric shapes indicate balanced books; one side taller than the -other indicates a liquidity imbalance. - ```questdb-sql demo title="Fixed-width comparison" SELECT symbol, depth_chart(bids[2], asks[2], 21) @@ -286,7 +283,7 @@ profile with thin liquidity near the spread and heavy volume at the edges. ## depth_chart_labels -`depth_chart_labels(bid_volumes[], ask_volumes[] [, width])` - Identical to +`depth_chart_labels(bid_volumes[], ask_volumes[] [, width])` is identical to [depth_chart](#depth_chart) but appends volume statistics after the chart: `bb: ba: tb: ta:`. @@ -326,30 +323,15 @@ LATEST ON timestamp PARTITION BY symbol; ## ohlc_bar Renders OHLC (Open, High, Low, Close) candlestick data as horizontal Unicode -bars. Each row produces a text candlestick showing wick (high-low range) and -body (open-close range), directly in query results. +bars (`⠀⠀───░░░░░──⠀⠀`). Each row produces a text candlestick showing wick +(high-low range) and body (open-close range), directly in query results. See also [ohlc_bar_labels](#ohlc_bar_labels), which appends OHLC values after the bar. -The web console [colorizes](#colorizing) bullish bodies green and bearish bodies -red, and can [rotate](#rotating-to-vertical-chart) the output to a vertical -candlestick chart. - -Visual encoding: - -``` -⠀⠀⠀───██████─────⠀⠀⠀ Bullish (close >= open): █ body, ─ wick -⠀⠀───────░░░░──⠀⠀⠀⠀ Bearish (close < open): ░ body, ─ wick -⠀⠀⠀⠀──│──⠀⠀⠀⠀⠀⠀⠀⠀ Doji (close == open): │ line, ─ wick -``` - -All candles in a result set are scaled against the same min/max bounds, so their -horizontal positions are directly comparable across rows. - ### Aggregate variant -`ohlc_bar(price, min, max [, width])` - A GROUP BY / SAMPLE BY aggregate. +`ohlc_bar(price, min, max [, width])` is a GROUP BY / SAMPLE BY aggregate. Computes Open (first value by row order), High (max), Low (min), and Close (last value by row order) from raw price observations within each group. Renders using the supplied min/max bounds for scaling. @@ -359,16 +341,53 @@ rendered in one step with SAMPLE BY. #### Parameters -| Parameter | Type | Description | -| :-------- | :--- | :---------- | -| price | DOUBLE | Value column to aggregate into OHLC | -| min | DOUBLE | Lower bound for scaling (left edge of bar) | -| max | DOUBLE | Upper bound for scaling (right edge of bar) | -| width | INT (optional) | Bar width in characters, default 40 | +- `price` (`double`): value column to aggregate into OHLC. +- `min` (`double`): lower bound for scaling (left edge of bar). +- `max` (`double`): upper bound for scaling (right edge of bar). +- `width` (optional, `int`): bar width in characters, default 40. The min and max parameters accept column references, lateral join results, constants, and bind variables. +#### Return value + +Return value type is `varchar`. + +```questdb-sql demo title="Constant bounds" +SELECT timestamp, + ohlc_bar(price, 1.15, 1.19, 40) +FROM fx_trades +WHERE symbol = 'EURUSD' + AND timestamp IN '$today' +SAMPLE BY 30m +LIMIT -5; +``` + +``` + timestamp | ohlc_bar +--------------------------------+------------------------------------------ + 2026-04-29T11:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀─░░░░░░░░░░░░───────────⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T11:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀──██─────────────────────⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T12:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀─███████████████───────⠀⠀⠀⠀⠀⠀ + 2026-04-29T12:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀─────░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + 2026-04-29T13:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀────██─────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ +``` + +#### Visual encoding + +``` +⠀⠀⠀───██████─────⠀⠀⠀ Bullish (close >= open): █ body, ─ wick +⠀⠀───────░░░░──⠀⠀⠀⠀ Bearish (close < open): ░ body, ─ wick +⠀⠀⠀⠀──│──⠀⠀⠀⠀⠀⠀⠀⠀ Doji (close == open): │ line, ─ wick +``` + +All candles in a result set are scaled against the same min/max bounds, so their +horizontal positions are directly comparable across rows. + +The web console [colorizes](#colorizing) bullish bodies green and bearish bodies +red, and can [rotate](#rotating-to-vertical-chart) the output to the traditional vertical +candlestick chart. + #### Bounds Both variants require explicit min and max bounds for scaling. These bounds @@ -393,29 +412,6 @@ The aggregate variant supports `FILL(NULL)`, `FILL(PREV)`, and `FILL(NONE)`. #### Examples -```questdb-sql demo title="Constant bounds" -SELECT timestamp, - ohlc_bar(price, 1.15, 1.19, 40) -FROM fx_trades -WHERE symbol = 'EURUSD' - AND timestamp IN '$today' -SAMPLE BY 30m -LIMIT -5; -``` - -``` - timestamp | ohlc_bar ---------------------------------+------------------------------------------ - 2026-04-29T11:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀─░░░░░░░░░░░░───────────⠀⠀⠀⠀⠀⠀⠀ - 2026-04-29T11:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀──██─────────────────────⠀⠀⠀⠀⠀⠀⠀ - 2026-04-29T12:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀─███████████████───────⠀⠀⠀⠀⠀⠀ - 2026-04-29T12:30:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀─────░░░░░░░░░░░░░░░░░⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ - 2026-04-29T13:00:00.000000000Z | ⠀⠀⠀⠀⠀⠀⠀────██─────⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -``` - -Bullish candles (`█`) show close above open, bearish candles (`░`) show close -below open. The wick (`─`) extends from high to low. - ```questdb-sql title="DECLARE variables" DECLARE @lo := 1.15, @hi := 1.19 @@ -495,9 +491,9 @@ comparable within a symbol regardless of absolute price level. ### Scalar variant -`ohlc_bar(open, high, low, close, min, max [, width])` - A per-row scalar -function. Takes precomputed OHLC values and explicit bounds. Does not -aggregate - renders one candle per input row. +`ohlc_bar(open, high, low, close, min, max [, width])` is a per-row scalar +function that takes precomputed OHLC values and explicit bounds, rendering one +candle per input row without aggregation. **When to use:** OHLC values are already computed (from a subquery, materialized view, or external source) and you want to render them with precise control over @@ -505,15 +501,13 @@ the scaling bounds. #### Parameters -| Parameter | Type | Description | -| :-------- | :--- | :---------- | -| open | DOUBLE | Opening price | -| high | DOUBLE | Highest price | -| low | DOUBLE | Lowest price | -| close | DOUBLE | Closing price | -| min | DOUBLE | Lower bound for scaling (left edge) | -| max | DOUBLE | Upper bound for scaling (right edge) | -| width | INT (optional) | Bar width in characters, default 40 | +- `open` (`double`): opening price. +- `high` (`double`): highest price. +- `low` (`double`): lowest price. +- `close` (`double`): closing price. +- `min` (`double`): lower bound for scaling (left edge). +- `max` (`double`): upper bound for scaling (right edge). +- `width` (optional, `int`): bar width in characters, default 40. #### Examples @@ -618,24 +612,16 @@ LIMIT -5; ## sparkline -`sparkline(value)` or `sparkline(value, min, max, width)` - Collects numeric -values within a group and renders them as a compact vertical block chart. Each -value maps to one character. Best for showing trends, cycles, and spikes. - -Characters used (varying height): - -``` -▁▂▃▄▅▆▇█ -``` - -Characters range from `▁` (lowest) to `█` (highest), giving 8 levels of -vertical resolution per character. +`sparkline(value)` or `sparkline(value, min, max, width)` collects numeric +values within a group and renders them as a compact vertical block chart +(`▃▅▇▆▄▂▁▃▅▇`). Each value maps to one character. Best for showing trends, +cycles, and spikes. Since `sparkline` is an aggregate, it pairs naturally with [SAMPLE BY](/docs/query/sql/sample-by/) to show intra-bucket trends. -The input can be any numeric type (`double`, `int`, `long`, `short`, `float`) - -it is implicitly cast to `double`. +The input can be any numeric type (`double`, `int`, `long`, `short`, `float`), +implicitly cast to `double`. #### Parameters @@ -659,16 +645,6 @@ auto-computes the ceiling from the data. Return value type is `varchar`. -#### Null handling - -- `NULL` input values are silently skipped. -- If all values in a group are `NULL`, the function returns `NULL`. -- An empty group (no rows) also returns `NULL`. -- When all values are identical (`min` equals `max`), every character renders as - `█`, signaling "no variation". - -#### Examples - ```questdb-sql demo title="Hourly price trends with sub-sampling" SELECT timestamp, symbol, round(avg(price), 0) avg_price, @@ -693,6 +669,25 @@ LIMIT -5; The `width` of 20 sub-samples each hour's tick data into 20 characters, regardless of how many ticks exist within each bucket. +#### Visual encoding + +``` +▁▂▃▄▅▆▇█ +``` + +Characters range from `▁` (lowest) to `█` (highest), giving 8 levels of +vertical resolution per character. + +#### Null handling + +- `NULL` input values are silently skipped. +- If all values in a group are `NULL`, the function returns `NULL`. +- An empty group (no rows) also returns `NULL`. +- When all values are identical (`min` equals `max`), every character renders as + `█`, signaling "no variation". + +#### Examples + ```questdb-sql demo title="Compare intra-day trends across symbols" SELECT symbol, sparkline(price, NULL, NULL, 24) FROM trades @@ -805,6 +800,13 @@ columns the query returns. - For `ohlc_bar_labels`, the label prefixes (`O:`, `H:`, `L:`, `C:`) are displayed in orange + + **Market depth coloring** (`depth_chart` / `depth_chart_labels`): - Bid side (characters before the spread separator `╎`) is displayed in green @@ -813,6 +815,13 @@ columns the query returns. - For `depth_chart_labels`, the label prefixes (`bb:`, `ba:`, `tb:`, `ta:`) are displayed in orange + + `bar` and `sparkline` output is not colorized. ### Rotating to vertical chart @@ -825,23 +834,24 @@ met: - One column is TIMESTAMP or TIMESTAMP_NS - The other column is VARCHAR containing `bar` or `ohlc_bar` output -When these conditions are met, a rotate icon appears at the right side of the -VARCHAR column header. Clicking it toggles between: +When these conditions are met, a rotate icon +(![rotate](/images/docs/query/functions/rotate-icon.svg)) appears at the right +side of the VARCHAR column header. Clicking it toggles between: - **Normal (horizontal) view**: the default grid layout. Rows are listed vertically with bars rendered horizontally. - **Rotated (vertical) view**: a transposed layout where time flows left-to-right along a horizontal scroll axis, and bars are rendered vertically, resembling a traditional candlestick or bar chart. Timestamps - appear at the bottom of each column (time in green, date in gray). OHLC - green/red coloring is preserved. For `ohlc_bar_labels`, labels are stripped - from the visual bar and shown as a tooltip on hover instead. + appear at the bottom of each column (time in green, date in gray). The + rotate icon turns cyan when the rotated view is active. -The rotate icon turns cyan when the rotated view is active. - -The rotation state persists across consecutive queries that produce rotatable -results. If you run a query that does not meet the rotation conditions (different -functions, extra columns, or no visualization function), the state resets. + :::note In rotated view, `bar()` fractional block characters are replaced because @@ -850,6 +860,21 @@ Fractional blocks that are half or more (`▉▊▋▌`) become a full block (` while smaller fractions (`▍▎▏`) become a faded tip (`░`). ::: +For `ohlc_bar_labels`, labels appear inline in the normal horizontal view +but are stripped in rotated view and shown as a tooltip when hovering over a +candle column. OHLC green/red coloring is preserved in both views. + + + +The rotation state persists across consecutive queries that produce rotatable +results. If you run a query that does not meet the rotation conditions (different +functions, extra columns, or no visualization function), the state resets. + `depth_chart` and `sparkline` do not support rotation. ## Configuration @@ -872,5 +897,5 @@ parameter. For `depth_chart`, this limits the total chart width (bid levels + spread + ask levels). If the limit is exceeded, the function throws a non-critical error. -In practice these limits are generous - a sparkline or bar of 349K characters +In practice these limits are generous. A sparkline or bar of 349K characters would be unusable. The limit exists to prevent accidental memory exhaustion. diff --git a/static/images/docs/query/functions/bars-vertical.webp b/static/images/docs/query/functions/bars-vertical.webp new file mode 100644 index 0000000000000000000000000000000000000000..6aa05e5f4a390430a346d5b1bc8fe94d341eb1b9 GIT binary patch literal 27168 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 CE@k-u literal 0 HcmV?d00001 diff --git a/static/images/docs/query/functions/ohlc-horizontal.webp b/static/images/docs/query/functions/ohlc-horizontal.webp new file mode 100644 index 0000000000000000000000000000000000000000..58528177254c94543d59780ae9cd55ef2b43fc41 GIT binary patch literal 43284 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 a!V#jc60>xSQ!m^?MB11(XIL^W?)rbc5@$gG literal 0 HcmV?d00001 diff --git a/static/images/docs/query/functions/ohlc-vertical.webp b/static/images/docs/query/functions/ohlc-vertical.webp new file mode 100644 index 0000000000000000000000000000000000000000..be4f78fafabcbd1f8f095324fa1963e7be4d60d1 GIT binary patch literal 41510 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