Graflume · Alpha
Technical indicator · Edge-case application
Compute 45 technical indicators from OHLCV data, while also rendering supplied indicator columns through the same portable financial contract. Exercise numeric range, sparse structure, and large inputs with valid data. Each tab materializes data only when needed and never silently repairs invalid values.
Chart family · Specialized families
Technical indicator
Compute 45 technical indicators from OHLCV data, while also rendering supplied indicator columns through the same portable financial contract.
- Quick API
technicalIndicator()- Browser snapshot
graflume/complete- mark
indicator- Presets
- 45
- OHLCV computation
- 45 computed · 0 precomputed-only
Edge cases
Numeric range, irregular structure, and data volume
Exercise numeric range, sparse structure, and large inputs with valid data. Each tab materializes data only when needed and never silently repairs invalid values.
Wide numeric range
Mix zero, very small finite values, and very large finite values to verify automatic domains, precision, and stable geometry. NaN and Infinity remain intentionally invalid. It applies 2 data-integrity rules that preserve finite values and axis domains.
StatusLoading
extreme-rangeextreme-smallextreme-largepositive-domainbudget:marks<=6
Loading
Wide numeric range · Row data
Row data and zero-copy TypedArray columns share one data contract.
datetemporal | valuequantitative | openquantitative | highquantitative | lowquantitative | closequantitative | volumequantitative | lowerquantitative | upperquantitative | signalquantitative |
|---|---|---|---|---|---|---|---|---|---|
| 2026-01-01 | 5.150000000000001e-10 | 5.05e-10 | 5.253000000000001e-10 | 4.949e-10 | 5.150000000000001e-10 | 0 | — | — | 4.995500000000001e-10 |
| 2026-02-01 | 9.9e-07 | 1.0099999999999999e-06 | 1.0302e-06 | 9.702e-07 | 9.9e-07 | 1 | — | — | 9.603e-07 |
| 2026-03-01 | 1.03 | 1.01 | 1.0506 | 0.9898 | 1.03 | 1000 | — | — | 0.9991 |
| 2026-04-01 | 990 | 1010 | 1030.2 | 970.1999999999999 | 990 | 1e+06 | — | — | 960.3 |
| 2026-05-01 | 1.03e+06 | 1.01e+06 | 1.0506e+06 | 989800 | 1.03e+06 | 1e+09 | — | — | 999100 |
| 2026-06-01 | 1.98e+09 | 2.02e+09 | 2.0604e+09 | 1.9404e+09 | 1.98e+09 | 1e+12 | — | — | 1.9206e+09 |
Browser API · Portable schema
Browser API
Graflume.technicalIndicator()
const data = [
{
"close": 5.150000000000001e-10,
"date": "2026-01-01",
"high": 5.253000000000001e-10,
"low": 4.949e-10,
"lower": null,
"open": 5.05e-10,
"signal": 4.995500000000001e-10,
"upper": null,
"value": 5.150000000000001e-10,
"volume": 0
},
{
"close": 9.9e-7,
"date": "2026-02-01",
"high": 0.0000010302,
"low": 9.702e-7,
"lower": null,
"open": 0.0000010099999999999999,
"signal": 9.603e-7,
"upper": null,
"value": 9.9e-7,
"volume": 1
},
{
"close": 1.03,
"date": "2026-03-01",
"high": 1.0506,
"low": 0.9898,
"lower": null,
"open": 1.01,
"signal": 0.9991,
"upper": null,
"value": 1.03,
"volume": 1000
},
{
"close": 990,
"date": "2026-04-01",
"high": 1030.2,
"low": 970.1999999999999,
"lower": null,
"open": 1010,
"signal": 960.3,
"upper": null,
"value": 990,
"volume": 1000000
},
{
"close": 1030000,
"date": "2026-05-01",
"high": 1050600,
"low": 989800,
"lower": null,
"open": 1010000,
"signal": 999100,
"upper": null,
"value": 1030000,
"volume": 1000000000
},
{
"close": 1980000000,
"date": "2026-06-01",
"high": 2060400000,
"low": 1940400000,
"lower": null,
"open": 2020000000,
"signal": 1920600000,
"upper": null,
"value": 1980000000,
"volume": 1000000000000
}
];
const options = {
"accessibility": {
"description": "Every indicator is calculated from the same coherent OHLCV market history. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Technical indicator"
},
"axes": {
"x": {
"format": {
"dateStyle": "long",
"timeZone": "UTC",
"type": "date"
}
}
},
"height": 620,
"interaction": {
"hover": true,
"tooltip": {
"axis": "x",
"fields": [
{
"dateStyle": "long",
"field": "date",
"format": "date",
"label": "Date",
"timeZone": "UTC"
},
{
"field": "value",
"format": "number",
"label": "Value"
},
{
"field": "open",
"format": "number",
"label": "Open"
},
{
"field": "high",
"format": "number",
"label": "High"
},
{
"field": "low",
"format": "number",
"label": "Low"
},
{
"field": "close",
"format": "number",
"label": "Close"
},
{
"field": "volume",
"format": "number",
"label": "Volume"
},
{
"field": "lower",
"format": "number",
"label": "Lower"
},
{
"field": "upper",
"format": "number",
"label": "Upper"
},
{
"field": "signal",
"format": "number",
"label": "Signal"
}
],
"title": "Technical indicator",
"trigger": "axis"
}
},
"locale": "en",
"mark": {
"fields": {
"middle": "value",
"signal": "signal",
"value": "value"
},
"options": {
"fields": [
"value",
"signal"
],
"kind": "sma"
}
},
"title": {
"subtitle": "edge case · range",
"text": "Technical indicator"
},
"width": "container",
"x": {
"field": "date",
"title": "Trading day",
"type": "temporal"
},
"y": {
"field": "value",
"title": "value",
"type": "quantitative"
}
};
Graflume.technicalIndicator('#chart', data, options);Portable schema
ChartSpec 0.1 · options
{
"accessibility": {
"description": "Every indicator is calculated from the same coherent OHLCV market history. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Technical indicator"
},
"axes": {
"x": {
"format": {
"dateStyle": "long",
"timeZone": "UTC",
"type": "date"
}
}
},
"height": 620,
"interaction": {
"hover": true,
"tooltip": {
"axis": "x",
"fields": [
{
"dateStyle": "long",
"field": "date",
"format": "date",
"label": "Date",
"timeZone": "UTC"
},
{
"field": "value",
"format": "number",
"label": "Value"
},
{
"field": "open",
"format": "number",
"label": "Open"
},
{
"field": "high",
"format": "number",
"label": "High"
},
{
"field": "low",
"format": "number",
"label": "Low"
},
{
"field": "close",
"format": "number",
"label": "Close"
},
{
"field": "volume",
"format": "number",
"label": "Volume"
},
{
"field": "lower",
"format": "number",
"label": "Lower"
},
{
"field": "upper",
"format": "number",
"label": "Upper"
},
{
"field": "signal",
"format": "number",
"label": "Signal"
}
],
"title": "Technical indicator",
"trigger": "axis"
}
},
"locale": "en",
"mark": {
"fields": {
"middle": "value",
"signal": "signal",
"value": "value"
},
"options": {
"fields": [
"value",
"signal"
],
"kind": "sma"
}
},
"title": {
"subtitle": "edge case · range",
"text": "Technical indicator"
},
"width": "container",
"x": {
"field": "date",
"title": "Trading day",
"type": "temporal"
},
"y": {
"field": "value",
"title": "value",
"type": "quantitative"
}
}Sparse and irregular structure
Exercise only duplicate, missing, sparse, or out-of-order structures whose meaning is defined for this family. Broken references and malformed tuples are never disguised as successful examples. It applies 3 structural rules that preserve the meaning of missing, duplicate, and ordered values.
StatusLoading
irregular-structuresparseout-of-ordernullflat-runbudget:marks<=6
Loading
Sparse and irregular structure · Row data
Row data and zero-copy TypedArray columns share one data contract.
datetemporal | valuequantitative | openquantitative | highquantitative | lowquantitative | closequantitative | volumequantitative | lowerquantitative | upperquantitative | signalquantitative |
|---|---|---|---|---|---|---|---|---|---|
| 2025-01-03 | 97.4641 | 97.3786 | 98.8241 | 96.0986 | 97.4641 | 1217 | — | — | 94.540177 |
| 2025-01-01 | — | 94 | 96.3 | 92.9 | — | 1070 | — | — | — |
| 2025-01-04 | 98.1631 | 98.5624 | 100.0024 | 96.7931 | 98.1631 | 1287 | — | — | 95.21820699999999 |
| 2025-01-05 | 98.4747 | 99.2322 | 100.7522 | 97.3747 | 98.4747 | 1353 | — | — | 95.520459 |
| 2025-01-06 | 98.3969 | 99.3404 | 100.5404 | 97.2069 | 98.3969 | 1415 | — | — | 95.444993 |
| 2025-01-02 | 96.4177 | 95.7997 | 97.6977 | 94.6097 | 96.4177 | 1144 | — | — | 93.52516899999999 |
Browser API · Portable schema
Browser API
Graflume.technicalIndicator()
const data = [
{
"close": 97.4641,
"date": "2025-01-03",
"high": 98.8241,
"low": 96.0986,
"lower": null,
"open": 97.3786,
"signal": 94.540177,
"upper": null,
"value": 97.4641,
"volume": 1217
},
{
"close": null,
"date": "2025-01-01",
"high": 96.3,
"low": 92.9,
"lower": null,
"open": 94,
"signal": null,
"upper": null,
"value": null,
"volume": 1070
},
{
"close": 98.1631,
"date": "2025-01-04",
"high": 100.0024,
"low": 96.7931,
"lower": null,
"open": 98.5624,
"signal": 95.21820699999999,
"upper": null,
"value": 98.1631,
"volume": 1287
},
{
"close": 98.4747,
"date": "2025-01-05",
"high": 100.7522,
"low": 97.3747,
"lower": null,
"open": 99.2322,
"signal": 95.520459,
"upper": null,
"value": 98.4747,
"volume": 1353
},
{
"close": 98.3969,
"date": "2025-01-06",
"high": 100.5404,
"low": 97.2069,
"lower": null,
"open": 99.3404,
"signal": 95.444993,
"upper": null,
"value": 98.3969,
"volume": 1415
},
{
"close": 96.4177,
"date": "2025-01-02",
"high": 97.6977,
"low": 94.6097,
"lower": null,
"open": 95.7997,
"signal": 93.52516899999999,
"upper": null,
"value": 96.4177,
"volume": 1144
}
];
const options = {
"accessibility": {
"description": "Every indicator is calculated from the same coherent OHLCV market history. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Technical indicator · Sparse and irregular structure"
},
"axes": {
"x": {
"format": {
"dateStyle": "long",
"timeZone": "UTC",
"type": "date"
}
}
},
"height": 620,
"interaction": {
"hover": true,
"tooltip": {
"axis": "x",
"fields": [
{
"dateStyle": "long",
"field": "date",
"format": "date",
"label": "Date",
"timeZone": "UTC"
},
{
"field": "value",
"format": "number",
"label": "Value"
},
{
"field": "open",
"format": "number",
"label": "Open"
},
{
"field": "high",
"format": "number",
"label": "High"
},
{
"field": "low",
"format": "number",
"label": "Low"
},
{
"field": "close",
"format": "number",
"label": "Close"
},
{
"field": "volume",
"format": "number",
"label": "Volume"
},
{
"field": "lower",
"format": "number",
"label": "Lower"
},
{
"field": "upper",
"format": "number",
"label": "Upper"
},
{
"field": "signal",
"format": "number",
"label": "Signal"
}
],
"title": "Technical indicator · Sparse and irregular structure",
"trigger": "axis"
}
},
"locale": "en",
"mark": {
"fields": {
"middle": "value",
"signal": "signal",
"value": "value"
},
"options": {
"fields": [
"value",
"signal"
],
"kind": "sma"
}
},
"title": {
"subtitle": "edge case · structure",
"text": "Technical indicator · Sparse and irregular structure"
},
"width": "container",
"x": {
"field": "date",
"title": "Trading day",
"type": "temporal"
},
"y": {
"field": "value",
"title": "value",
"type": "quantitative"
}
};
Graflume.technicalIndicator('#chart', data, options);Portable schema
ChartSpec 0.1 · options
{
"accessibility": {
"description": "Every indicator is calculated from the same coherent OHLCV market history. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Technical indicator · Sparse and irregular structure"
},
"axes": {
"x": {
"format": {
"dateStyle": "long",
"timeZone": "UTC",
"type": "date"
}
}
},
"height": 620,
"interaction": {
"hover": true,
"tooltip": {
"axis": "x",
"fields": [
{
"dateStyle": "long",
"field": "date",
"format": "date",
"label": "Date",
"timeZone": "UTC"
},
{
"field": "value",
"format": "number",
"label": "Value"
},
{
"field": "open",
"format": "number",
"label": "Open"
},
{
"field": "high",
"format": "number",
"label": "High"
},
{
"field": "low",
"format": "number",
"label": "Low"
},
{
"field": "close",
"format": "number",
"label": "Close"
},
{
"field": "volume",
"format": "number",
"label": "Volume"
},
{
"field": "lower",
"format": "number",
"label": "Lower"
},
{
"field": "upper",
"format": "number",
"label": "Upper"
},
{
"field": "signal",
"format": "number",
"label": "Signal"
}
],
"title": "Technical indicator · Sparse and irregular structure",
"trigger": "axis"
}
},
"locale": "en",
"mark": {
"fields": {
"middle": "value",
"signal": "signal",
"value": "value"
},
"options": {
"fields": [
"value",
"signal"
],
"kind": "sma"
}
},
"title": {
"subtitle": "edge case · structure",
"text": "Technical indicator · Sparse and irregular structure"
},
"width": "container",
"x": {
"field": "date",
"title": "Trading day",
"type": "temporal"
},
"y": {
"field": "value",
"title": "value",
"type": "quantitative"
}
}High data volume
Materialize a deterministic compact recipe only when this tab opens. Graflume's performance profile bounds mark count, hit testing, and animation work for the input size. It applies 6 high-volume rules for deterministic generation and bounded output. This family materializes 100,000 logical rows and bounds rendered line points at 8,000.
StatusLoading
high-row-cardinalityall-input-rows-generatedall-input-rows-processeddeterministic-generationbounded-renderinginput:100000zoom-pan-resetbudget:line-points<=8000
- Legend:
legend · explicit · 3 channels - Point and range highlights:
highlights[] · datum · date - Custom callouts:
annotations[] · datum · date · callout · placement:auto
Loading
Browser API · Portable schema
Browser API
Graflume.technicalIndicator()
const recipe = {
"cardinality": {
"axes": {},
"sourceRows": 100000,
"unit": "rows"
},
"expectedInvariants": [
"finite-json",
"ohlcv-low-order",
"ohlcv-high-order",
"volume-nonnegative"
],
"id": "ohlcv-sequence",
"initialView": {
"kind": "domain",
"zoom": 1
},
"outputBudget": {
"maximum": 8000,
"resource": "line-points"
},
"parameters": {
"explicitPerformance": true,
"family": "technical-indicator",
"nullableFields": [
"value",
"signal"
],
"positiveFields": [
"volume"
],
"scenario": "volume",
"valueFields": [
"value",
"signal",
"open",
"high",
"low",
"close"
],
"valuePolicy": "ohlcv"
},
"preview": {
"maximumRows": 12,
"method": "quantiles"
},
"reduction": {
"method": "ohlcv-time-bins",
"stage": "bin"
},
"seed": 930467332,
"shape": "rows",
"version": 2
};
const { data, previewRows, plan } = Graflume.materializeDemoRecipe(recipe);
const options = {
"accessibility": {
"description": "Zoom and pan inspect the rendered surface without changing data axes or values. When playback controls are available, they move through real steps in the order each unique value first appears in the source data.",
"label": "Technical indicator · High data volume"
},
"annotations": [
{
"connector": {
"visible": true
},
"detail": "Attach user-authored safe text to a datum, axis range, or normalized plot position.",
"id": "manual-callout",
"placement": "auto",
"style": {
"maxWidth": 220,
"padding": 8
},
"target": {
"field": "date",
"type": "datum",
"value": "2025-07-09"
},
"text": "Point and range highlights · 2025-07-09"
}
],
"axes": {
"x": {
"format": {
"dateStyle": "long",
"timeZone": "UTC",
"type": "date"
}
}
},
"create": {
"adaptive": {
"environment": {
"rowCount": 100000
},
"largeDataNavigation": true,
"profiles": "auto"
}
},
"height": 620,
"highlights": [
{
"id": "manual-focus",
"padding": 7,
"target": {
"field": "date",
"type": "datum",
"value": "2025-07-09"
}
}
],
"interaction": {
"controls": {
"annotations": false,
"export": true,
"fullscreen": true,
"labels": {
"controls": "Chart controls",
"enterFullscreen": "Enter fullscreen",
"exitFullscreen": "Exit fullscreen",
"exportPng": "Download PNG",
"hideAnnotations": "Hide callouts",
"loop": "Loop playback",
"nextFrame": "Next frame",
"pause": "Pause",
"play": "Play",
"previousFrame": "Previous frame",
"reset": "Reset view",
"seek": "Playback position",
"showAnnotations": "Show callouts",
"speed": "Playback speed",
"zoomIn": "Zoom in",
"zoomOut": "Zoom out"
},
"playback": false,
"reset": true,
"zoom": true
},
"hover": true,
"navigation": {
"drag": true,
"keyboard": true,
"maxZoom": 6,
"minZoom": 1,
"pinch": true,
"wheel": "modifier"
},
"tooltip": {
"axis": "x",
"fields": [
{
"dateStyle": "long",
"field": "date",
"format": "date",
"label": "Date",
"timeZone": "UTC"
},
{
"field": "value",
"format": "number",
"label": "Value"
},
{
"field": "open",
"format": "number",
"label": "Open"
},
{
"field": "high",
"format": "number",
"label": "High"
},
{
"field": "low",
"format": "number",
"label": "Low"
},
{
"field": "close",
"format": "number",
"label": "Close"
},
{
"field": "volume",
"format": "number",
"label": "Volume"
},
{
"field": "lower",
"format": "number",
"label": "Lower"
},
{
"field": "upper",
"format": "number",
"label": "Upper"
},
{
"field": "signal",
"format": "number",
"label": "Signal"
}
],
"title": "Technical indicator · High data volume",
"trigger": "axis"
}
},
"legend": {
"interactive": false,
"items": [
{
"id": "semantic-0",
"label": "Value"
},
{
"id": "semantic-1",
"label": "Signal"
},
{
"id": "semantic-2",
"label": "Lower–upper band"
}
],
"labels": {
"hide": "Hide",
"show": "Show"
},
"maxItems": 8,
"mode": "layers",
"orientation": "horizontal",
"position": "bottom",
"title": "Technical indicator · High data volume",
"visible": true
},
"locale": "en",
"mark": {
"fields": {
"middle": "value",
"signal": "signal",
"value": "value"
},
"options": {
"fields": [
"value",
"signal"
],
"kind": "sma"
}
},
"padding": {
"top": 52
},
"performance": "ultra",
"theme": "graflume-light",
"title": {
"subtitle": "Every indicator is calculated from the same coherent OHLCV market history · 100,000 logical rows, screen-aware detail",
"text": "Technical indicator · High data volume"
},
"width": "container",
"x": {
"field": "date",
"title": "Trading day",
"type": "temporal"
},
"y": {
"field": "value",
"title": "value",
"type": "quantitative"
}
};
Graflume.technicalIndicator('#chart', data, options);Portable schema
ChartSpec 0.1 · options
{
"accessibility": {
"description": "Zoom and pan inspect the rendered surface without changing data axes or values. When playback controls are available, they move through real steps in the order each unique value first appears in the source data.",
"label": "Technical indicator · High data volume"
},
"annotations": [
{
"connector": {
"visible": true
},
"detail": "Attach user-authored safe text to a datum, axis range, or normalized plot position.",
"id": "manual-callout",
"placement": "auto",
"style": {
"maxWidth": 220,
"padding": 8
},
"target": {
"field": "date",
"type": "datum",
"value": "2025-07-09"
},
"text": "Point and range highlights · 2025-07-09"
}
],
"axes": {
"x": {
"format": {
"dateStyle": "long",
"timeZone": "UTC",
"type": "date"
}
}
},
"create": {
"adaptive": {
"environment": {
"rowCount": 100000
},
"largeDataNavigation": true,
"profiles": "auto"
}
},
"height": 620,
"highlights": [
{
"id": "manual-focus",
"padding": 7,
"target": {
"field": "date",
"type": "datum",
"value": "2025-07-09"
}
}
],
"interaction": {
"controls": {
"annotations": false,
"export": true,
"fullscreen": true,
"labels": {
"controls": "Chart controls",
"enterFullscreen": "Enter fullscreen",
"exitFullscreen": "Exit fullscreen",
"exportPng": "Download PNG",
"hideAnnotations": "Hide callouts",
"loop": "Loop playback",
"nextFrame": "Next frame",
"pause": "Pause",
"play": "Play",
"previousFrame": "Previous frame",
"reset": "Reset view",
"seek": "Playback position",
"showAnnotations": "Show callouts",
"speed": "Playback speed",
"zoomIn": "Zoom in",
"zoomOut": "Zoom out"
},
"playback": false,
"reset": true,
"zoom": true
},
"hover": true,
"navigation": {
"drag": true,
"keyboard": true,
"maxZoom": 6,
"minZoom": 1,
"pinch": true,
"wheel": "modifier"
},
"tooltip": {
"axis": "x",
"fields": [
{
"dateStyle": "long",
"field": "date",
"format": "date",
"label": "Date",
"timeZone": "UTC"
},
{
"field": "value",
"format": "number",
"label": "Value"
},
{
"field": "open",
"format": "number",
"label": "Open"
},
{
"field": "high",
"format": "number",
"label": "High"
},
{
"field": "low",
"format": "number",
"label": "Low"
},
{
"field": "close",
"format": "number",
"label": "Close"
},
{
"field": "volume",
"format": "number",
"label": "Volume"
},
{
"field": "lower",
"format": "number",
"label": "Lower"
},
{
"field": "upper",
"format": "number",
"label": "Upper"
},
{
"field": "signal",
"format": "number",
"label": "Signal"
}
],
"title": "Technical indicator · High data volume",
"trigger": "axis"
}
},
"legend": {
"interactive": false,
"items": [
{
"id": "semantic-0",
"label": "Value"
},
{
"id": "semantic-1",
"label": "Signal"
},
{
"id": "semantic-2",
"label": "Lower–upper band"
}
],
"labels": {
"hide": "Hide",
"show": "Show"
},
"maxItems": 8,
"mode": "layers",
"orientation": "horizontal",
"position": "bottom",
"title": "Technical indicator · High data volume",
"visible": true
},
"locale": "en",
"mark": {
"fields": {
"middle": "value",
"signal": "signal",
"value": "value"
},
"options": {
"fields": [
"value",
"signal"
],
"kind": "sma"
}
},
"padding": {
"top": 52
},
"performance": "ultra",
"theme": "graflume-light",
"title": {
"subtitle": "Every indicator is calculated from the same coherent OHLCV market history · 100,000 logical rows, screen-aware detail",
"text": "Technical indicator · High data volume"
},
"width": "container",
"x": {
"field": "date",
"title": "Trading day",
"type": "temporal"
},
"y": {
"field": "value",
"title": "value",
"type": "quantitative"
}
}