minerva-design 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +21 -21
- package/custom-elements.json +4047 -1703
- package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +573 -4
- package/dist/charts/canvas.d.cts +2 -2
- package/dist/charts/canvas.d.ts +2 -2
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +6 -4
- package/dist/charts/core.d.ts +6 -4
- package/dist/charts/core.js +24 -16
- package/dist/charts/engine/axis.cjs +1 -1
- package/dist/charts/engine/axis.cjs.map +1 -1
- package/dist/charts/engine/axis.js +42 -19
- package/dist/charts/engine/axis.js.map +1 -1
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +154 -127
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +365 -251
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +18 -0
- package/dist/charts/engine/color.d.ts +18 -0
- package/dist/charts/engine/color.js +48 -2
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +32 -1
- package/dist/charts/engine/controller.d.ts +32 -1
- package/dist/charts/engine/controller.js +310 -263
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +3 -1
- package/dist/charts/engine/data.d.ts +3 -1
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +2 -0
- package/dist/charts/engine/defaults.cjs.map +1 -0
- package/dist/charts/engine/defaults.d.cts +20 -0
- package/dist/charts/engine/defaults.d.ts +20 -0
- package/dist/charts/engine/defaults.js +35 -0
- package/dist/charts/engine/defaults.js.map +1 -0
- package/dist/charts/engine/format.cjs +1 -1
- package/dist/charts/engine/format.cjs.map +1 -1
- package/dist/charts/engine/format.d.cts +6 -0
- package/dist/charts/engine/format.d.ts +6 -0
- package/dist/charts/engine/format.js +15 -2
- package/dist/charts/engine/format.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +2 -0
- package/dist/charts/engine/graph/chart.cjs.map +1 -0
- package/dist/charts/engine/graph/chart.d.cts +3 -0
- package/dist/charts/engine/graph/chart.d.ts +3 -0
- package/dist/charts/engine/graph/chart.js +1565 -0
- package/dist/charts/engine/graph/chart.js.map +1 -0
- package/dist/charts/engine/graph/circular.cjs +2 -0
- package/dist/charts/engine/graph/circular.cjs.map +1 -0
- package/dist/charts/engine/graph/circular.d.cts +16 -0
- package/dist/charts/engine/graph/circular.d.ts +16 -0
- package/dist/charts/engine/graph/circular.js +62 -0
- package/dist/charts/engine/graph/circular.js.map +1 -0
- package/dist/charts/engine/graph/dag.cjs +2 -0
- package/dist/charts/engine/graph/dag.cjs.map +1 -0
- package/dist/charts/engine/graph/dag.d.cts +34 -0
- package/dist/charts/engine/graph/dag.d.ts +34 -0
- package/dist/charts/engine/graph/dag.js +314 -0
- package/dist/charts/engine/graph/dag.js.map +1 -0
- package/dist/charts/engine/graph/dom.cjs +2 -0
- package/dist/charts/engine/graph/dom.cjs.map +1 -0
- package/dist/charts/engine/graph/dom.d.cts +23 -0
- package/dist/charts/engine/graph/dom.d.ts +23 -0
- package/dist/charts/engine/graph/dom.js +158 -0
- package/dist/charts/engine/graph/dom.js.map +1 -0
- package/dist/charts/engine/graph/force.cjs +2 -0
- package/dist/charts/engine/graph/force.cjs.map +1 -0
- package/dist/charts/engine/graph/force.d.cts +67 -0
- package/dist/charts/engine/graph/force.d.ts +67 -0
- package/dist/charts/engine/graph/force.js +325 -0
- package/dist/charts/engine/graph/force.js.map +1 -0
- package/dist/charts/engine/graph/geometry.cjs +2 -0
- package/dist/charts/engine/graph/geometry.cjs.map +1 -0
- package/dist/charts/engine/graph/geometry.d.cts +37 -0
- package/dist/charts/engine/graph/geometry.d.ts +37 -0
- package/dist/charts/engine/graph/geometry.js +144 -0
- package/dist/charts/engine/graph/geometry.js.map +1 -0
- package/dist/charts/engine/graph/index.cjs +1 -0
- package/dist/charts/engine/graph/index.d.cts +6 -0
- package/dist/charts/engine/graph/index.d.ts +6 -0
- package/dist/charts/engine/graph/index.js +6 -0
- package/dist/charts/engine/graph/labels.cjs +2 -0
- package/dist/charts/engine/graph/labels.cjs.map +1 -0
- package/dist/charts/engine/graph/labels.d.cts +12 -0
- package/dist/charts/engine/graph/labels.d.ts +12 -0
- package/dist/charts/engine/graph/labels.js +128 -0
- package/dist/charts/engine/graph/labels.js.map +1 -0
- package/dist/charts/engine/graph/model.cjs +2 -0
- package/dist/charts/engine/graph/model.cjs.map +1 -0
- package/dist/charts/engine/graph/model.d.cts +43 -0
- package/dist/charts/engine/graph/model.d.ts +43 -0
- package/dist/charts/engine/graph/model.js +88 -0
- package/dist/charts/engine/graph/model.js.map +1 -0
- package/dist/charts/engine/graph/sizing.cjs +2 -0
- package/dist/charts/engine/graph/sizing.cjs.map +1 -0
- package/dist/charts/engine/graph/sizing.d.cts +33 -0
- package/dist/charts/engine/graph/sizing.d.ts +33 -0
- package/dist/charts/engine/graph/sizing.js +60 -0
- package/dist/charts/engine/graph/sizing.js.map +1 -0
- package/dist/charts/engine/graph/tree.cjs +2 -0
- package/dist/charts/engine/graph/tree.cjs.map +1 -0
- package/dist/charts/engine/graph/tree.d.cts +30 -0
- package/dist/charts/engine/graph/tree.d.ts +30 -0
- package/dist/charts/engine/graph/tree.js +218 -0
- package/dist/charts/engine/graph/tree.js.map +1 -0
- package/dist/charts/engine/graph/types.d.cts +626 -0
- package/dist/charts/engine/graph/types.d.ts +626 -0
- package/dist/charts/engine/graph/worker.cjs +46 -0
- package/dist/charts/engine/graph/worker.cjs.map +1 -0
- package/dist/charts/engine/graph/worker.d.cts +36 -0
- package/dist/charts/engine/graph/worker.d.ts +36 -0
- package/dist/charts/engine/graph/worker.js +129 -0
- package/dist/charts/engine/graph/worker.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.d.cts +15 -2
- package/dist/charts/engine/items.d.ts +15 -2
- package/dist/charts/engine/items.js +131 -112
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/labels.cjs +1 -1
- package/dist/charts/engine/labels.cjs.map +1 -1
- package/dist/charts/engine/labels.js +28 -4
- package/dist/charts/engine/labels.js.map +1 -1
- package/dist/charts/engine/layout.cjs +1 -1
- package/dist/charts/engine/layout.cjs.map +1 -1
- package/dist/charts/engine/layout.d.cts +9 -0
- package/dist/charts/engine/layout.d.ts +9 -0
- package/dist/charts/engine/layout.js +11 -2
- package/dist/charts/engine/layout.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +40 -3
- package/dist/charts/engine/model.d.ts +40 -3
- package/dist/charts/engine/model.js +246 -165
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/format.cjs +1 -1
- package/dist/charts/engine/orderbook/format.cjs.map +1 -1
- package/dist/charts/engine/orderbook/format.d.cts +3 -2
- package/dist/charts/engine/orderbook/format.d.ts +3 -2
- package/dist/charts/engine/orderbook/format.js +5 -5
- package/dist/charts/engine/orderbook/format.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +527 -408
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/layout.cjs +2 -0
- package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
- package/dist/charts/engine/orderbook/layout.d.cts +37 -0
- package/dist/charts/engine/orderbook/layout.d.ts +37 -0
- package/dist/charts/engine/orderbook/layout.js +70 -0
- package/dist/charts/engine/orderbook/layout.js.map +1 -0
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +1 -1
- package/dist/charts/engine/orderbook/tape.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +18 -2
- package/dist/charts/engine/orderbook/types.d.ts +18 -2
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +10 -0
- package/dist/charts/engine/overlay.d.ts +10 -0
- package/dist/charts/engine/overlay.js +6 -0
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +25 -3
- package/dist/charts/engine/presets.d.ts +25 -3
- package/dist/charts/engine/presets.js +115 -101
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/detect.cjs +1 -1
- package/dist/charts/engine/renderers/detect.cjs.map +1 -1
- package/dist/charts/engine/renderers/detect.d.cts +2 -1
- package/dist/charts/engine/renderers/detect.d.ts +2 -1
- package/dist/charts/engine/renderers/detect.js +23 -21
- package/dist/charts/engine/renderers/detect.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +57 -4
- package/dist/charts/engine/scene.d.ts +57 -4
- package/dist/charts/engine/scene.js +335 -182
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +110 -110
- package/dist/charts/engine/shapes/bullet.js.map +1 -1
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.js +4 -1
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/chord.cjs +2 -0
- package/dist/charts/engine/shapes/chord.cjs.map +1 -0
- package/dist/charts/engine/shapes/chord.d.cts +18 -0
- package/dist/charts/engine/shapes/chord.d.ts +18 -0
- package/dist/charts/engine/shapes/chord.js +414 -0
- package/dist/charts/engine/shapes/chord.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.d.cts +5 -1
- package/dist/charts/engine/shapes/draw.d.ts +5 -1
- package/dist/charts/engine/shapes/draw.js +47 -17
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/hit.cjs +1 -1
- package/dist/charts/engine/shapes/hit.cjs.map +1 -1
- package/dist/charts/engine/shapes/hit.d.cts +3 -1
- package/dist/charts/engine/shapes/hit.d.ts +3 -1
- package/dist/charts/engine/shapes/hit.js +75 -46
- package/dist/charts/engine/shapes/hit.js.map +1 -1
- package/dist/charts/engine/shapes/index.d.cts +3 -2
- package/dist/charts/engine/shapes/index.d.ts +3 -2
- package/dist/charts/engine/shapes/labels.cjs +1 -1
- package/dist/charts/engine/shapes/labels.cjs.map +1 -1
- package/dist/charts/engine/shapes/labels.js +12 -4
- package/dist/charts/engine/shapes/labels.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +3 -1
- package/dist/charts/engine/shapes/layout.d.ts +3 -1
- package/dist/charts/engine/shapes/layout.js +106 -78
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/scene.cjs +1 -1
- package/dist/charts/engine/shapes/scene.cjs.map +1 -1
- package/dist/charts/engine/shapes/scene.d.cts +33 -3
- package/dist/charts/engine/shapes/scene.d.ts +33 -3
- package/dist/charts/engine/shapes/scene.js +62 -19
- package/dist/charts/engine/shapes/scene.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +119 -8
- package/dist/charts/engine/shapes/types.d.ts +119 -8
- package/dist/charts/engine/signature.cjs +1 -1
- package/dist/charts/engine/signature.cjs.map +1 -1
- package/dist/charts/engine/signature.js +1 -1
- package/dist/charts/engine/signature.js.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
- package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
- package/dist/charts/engine/three-d/canvas2d.js +89 -65
- package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
- package/dist/charts/engine/three-d/detect.cjs +1 -1
- package/dist/charts/engine/three-d/detect.cjs.map +1 -1
- package/dist/charts/engine/three-d/detect.d.cts +3 -2
- package/dist/charts/engine/three-d/detect.d.ts +3 -2
- package/dist/charts/engine/three-d/detect.js +22 -20
- package/dist/charts/engine/three-d/detect.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.d.cts +6 -0
- package/dist/charts/engine/three-d/geometry.d.ts +6 -0
- package/dist/charts/engine/three-d/geometry.js +106 -90
- package/dist/charts/engine/three-d/geometry.js.map +1 -1
- package/dist/charts/engine/three-d/model.cjs +1 -1
- package/dist/charts/engine/three-d/model.cjs.map +1 -1
- package/dist/charts/engine/three-d/model.d.cts +2 -0
- package/dist/charts/engine/three-d/model.d.ts +2 -0
- package/dist/charts/engine/three-d/model.js +2 -0
- package/dist/charts/engine/three-d/model.js.map +1 -1
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +43 -36
- package/dist/charts/engine/three-d/overlay.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +24 -3
- package/dist/charts/engine/three-d/render-types.d.ts +24 -3
- package/dist/charts/engine/three-d/render-types.js +6 -7
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +63 -28
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +2 -3
- package/dist/charts/engine/three-d/shaders.d.ts +2 -3
- package/dist/charts/engine/three-d/shaders.js +41 -22
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/sort.cjs +1 -1
- package/dist/charts/engine/three-d/sort.cjs.map +1 -1
- package/dist/charts/engine/three-d/sort.d.cts +15 -4
- package/dist/charts/engine/three-d/sort.d.ts +15 -4
- package/dist/charts/engine/three-d/sort.js +117 -43
- package/dist/charts/engine/three-d/sort.js.map +1 -1
- package/dist/charts/engine/three-d/types.d.cts +27 -0
- package/dist/charts/engine/three-d/types.d.ts +27 -0
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +15 -13
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +50 -39
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.d.cts +10 -0
- package/dist/charts/engine/trading/chart.d.ts +10 -0
- package/dist/charts/engine/trading/chart.js +1475 -776
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/drawings.cjs +2 -1
- package/dist/charts/engine/trading/drawings.cjs.map +1 -1
- package/dist/charts/engine/trading/drawings.d.cts +47 -9
- package/dist/charts/engine/trading/drawings.d.ts +47 -9
- package/dist/charts/engine/trading/drawings.js +338 -75
- package/dist/charts/engine/trading/drawings.js.map +1 -1
- package/dist/charts/engine/trading/format.cjs +1 -1
- package/dist/charts/engine/trading/format.cjs.map +1 -1
- package/dist/charts/engine/trading/format.d.cts +13 -0
- package/dist/charts/engine/trading/format.d.ts +13 -0
- package/dist/charts/engine/trading/format.js +51 -19
- package/dist/charts/engine/trading/format.js.map +1 -1
- package/dist/charts/engine/trading/index.cjs +1 -1
- package/dist/charts/engine/trading/index.d.cts +2 -1
- package/dist/charts/engine/trading/index.d.ts +2 -1
- package/dist/charts/engine/trading/index.js +4 -3
- package/dist/charts/engine/trading/indicators.cjs +1 -1
- package/dist/charts/engine/trading/indicators.cjs.map +1 -1
- package/dist/charts/engine/trading/indicators.d.cts +180 -10
- package/dist/charts/engine/trading/indicators.d.ts +180 -10
- package/dist/charts/engine/trading/indicators.js +449 -173
- package/dist/charts/engine/trading/indicators.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +84 -4
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/store.cjs +1 -1
- package/dist/charts/engine/trading/store.cjs.map +1 -1
- package/dist/charts/engine/trading/store.d.cts +21 -0
- package/dist/charts/engine/trading/store.d.ts +21 -0
- package/dist/charts/engine/trading/store.js +22 -1
- package/dist/charts/engine/trading/store.js.map +1 -1
- package/dist/charts/engine/trading/studies.cjs +1 -1
- package/dist/charts/engine/trading/studies.cjs.map +1 -1
- package/dist/charts/engine/trading/studies.d.cts +41 -8
- package/dist/charts/engine/trading/studies.d.ts +41 -8
- package/dist/charts/engine/trading/studies.js +349 -93
- package/dist/charts/engine/trading/studies.js.map +1 -1
- package/dist/charts/engine/trading/sync.cjs +2 -0
- package/dist/charts/engine/trading/sync.cjs.map +1 -0
- package/dist/charts/engine/trading/sync.d.cts +8 -0
- package/dist/charts/engine/trading/sync.d.ts +8 -0
- package/dist/charts/engine/trading/sync.js +25 -0
- package/dist/charts/engine/trading/sync.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +484 -9
- package/dist/charts/engine/trading/types.d.ts +484 -9
- package/dist/charts/engine/types.d.cts +82 -8
- package/dist/charts/engine/types.d.ts +82 -8
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +3 -2
- package/dist/charts/index.d.ts +3 -2
- package/dist/charts/index.js +30 -22
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.js +46 -34
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/graph.cjs +2 -0
- package/dist/charts/react/graph.cjs.map +1 -0
- package/dist/charts/react/graph.d.cts +213 -0
- package/dist/charts/react/graph.d.ts +213 -0
- package/dist/charts/react/graph.js +159 -0
- package/dist/charts/react/graph.js.map +1 -0
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +87 -4
- package/dist/charts/react/shapes.d.ts +87 -4
- package/dist/charts/react/shapes.js +55 -12
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/charts/react/trading.cjs +1 -1
- package/dist/charts/react/trading.cjs.map +1 -1
- package/dist/charts/react/trading.d.cts +53 -1
- package/dist/charts/react/trading.d.ts +53 -1
- package/dist/charts/react/trading.js +68 -37
- package/dist/charts/react/trading.js.map +1 -1
- package/dist/charts/react/types.d.cts +11 -0
- package/dist/charts/react/types.d.ts +11 -0
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +3 -3
- package/dist/native/charts/src/engine/axis.cjs +1 -1
- package/dist/native/charts/src/engine/axis.cjs.map +1 -1
- package/dist/native/charts/src/engine/axis.js +42 -19
- package/dist/native/charts/src/engine/axis.js.map +1 -1
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +47 -5
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +300 -253
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/format.cjs +1 -1
- package/dist/native/charts/src/engine/format.cjs.map +1 -1
- package/dist/native/charts/src/engine/format.js +15 -2
- package/dist/native/charts/src/engine/format.js.map +1 -1
- package/dist/native/charts/src/engine/labels.cjs +1 -1
- package/dist/native/charts/src/engine/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/labels.js +28 -4
- package/dist/native/charts/src/engine/labels.js.map +1 -1
- package/dist/native/charts/src/engine/layout.cjs +1 -1
- package/dist/native/charts/src/engine/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/layout.js +11 -2
- package/dist/native/charts/src/engine/layout.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +252 -171
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +2 -2
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +104 -90
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +341 -188
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
- package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
- package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
- package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
- package/dist/native/charts/src/engine/shapes/chord.js +414 -0
- package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +47 -17
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.js +73 -44
- package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.js +12 -4
- package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +117 -90
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.js +62 -19
- package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +140 -71
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/components/Charts/charts.cjs +1 -1
- package/dist/native/components/Charts/charts.cjs.map +1 -1
- package/dist/native/components/Charts/charts.js +54 -42
- package/dist/native/components/Charts/charts.js.map +1 -1
- package/dist/native/components/Charts/types.d.cts +11 -0
- package/dist/native/components/Charts/types.d.ts +11 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
- package/dist/native/components/ShapeChart/charts.cjs +1 -1
- package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
- package/dist/native/components/ShapeChart/charts.d.cts +6 -1
- package/dist/native/components/ShapeChart/charts.d.ts +6 -1
- package/dist/native/components/ShapeChart/charts.js +138 -96
- package/dist/native/components/ShapeChart/charts.js.map +1 -1
- package/dist/native/components/ShapeChart/draw.cjs +1 -1
- package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
- package/dist/native/components/ShapeChart/draw.d.cts +1 -1
- package/dist/native/components/ShapeChart/draw.d.ts +1 -1
- package/dist/native/components/ShapeChart/draw.js +26 -17
- package/dist/native/components/ShapeChart/draw.js.map +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
- package/dist/native/components/ShapeChart/geometry.js +138 -59
- package/dist/native/components/ShapeChart/geometry.js.map +1 -1
- package/dist/native/components/ShapeChart/index.cjs +1 -1
- package/dist/native/components/ShapeChart/index.d.cts +1 -1
- package/dist/native/components/ShapeChart/index.d.ts +1 -1
- package/dist/native/components/ShapeChart/index.js +2 -2
- package/dist/native/components/ShapeChart/recorder.cjs +1 -1
- package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
- package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
- package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
- package/dist/native/components/ShapeChart/recorder.js +19 -10
- package/dist/native/components/ShapeChart/recorder.js.map +1 -1
- package/dist/native/components/ShapeChart/types.d.cts +92 -7
- package/dist/native/components/ShapeChart/types.d.ts +92 -7
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.js +2 -2
- package/dist/native/source/components/Chart/scene.tsx +158 -14
- package/dist/native/source/components/Charts/charts.tsx +30 -2
- package/dist/native/source/components/Charts/types.ts +11 -0
- package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
- package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
- package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
- package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
- package/dist/native/source/components/ShapeChart/index.ts +1 -0
- package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
- package/dist/native/source/components/ShapeChart/types.ts +96 -5
- package/dist/native/source/manifest.ts +1 -0
- package/dist/taro/charts.d.ts +25 -5
- package/dist/taro/index.js +3900 -2836
- package/dist/taro/shape-charts.d.ts +96 -4
- package/dist/uni/AreaChart.vue.d.ts +5 -1
- package/dist/uni/Badge.vue.d.ts +1 -1
- package/dist/uni/BarChart.vue.d.ts +5 -1
- package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
- package/dist/uni/BubbleChart.vue.d.ts +4 -0
- package/dist/uni/BulletChart.vue.d.ts +4 -0
- package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/uni/CandlestickChart.vue.d.ts +4 -0
- package/dist/uni/Chart.vue.d.ts +4 -0
- package/dist/uni/ChordChart.vue +93 -0
- package/dist/uni/ChordChart.vue.d.ts +136 -0
- package/dist/uni/DonutChart.vue.d.ts +4 -0
- package/dist/uni/FunnelChart.vue.d.ts +4 -0
- package/dist/uni/GanttChart.vue.d.ts +4 -0
- package/dist/uni/GaugeChart.vue.d.ts +4 -0
- package/dist/uni/HeatmapChart.vue.d.ts +8 -2
- package/dist/uni/HistogramChart.vue.d.ts +4 -0
- package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
- package/dist/uni/LineChart.vue.d.ts +4 -0
- package/dist/uni/MixedChart.vue.d.ts +4 -0
- package/dist/uni/PieChart.vue.d.ts +4 -0
- package/dist/uni/QuadrantChart.vue.d.ts +4 -0
- package/dist/uni/RadarChart.vue.d.ts +4 -0
- package/dist/uni/RadialBarChart.vue.d.ts +4 -0
- package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
- package/dist/uni/SankeyChart.vue.d.ts +4 -0
- package/dist/uni/ScatterChart.vue.d.ts +4 -0
- package/dist/uni/Sparkline.vue.d.ts +4 -0
- package/dist/uni/SunburstChart.vue.d.ts +4 -0
- package/dist/uni/ToastProvider.vue.d.ts +1 -1
- package/dist/uni/TreemapChart.vue.d.ts +4 -0
- package/dist/uni/WaterfallChart.vue.d.ts +9 -0
- package/dist/uni/chart-canvas.d.ts +3 -0
- package/dist/uni/chart-canvas.js +4 -0
- package/dist/uni/chart-types.d.ts +28 -4
- package/dist/uni/chart-types.js +26 -2
- package/dist/uni/charts-canvas.js +1 -1
- package/dist/uni/index.d.ts +2 -1
- package/dist/uni/index.js +1 -0
- package/dist/uni/manifest.d.ts +7 -0
- package/dist/uni/manifest.js +10 -0
- package/dist/uni/named-chart-options.d.ts +9 -2
- package/dist/uni/named-chart-options.js +18 -1
- package/dist/uni/shape-chart-canvas.d.ts +3 -1
- package/dist/uni/shape-chart-canvas.js +15 -24
- package/dist/uni/shape-chart-types.d.ts +52 -2
- package/dist/uni/shape-chart-types.js +44 -0
- package/dist/vue/charts-global.d.ts +48 -0
- package/dist/vue/charts.d.ts +18 -0
- package/dist/vue/charts.js +56 -0
- package/dist/vue/charts.js.map +1 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
- package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
- package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
- package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
- package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
- package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
- package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
- package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
- package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
- package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
- package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/graph.d.ts +153 -0
- package/dist/vue/components/Chart/graph.js +135 -0
- package/dist/vue/components/Chart/graph.js.map +1 -0
- package/dist/vue/components/Chart/index.d.ts +5 -1
- package/dist/vue/components/Chart/index.js +5 -1
- package/dist/vue/components/Chart/orderbook.d.ts +5 -1
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/vue/components/Chart/trading.d.ts +24 -2
- package/dist/vue/components/Chart/trading.js +8 -0
- package/dist/vue/components/Chart/trading.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +74 -2
- package/dist/vue/global.d.ts +2 -38
- package/dist/vue/groups/charts.js +10 -2
- package/dist/vue/groups/charts.js.map +1 -1
- package/dist/vue/index.js +6 -2
- package/dist/vue/internal/register.d.ts +7 -0
- package/dist/vue/internal/register.js +14 -0
- package/dist/vue/internal/register.js.map +1 -0
- package/dist/vue/plugin.d.ts +9 -4
- package/dist/vue/plugin.js +6 -11
- package/dist/vue/plugin.js.map +1 -1
- package/dist/weapp/charts/canvas.js +1687 -147
- package/dist/weapp/charts/core.js +1 -0
- package/dist/weapp/chord-chart/index.js +1 -0
- package/dist/weapp/chord-chart/index.json +1 -0
- package/dist/weapp/chord-chart/index.wxml +1 -0
- package/dist/weapp/chord-chart/index.wxss +1 -0
- package/dist/weapp/controls.js +92 -32
- package/dist/weapp/types.d.ts +87 -4
- package/dist/web-components/components/chart/charts.d.ts +4 -2
- package/dist/web-components/components/chart/charts.js +8 -1
- package/dist/web-components/components/chart/charts.js.map +1 -1
- package/dist/web-components/components/chart/extended.d.ts +17 -7
- package/dist/web-components/components/chart/extended.js +23 -9
- package/dist/web-components/components/chart/extended.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
- package/dist/web-components/components/chart/shapes-extended.js +27 -1
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/dist/web-components/components/graph/graph.d.ts +154 -0
- package/dist/web-components/components/graph/graph.js +149 -0
- package/dist/web-components/components/graph/graph.js.map +1 -0
- package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
- package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
- package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
- package/dist/web-components/elements/chart.d.ts +1 -1
- package/dist/web-components/elements/chart.js +6 -5
- package/dist/web-components/elements/chart.js.map +1 -1
- package/dist/web-components/elements/graph.d.ts +2 -0
- package/dist/web-components/elements/graph.js +12 -0
- package/dist/web-components/elements/graph.js.map +1 -0
- package/dist/web-components/html-custom-data.json +273 -4
- package/dist/web-components/types/react.d.ts +63 -4
- package/dist/web-components/types/solid.d.ts +55 -8
- package/dist/web-components/types/svelte.d.ts +55 -8
- package/dist/web-components/types/vue.d.ts +55 -4
- package/package.json +16 -1
|
@@ -60,3 +60,24 @@ export declare const invalidatePyramid: (pyramid: Pyramid, from: number) => void
|
|
|
60
60
|
* k - 1 for the stale groups only
|
|
61
61
|
*/
|
|
62
62
|
export declare const pyramidLevel: (pyramid: Pyramid, src: OhlcColumns, n: number, k: number) => LodLevel;
|
|
63
|
+
/** Lowest, highest and last finite value of each group of 2^k values */
|
|
64
|
+
export interface RangeLevel {
|
|
65
|
+
size: number;
|
|
66
|
+
min: Float64Array;
|
|
67
|
+
max: Float64Array;
|
|
68
|
+
last: Float64Array;
|
|
69
|
+
/** Groups up to date */
|
|
70
|
+
valid: number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Aggregated levels of a column of indicator values: a zoomed-out chart
|
|
74
|
+
* draws the range of each group (min / max decimation), so spikes stay
|
|
75
|
+
* visible instead of being sampled away
|
|
76
|
+
*/
|
|
77
|
+
export interface RangePyramid {
|
|
78
|
+
levels: (RangeLevel | undefined)[];
|
|
79
|
+
}
|
|
80
|
+
export declare const createRangePyramid: () => RangePyramid;
|
|
81
|
+
export declare const invalidateRangePyramid: (pyramid: RangePyramid, from: number) => void;
|
|
82
|
+
/** Level `k` (k >= 1) of the first `n` values, updated for the stale groups only */
|
|
83
|
+
export declare const rangeLevel: (pyramid: RangePyramid, values: Float64Array, n: number, k: number) => RangeLevel;
|
|
@@ -122,8 +122,29 @@ var e = [
|
|
|
122
122
|
c.time[e] = l.time[t], c.open[e] = l.open[t], n < u ? (c.high[e] = Math.max(l.high[t], l.high[n]), c.low[e] = Math.min(l.low[t], l.low[n]), c.close[e] = l.close[n], c.volume[e] = l.volume[t] + l.volume[n]) : (c.high[e] = l.high[t], c.low[e] = l.low[t], c.close[e] = l.close[t], c.volume[e] = l.volume[t]);
|
|
123
123
|
}
|
|
124
124
|
return c.valid = i % o === 0 ? s : s - 1, c;
|
|
125
|
+
}, v = () => ({ levels: [] }), y = (e, t) => {
|
|
126
|
+
for (let n of e.levels) n && (n.valid = Math.min(n.valid, Math.floor(t / n.size)));
|
|
127
|
+
}, b = (e, t) => Number.isFinite(e) ? Number.isFinite(t) ? e < t ? e : t : e : t, x = (e, t) => Number.isFinite(e) ? Number.isFinite(t) ? e > t ? e : t : e : t, S = (e, t, n, r) => {
|
|
128
|
+
let i = 2 ** r, a = Math.ceil(n / i), o = e.levels[r];
|
|
129
|
+
if (!o || o.min.length < a) {
|
|
130
|
+
let t = Math.max(16, Math.ceil(a * 1.5)), n = {
|
|
131
|
+
size: i,
|
|
132
|
+
min: new Float64Array(t),
|
|
133
|
+
max: new Float64Array(t),
|
|
134
|
+
last: new Float64Array(t),
|
|
135
|
+
valid: 0
|
|
136
|
+
};
|
|
137
|
+
o && (n.min.set(o.min.subarray(0, o.valid)), n.max.set(o.max.subarray(0, o.valid)), n.last.set(o.last.subarray(0, o.valid)), n.valid = o.valid), o = n, e.levels[r] = o;
|
|
138
|
+
}
|
|
139
|
+
if (o.valid >= a) return o;
|
|
140
|
+
let s = r > 1 ? S(e, t, n, r - 1) : null, c = r > 1 ? Math.ceil(n / (i / 2)) : n, l = Math.max(0, Math.min(o.valid, a - 1));
|
|
141
|
+
for (let e = l; e < a; e++) {
|
|
142
|
+
let n = e * 2, r = n + 1, i = r < c, a = s ? s.min[n] : t[n], l = s ? s.max[n] : t[n], u = s ? s.last[n] : t[n], d = i ? s ? s.min[r] : t[r] : NaN, f = i ? s ? s.max[r] : t[r] : NaN, p = i ? s ? s.last[r] : t[r] : NaN;
|
|
143
|
+
o.min[e] = b(a, d), o.max[e] = x(l, f), o.last[e] = Number.isFinite(p) ? p : u;
|
|
144
|
+
}
|
|
145
|
+
return o.valid = n % i === 0 ? a : a - 1, o;
|
|
125
146
|
};
|
|
126
147
|
//#endregion
|
|
127
|
-
export { l as appendBars, u as barAt, g as createPyramid, i as createStore, h as indexOfTime, n as inputLength, m as lowerBoundTime, f as prependBars, _ as pyramidLevel, p as readBar, c as setBars, d as updateBar };
|
|
148
|
+
export { l as appendBars, u as barAt, g as createPyramid, v as createRangePyramid, i as createStore, h as indexOfTime, n as inputLength, y as invalidateRangePyramid, m as lowerBoundTime, f as prependBars, _ as pyramidLevel, S as rangeLevel, p as readBar, c as setBars, d as updateBar };
|
|
128
149
|
|
|
129
150
|
//# sourceMappingURL=store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","names":["KEYS","isColumns","bars","inputLength","allocate","capacity","createStore","reserve","size","store","next","key","write","i","count","at","volume","v","writeBar","bar","setBars","n","appendBars","first","updateBar","barAt","last","prependBars","time","length","previous","readBar","columns","lowerBoundTime","lo","hi","mid","value","indexOfTime","createPyramid","pyramidLevel","k","groups","level","pyramid","prev","src","prevCount","from","g","a","b"],"sources":["../../../../../charts/src/engine/trading/store.ts"],"sourcesContent":["// Bars in growable Float64Array columns, and a pyramid of aggregated\n// levels (2, 4, 8, ... bars per group) drawn when the chart is zoomed out\n// so far that a bar is narrower than a pixel: a million bars cost the\n// same to draw as a thousand.\n\nimport type { TradingBar, TradingBarColumns, TradingBarsInput } from \"./types\";\n\n/** OHLCV columns; only the first `length` entries are meaningful */\nexport interface OhlcColumns {\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n volume: Float64Array;\n}\n\nexport interface BarStore extends OhlcColumns {\n length: number;\n /** Size of the columns */\n capacity: number;\n /** Some bar has a volume */\n hasVolume: boolean;\n}\n\nconst KEYS = [\"time\", \"open\", \"high\", \"low\", \"close\", \"volume\"] as const;\n\nconst isColumns = (bars: TradingBarsInput): bars is TradingBarColumns =>\n !Array.isArray(bars);\n\nexport const inputLength = (bars: TradingBarsInput): number =>\n isColumns(bars)\n ? Math.min(\n bars.time.length,\n bars.open.length,\n bars.high.length,\n bars.low.length,\n bars.close.length,\n )\n : bars.length;\n\nconst allocate = (capacity: number): OhlcColumns => ({\n time: new Float64Array(capacity),\n open: new Float64Array(capacity),\n high: new Float64Array(capacity),\n low: new Float64Array(capacity),\n close: new Float64Array(capacity),\n volume: new Float64Array(capacity),\n});\n\nexport const createStore = (): BarStore => ({\n ...allocate(16),\n length: 0,\n capacity: 16,\n hasVolume: false,\n});\n\n/** Grows the columns to hold at least `size` bars (doubling) */\nconst reserve = (store: BarStore, size: number) => {\n if (size <= store.capacity) return;\n let capacity = store.capacity;\n while (capacity < size) capacity *= 2;\n const next = allocate(capacity);\n for (const key of KEYS) next[key].set(store[key].subarray(0, store.length));\n Object.assign(store, next);\n store.capacity = capacity;\n};\n\n/** Writes `count` bars of `bars` at `at` */\nconst write = (\n store: BarStore,\n bars: TradingBarsInput,\n at: number,\n count: number,\n) => {\n if (isColumns(bars)) {\n for (let i = 0; i < count; i++) {\n store.time[at + i] = bars.time[i];\n store.open[at + i] = bars.open[i];\n store.high[at + i] = bars.high[i];\n store.low[at + i] = bars.low[i];\n store.close[at + i] = bars.close[i];\n }\n const volume = bars.volume;\n if (volume) {\n for (let i = 0; i < count; i++) {\n const v = volume[i];\n store.volume[at + i] = Number.isFinite(v) ? v : 0;\n }\n store.hasVolume = true;\n } else {\n store.volume.fill(0, at, at + count);\n }\n return;\n }\n for (let i = 0; i < count; i++) writeBar(store, at + i, bars[i]);\n};\n\nconst writeBar = (store: BarStore, i: number, bar: TradingBar) => {\n store.time[i] = bar.time;\n store.open[i] = bar.open;\n store.high[i] = bar.high;\n store.low[i] = bar.low;\n store.close[i] = bar.close;\n const v = bar.volume;\n if (v !== undefined && Number.isFinite(v)) {\n store.volume[i] = v;\n store.hasVolume = true;\n } else {\n store.volume[i] = 0;\n }\n};\n\n/** Replaces every bar */\nexport const setBars = (store: BarStore, bars: TradingBarsInput): void => {\n const n = inputLength(bars);\n store.length = 0;\n store.hasVolume = false;\n reserve(store, n);\n write(store, bars, 0, n);\n store.length = n;\n};\n\n/**\n * Appends the bars newer than the last one (a bar at the time of the last\n * one replaces it). Returns the index of the first changed bar, or -1.\n */\nexport const appendBars = (store: BarStore, bars: TradingBarsInput): number => {\n const n = inputLength(bars);\n let first = -1;\n for (let i = 0; i < n; i++) {\n const at = updateBar(store, barAt(bars, i));\n if (at >= 0 && (first < 0 || at < first)) first = at;\n }\n return first;\n};\n\n/** The `i`-th bar of an input */\nexport const barAt = (bars: TradingBarsInput, i: number): TradingBar => {\n if (!isColumns(bars)) return bars[i];\n return {\n time: bars.time[i],\n open: bars.open[i],\n high: bars.high[i],\n low: bars.low[i],\n close: bars.close[i],\n ...(bars.volume ? { volume: bars.volume[i] } : {}),\n };\n};\n\n/**\n * Streams a bar: replaces the last bar at the same time, appends a newer\n * one. Returns its index; -1 (ignored) when older than the last bar.\n */\nexport const updateBar = (store: BarStore, bar: TradingBar): number => {\n const n = store.length;\n if (!Number.isFinite(bar.time)) return -1;\n if (n > 0) {\n const last = store.time[n - 1];\n if (bar.time < last) return -1;\n if (bar.time === last) {\n writeBar(store, n - 1, bar);\n return n - 1;\n }\n }\n reserve(store, n + 1);\n writeBar(store, n, bar);\n store.length = n + 1;\n return n;\n};\n\n/** Inserts the bars older than the first one; returns how many were added */\nexport const prependBars = (\n store: BarStore,\n bars: TradingBarsInput,\n): number => {\n const n = inputLength(bars);\n const first = store.length ? store.time[0] : Infinity;\n // keep only the bars strictly older than the current first bar\n let count = 0;\n const time = isColumns(bars) ? bars.time : null;\n while (\n count < n &&\n (time ? time[count] : (bars as readonly TradingBar[])[count].time) < first\n ) {\n count++;\n }\n if (!count) return 0;\n const length = store.length;\n const previous: OhlcColumns = {\n time: store.time.slice(0, length),\n open: store.open.slice(0, length),\n high: store.high.slice(0, length),\n low: store.low.slice(0, length),\n close: store.close.slice(0, length),\n volume: store.volume.slice(0, length),\n };\n store.length = 0;\n reserve(store, length + count);\n write(store, bars, 0, count);\n for (const key of KEYS) store[key].set(previous[key], count);\n store.length = length + count;\n return count;\n};\n\n/** Bar at an index as an object */\nexport const readBar = (columns: OhlcColumns, i: number): TradingBar => ({\n time: columns.time[i],\n open: columns.open[i],\n high: columns.high[i],\n low: columns.low[i],\n close: columns.close[i],\n volume: columns.volume[i],\n});\n\n/** First index whose time is >= `time` (binary search) */\nexport const lowerBoundTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = n;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (time[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/**\n * Index of the bar containing `time`: the last bar opening at or before it\n * (0 before the first bar)\n */\nexport const indexOfTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n const i = lowerBoundTime(time, n, value);\n if (i < n && time[i] === value) return i;\n return Math.max(0, i - 1);\n};\n\n// ---------------------------------------------------------------- pyramid\n\n/** Bars aggregated `size` by `size`, aligned on index 0 */\nexport interface LodLevel extends OhlcColumns {\n size: number;\n /** Groups up to date */\n valid: number;\n}\n\n/** Aggregated levels, built lazily; level k groups 2^k bars */\nexport interface Pyramid {\n levels: (LodLevel | undefined)[];\n}\n\nexport const createPyramid = (): Pyramid => ({ levels: [] });\n\n/** Marks the groups containing bars from `from` on as stale */\nexport const invalidatePyramid = (pyramid: Pyramid, from: number): void => {\n for (const level of pyramid.levels) {\n if (level)\n level.valid = Math.min(level.valid, Math.floor(from / level.size));\n }\n};\n\n/**\n * Level `k` (k >= 1) of `src` (the first `n` bars), computed from level\n * k - 1 for the stale groups only\n */\nexport const pyramidLevel = (\n pyramid: Pyramid,\n src: OhlcColumns,\n n: number,\n k: number,\n): LodLevel => {\n const size = 2 ** k;\n const groups = Math.ceil(n / size);\n let level = pyramid.levels[k];\n if (!level || level.time.length < groups) {\n const capacity = Math.max(16, Math.ceil(groups * 1.5));\n const next: LodLevel = { ...allocate(capacity), size, valid: 0 };\n if (level) {\n for (const key of KEYS)\n next[key].set(level[key].subarray(0, level.valid));\n next.valid = level.valid;\n }\n level = next;\n pyramid.levels[k] = level;\n }\n if (level.valid >= groups) return level;\n // the source of level k: level k - 1 (pairs) or the bars (k = 1)\n const prev = k > 1 ? pyramidLevel(pyramid, src, n, k - 1) : src;\n const prevCount = k > 1 ? Math.ceil(n / (size / 2)) : n;\n // the last group of a level may be partial: always recompute it\n const from = Math.max(0, Math.min(level.valid, groups - 1));\n for (let g = from; g < groups; g++) {\n const a = g * 2;\n const b = a + 1;\n level.time[g] = prev.time[a];\n level.open[g] = prev.open[a];\n if (b < prevCount) {\n level.high[g] = Math.max(prev.high[a], prev.high[b]);\n level.low[g] = Math.min(prev.low[a], prev.low[b]);\n level.close[g] = prev.close[b];\n level.volume[g] = prev.volume[a] + prev.volume[b];\n } else {\n level.high[g] = prev.high[a];\n level.low[g] = prev.low[a];\n level.close[g] = prev.close[a];\n level.volume[g] = prev.volume[a];\n }\n }\n // complete groups stay valid; the partial last one is redone next time\n level.valid = n % size === 0 ? groups : groups - 1;\n return level;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","names":["KEYS","isColumns","bars","inputLength","allocate","capacity","createStore","reserve","size","store","next","key","write","i","count","at","volume","v","writeBar","bar","setBars","n","appendBars","first","updateBar","barAt","last","prependBars","time","length","previous","readBar","columns","lowerBoundTime","lo","hi","mid","value","indexOfTime","createPyramid","pyramidLevel","k","groups","level","pyramid","prev","src","prevCount","from","g","a","b","createRangePyramid","invalidateRangePyramid","lower","upper","rangeLevel","values","has","minA","maxA","lastA","minB","maxB","lastB"],"sources":["../../../../../charts/src/engine/trading/store.ts"],"sourcesContent":["// Bars in growable Float64Array columns, and a pyramid of aggregated\n// levels (2, 4, 8, ... bars per group) drawn when the chart is zoomed out\n// so far that a bar is narrower than a pixel: a million bars cost the\n// same to draw as a thousand.\n\nimport type { TradingBar, TradingBarColumns, TradingBarsInput } from \"./types\";\n\n/** OHLCV columns; only the first `length` entries are meaningful */\nexport interface OhlcColumns {\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n volume: Float64Array;\n}\n\nexport interface BarStore extends OhlcColumns {\n length: number;\n /** Size of the columns */\n capacity: number;\n /** Some bar has a volume */\n hasVolume: boolean;\n}\n\nconst KEYS = [\"time\", \"open\", \"high\", \"low\", \"close\", \"volume\"] as const;\n\nconst isColumns = (bars: TradingBarsInput): bars is TradingBarColumns =>\n !Array.isArray(bars);\n\nexport const inputLength = (bars: TradingBarsInput): number =>\n isColumns(bars)\n ? Math.min(\n bars.time.length,\n bars.open.length,\n bars.high.length,\n bars.low.length,\n bars.close.length,\n )\n : bars.length;\n\nconst allocate = (capacity: number): OhlcColumns => ({\n time: new Float64Array(capacity),\n open: new Float64Array(capacity),\n high: new Float64Array(capacity),\n low: new Float64Array(capacity),\n close: new Float64Array(capacity),\n volume: new Float64Array(capacity),\n});\n\nexport const createStore = (): BarStore => ({\n ...allocate(16),\n length: 0,\n capacity: 16,\n hasVolume: false,\n});\n\n/** Grows the columns to hold at least `size` bars (doubling) */\nconst reserve = (store: BarStore, size: number) => {\n if (size <= store.capacity) return;\n let capacity = store.capacity;\n while (capacity < size) capacity *= 2;\n const next = allocate(capacity);\n for (const key of KEYS) next[key].set(store[key].subarray(0, store.length));\n Object.assign(store, next);\n store.capacity = capacity;\n};\n\n/** Writes `count` bars of `bars` at `at` */\nconst write = (\n store: BarStore,\n bars: TradingBarsInput,\n at: number,\n count: number,\n) => {\n if (isColumns(bars)) {\n for (let i = 0; i < count; i++) {\n store.time[at + i] = bars.time[i];\n store.open[at + i] = bars.open[i];\n store.high[at + i] = bars.high[i];\n store.low[at + i] = bars.low[i];\n store.close[at + i] = bars.close[i];\n }\n const volume = bars.volume;\n if (volume) {\n for (let i = 0; i < count; i++) {\n const v = volume[i];\n store.volume[at + i] = Number.isFinite(v) ? v : 0;\n }\n store.hasVolume = true;\n } else {\n store.volume.fill(0, at, at + count);\n }\n return;\n }\n for (let i = 0; i < count; i++) writeBar(store, at + i, bars[i]);\n};\n\nconst writeBar = (store: BarStore, i: number, bar: TradingBar) => {\n store.time[i] = bar.time;\n store.open[i] = bar.open;\n store.high[i] = bar.high;\n store.low[i] = bar.low;\n store.close[i] = bar.close;\n const v = bar.volume;\n if (v !== undefined && Number.isFinite(v)) {\n store.volume[i] = v;\n store.hasVolume = true;\n } else {\n store.volume[i] = 0;\n }\n};\n\n/** Replaces every bar */\nexport const setBars = (store: BarStore, bars: TradingBarsInput): void => {\n const n = inputLength(bars);\n store.length = 0;\n store.hasVolume = false;\n reserve(store, n);\n write(store, bars, 0, n);\n store.length = n;\n};\n\n/**\n * Appends the bars newer than the last one (a bar at the time of the last\n * one replaces it). Returns the index of the first changed bar, or -1.\n */\nexport const appendBars = (store: BarStore, bars: TradingBarsInput): number => {\n const n = inputLength(bars);\n let first = -1;\n for (let i = 0; i < n; i++) {\n const at = updateBar(store, barAt(bars, i));\n if (at >= 0 && (first < 0 || at < first)) first = at;\n }\n return first;\n};\n\n/** The `i`-th bar of an input */\nexport const barAt = (bars: TradingBarsInput, i: number): TradingBar => {\n if (!isColumns(bars)) return bars[i];\n return {\n time: bars.time[i],\n open: bars.open[i],\n high: bars.high[i],\n low: bars.low[i],\n close: bars.close[i],\n ...(bars.volume ? { volume: bars.volume[i] } : {}),\n };\n};\n\n/**\n * Streams a bar: replaces the last bar at the same time, appends a newer\n * one. Returns its index; -1 (ignored) when older than the last bar.\n */\nexport const updateBar = (store: BarStore, bar: TradingBar): number => {\n const n = store.length;\n if (!Number.isFinite(bar.time)) return -1;\n if (n > 0) {\n const last = store.time[n - 1];\n if (bar.time < last) return -1;\n if (bar.time === last) {\n writeBar(store, n - 1, bar);\n return n - 1;\n }\n }\n reserve(store, n + 1);\n writeBar(store, n, bar);\n store.length = n + 1;\n return n;\n};\n\n/** Inserts the bars older than the first one; returns how many were added */\nexport const prependBars = (\n store: BarStore,\n bars: TradingBarsInput,\n): number => {\n const n = inputLength(bars);\n const first = store.length ? store.time[0] : Infinity;\n // keep only the bars strictly older than the current first bar\n let count = 0;\n const time = isColumns(bars) ? bars.time : null;\n while (\n count < n &&\n (time ? time[count] : (bars as readonly TradingBar[])[count].time) < first\n ) {\n count++;\n }\n if (!count) return 0;\n const length = store.length;\n const previous: OhlcColumns = {\n time: store.time.slice(0, length),\n open: store.open.slice(0, length),\n high: store.high.slice(0, length),\n low: store.low.slice(0, length),\n close: store.close.slice(0, length),\n volume: store.volume.slice(0, length),\n };\n store.length = 0;\n reserve(store, length + count);\n write(store, bars, 0, count);\n for (const key of KEYS) store[key].set(previous[key], count);\n store.length = length + count;\n return count;\n};\n\n/** Bar at an index as an object */\nexport const readBar = (columns: OhlcColumns, i: number): TradingBar => ({\n time: columns.time[i],\n open: columns.open[i],\n high: columns.high[i],\n low: columns.low[i],\n close: columns.close[i],\n volume: columns.volume[i],\n});\n\n/** First index whose time is >= `time` (binary search) */\nexport const lowerBoundTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = n;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (time[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/**\n * Index of the bar containing `time`: the last bar opening at or before it\n * (0 before the first bar)\n */\nexport const indexOfTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n const i = lowerBoundTime(time, n, value);\n if (i < n && time[i] === value) return i;\n return Math.max(0, i - 1);\n};\n\n// ---------------------------------------------------------------- pyramid\n\n/** Bars aggregated `size` by `size`, aligned on index 0 */\nexport interface LodLevel extends OhlcColumns {\n size: number;\n /** Groups up to date */\n valid: number;\n}\n\n/** Aggregated levels, built lazily; level k groups 2^k bars */\nexport interface Pyramid {\n levels: (LodLevel | undefined)[];\n}\n\nexport const createPyramid = (): Pyramid => ({ levels: [] });\n\n/** Marks the groups containing bars from `from` on as stale */\nexport const invalidatePyramid = (pyramid: Pyramid, from: number): void => {\n for (const level of pyramid.levels) {\n if (level)\n level.valid = Math.min(level.valid, Math.floor(from / level.size));\n }\n};\n\n/**\n * Level `k` (k >= 1) of `src` (the first `n` bars), computed from level\n * k - 1 for the stale groups only\n */\nexport const pyramidLevel = (\n pyramid: Pyramid,\n src: OhlcColumns,\n n: number,\n k: number,\n): LodLevel => {\n const size = 2 ** k;\n const groups = Math.ceil(n / size);\n let level = pyramid.levels[k];\n if (!level || level.time.length < groups) {\n const capacity = Math.max(16, Math.ceil(groups * 1.5));\n const next: LodLevel = { ...allocate(capacity), size, valid: 0 };\n if (level) {\n for (const key of KEYS)\n next[key].set(level[key].subarray(0, level.valid));\n next.valid = level.valid;\n }\n level = next;\n pyramid.levels[k] = level;\n }\n if (level.valid >= groups) return level;\n // the source of level k: level k - 1 (pairs) or the bars (k = 1)\n const prev = k > 1 ? pyramidLevel(pyramid, src, n, k - 1) : src;\n const prevCount = k > 1 ? Math.ceil(n / (size / 2)) : n;\n // the last group of a level may be partial: always recompute it\n const from = Math.max(0, Math.min(level.valid, groups - 1));\n for (let g = from; g < groups; g++) {\n const a = g * 2;\n const b = a + 1;\n level.time[g] = prev.time[a];\n level.open[g] = prev.open[a];\n if (b < prevCount) {\n level.high[g] = Math.max(prev.high[a], prev.high[b]);\n level.low[g] = Math.min(prev.low[a], prev.low[b]);\n level.close[g] = prev.close[b];\n level.volume[g] = prev.volume[a] + prev.volume[b];\n } else {\n level.high[g] = prev.high[a];\n level.low[g] = prev.low[a];\n level.close[g] = prev.close[a];\n level.volume[g] = prev.volume[a];\n }\n }\n // complete groups stay valid; the partial last one is redone next time\n level.valid = n % size === 0 ? groups : groups - 1;\n return level;\n};\n\n// ---------------------------------------------------------- value ranges\n\n/** Lowest, highest and last finite value of each group of 2^k values */\nexport interface RangeLevel {\n size: number;\n min: Float64Array;\n max: Float64Array;\n last: Float64Array;\n /** Groups up to date */\n valid: number;\n}\n\n/**\n * Aggregated levels of a column of indicator values: a zoomed-out chart\n * draws the range of each group (min / max decimation), so spikes stay\n * visible instead of being sampled away\n */\nexport interface RangePyramid {\n levels: (RangeLevel | undefined)[];\n}\n\nexport const createRangePyramid = (): RangePyramid => ({ levels: [] });\n\nexport const invalidateRangePyramid = (\n pyramid: RangePyramid,\n from: number,\n): void => {\n for (const level of pyramid.levels) {\n if (level)\n level.valid = Math.min(level.valid, Math.floor(from / level.size));\n }\n};\n\nconst lower = (a: number, b: number) =>\n !Number.isFinite(a) ? b : !Number.isFinite(b) ? a : a < b ? a : b;\nconst upper = (a: number, b: number) =>\n !Number.isFinite(a) ? b : !Number.isFinite(b) ? a : a > b ? a : b;\n\n/** Level `k` (k >= 1) of the first `n` values, updated for the stale groups only */\nexport const rangeLevel = (\n pyramid: RangePyramid,\n values: Float64Array,\n n: number,\n k: number,\n): RangeLevel => {\n const size = 2 ** k;\n const groups = Math.ceil(n / size);\n let level = pyramid.levels[k];\n if (!level || level.min.length < groups) {\n const capacity = Math.max(16, Math.ceil(groups * 1.5));\n const next: RangeLevel = {\n size,\n min: new Float64Array(capacity),\n max: new Float64Array(capacity),\n last: new Float64Array(capacity),\n valid: 0,\n };\n if (level) {\n next.min.set(level.min.subarray(0, level.valid));\n next.max.set(level.max.subarray(0, level.valid));\n next.last.set(level.last.subarray(0, level.valid));\n next.valid = level.valid;\n }\n level = next;\n pyramid.levels[k] = level;\n }\n if (level.valid >= groups) return level;\n const prev = k > 1 ? rangeLevel(pyramid, values, n, k - 1) : null;\n const prevCount = k > 1 ? Math.ceil(n / (size / 2)) : n;\n const from = Math.max(0, Math.min(level.valid, groups - 1));\n for (let g = from; g < groups; g++) {\n const a = g * 2;\n const b = a + 1;\n const has = b < prevCount;\n const minA = prev ? prev.min[a] : values[a];\n const maxA = prev ? prev.max[a] : values[a];\n const lastA = prev ? prev.last[a] : values[a];\n const minB = has ? (prev ? prev.min[b] : values[b]) : NaN;\n const maxB = has ? (prev ? prev.max[b] : values[b]) : NaN;\n const lastB = has ? (prev ? prev.last[b] : values[b]) : NaN;\n level.min[g] = lower(minA, minB);\n level.max[g] = upper(maxA, maxB);\n level.last[g] = Number.isFinite(lastB) ? lastB : lastA;\n }\n level.valid = n % size === 0 ? groups : groups - 1;\n return level;\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./indicators.cjs");var t=[`#f59e0b`,`#a855f7`,`#0ea5e9`,`#ec4899`,`#14b8a6`,`#6366f1`,`#84cc16`],n=`#a855f7`,r=`#0ea5e9`,i=`#f59e0b`,a=e=>{switch(e.type){case`ma`:case`ema`:case`wma`:return`${e.type}:${e.period}${e.source&&e.source!==`close`?`:${e.source}`:``}`;case`boll`:return`boll:${e.period??20}:${e.multiplier??2}`;case`vwap`:return`vwap:${e.reset??`day`}`;case`volume`:return`volume`;case`macd`:return`macd:${e.fast??12}:${e.slow??26}:${e.signal??9}`;case`rsi`:return`rsi:${e.period??14}`;case`kdj`:return`kdj:${e.period??9}:${e.kPeriod??3}:${e.dPeriod??3}`;default:return`atr:${e.period??14}`}},o=(e,t,n,r)=>{let{open:i,high:a,low:o,close:s}=e;for(let c=r;c<e.length;c++)switch(t){case`open`:n[c]=i[c];break;case`high`:n[c]=a[c];break;case`low`:n[c]=o[c];break;case`hl2`:n[c]=(a[c]+o[c])/2;break;case`hlc3`:n[c]=(a[c]+o[c]+s[c])/3;break;case`ohlc4`:n[c]=(i[c]+a[c]+o[c]+s[c])/4;break;default:n[c]=s[c]}},s=()=>{let e=new Map;return(t,n)=>{let r=e.get(t);if(r&&r.length>=n)return r;let i=new Float64Array(n).fill(NaN);return r&&i.set(r),e.set(t,i),i}},c=(e,t,n=`line`,r=1.5)=>({label:e,values:new Float64Array,color:t,kind:n,width:r}),l=(a,l,u,d)=>{let f=s(),p=`height`in a&&a.height?a.height:110,m={id:l,type:a.type,config:a,height:p,compact:!1},h=(e,t,n)=>{e.outputs.forEach((e,r)=>{e.values=f(n[r]??`out${r}`,t.capacity)})};switch(a.type){case`ma`:case`ema`:case`wma`:{let n=Math.max(1,Math.floor(a.period)||1),r=a.source??`close`,i=`${a.type.toUpperCase()}${n}`,s=a.type===`ma`?e.smaInto:a.type===`ema`?e.emaInto:e.wmaInto,l={...m,overlay:!0,title:i,outputs:[c(i,a.color??t[u%t.length],`line`,a.lineWidth??1.5)],compute(e,t){h(l,e,[`value`]);let i=e.close;r!==`close`&&(i=f(`src`,e.capacity),o(e,r,i,t)),s(i,e.length,n,l.outputs[0].values,t)}};return l}case`boll`:{let t=a.period??20,n=a.multiplier??2,[o,s,l]=a.colors??[i,r,r],u={...m,overlay:!0,title:`BOLL ${t} ${n}`,outputs:[c(`MID`,o??i,`line`,1.25),c(`UB`,s??r,`line`,1.25),c(`LB`,l??s??r,`line`,1.25)],...a.fill===!1?{}:{fill:[1,2]},compute(r,i){h(u,r,[`mid`,`up`,`low`]);let a=f(`dev`,r.capacity),[o,s,c]=u.outputs.map(e=>e.values);e.smaInto(r.close,r.length,t,o,i),e.stdevInto(r.close,r.length,t,a,i);for(let e=i;e<r.length;e++)s[e]=o[e]+n*a[e],c[e]=o[e]-n*a[e]}};return u}case`vwap`:{let t=a.reset??`day`,n={...m,overlay:!0,title:`VWAP`,outputs:[c(`VWAP`,a.color??`#ec4899`,`line`,1.5)],compute(r,i){h(n,r,[`value`]),e.vwapInto(r.high,r.low,r.close,r.volume,r.time,r.length,t,d,n.outputs[0].values,f(`pv`,r.capacity),f(`vol`,r.capacity),i)}};return n}case`volume`:{let t=a.maPeriod,n=[c(`VOL`,``,`volume`)];t&&n.push(c(`MA${t}`,r,`line`,1.25));let i={...m,overlay:!!a.overlay,compact:!0,title:`VOL`,outputs:n,compute(n,r){h(i,n,[`vol`,`ma`]);let a=i.outputs[0].values;a.set(n.volume.subarray(r,n.length),r),t&&e.smaInto(a,n.length,t,i.outputs[1].values,r)}};return i}case`macd`:{let t=a.fast??12,n=a.slow??26,o=a.signal??9,[s,l]=a.colors??[r,i],u={...m,overlay:!1,title:`MACD ${t} ${n} ${o}`,bands:[0],outputs:[c(`MACD`,``,`histogram`),c(`DIF`,s??r,`line`,1.25),c(`DEA`,l??i,`line`,1.25)],compute(r,i){h(u,r,[`hist`,`dif`,`dea`]);let a=r.length,s=f(`fast`,r.capacity),c=f(`slow`,r.capacity),[l,d,p]=u.outputs.map(e=>e.values);e.emaInto(r.close,a,t,s,i),e.emaInto(r.close,a,n,c,i);for(let e=i;e<a;e++)d[e]=s[e]-c[e];e.emaInto(d,a,o,p,i);for(let e=i;e<a;e++)l[e]=d[e]-p[e]}};return u}case`rsi`:{let t=a.period??14,r={...m,overlay:!1,title:`RSI ${t}`,range:[0,100],bands:[a.oversold??30,a.overbought??70],outputs:[c(`RSI${t}`,a.color??n,`line`,1.5)],compute(n,i){h(r,n,[`value`]),e.rsiInto(n.close,n.length,t,r.outputs[0].values,f(`gain`,n.capacity),f(`loss`,n.capacity),i)}};return r}case`kdj`:{let t=a.period??9,o=a.kPeriod??3,s=a.dPeriod??3,[l,u,d]=a.colors??[i,r,n],f={...m,overlay:!1,title:`KDJ ${t} ${o} ${s}`,bands:[20,80],outputs:[c(`K`,l??i,`line`,1.25),c(`D`,u??r,`line`,1.25),c(`J`,d??n,`line`,1.25)],compute(n,r){h(f,n,[`k`,`d`,`j`]);let[i,a,c]=f.outputs.map(e=>e.values);e.kdjInto(n.high,n.low,n.close,n.length,t,o,s,i,a,c,r)}};return f}default:{let t=a.period??14,n={...m,overlay:!1,title:`ATR ${t}`,outputs:[c(`ATR${t}`,a.color??r,`line`,1.5)],compute(r,i){h(n,r,[`value`]);let a=f(`tr`,r.capacity);e.trueRangeInto(r.high,r.low,r.close,r.length,a,i),e.rmaInto(a,r.length,t,n.outputs[0].values,i)}};return n}}},u=(e,t,n)=>{let r=new Set,i=new Set,o=0;return{studies:e.map(e=>{let s=e.id??a(e);for(let t=2;r.has(s);t++)s=`${e.id??a(e)}#${t}`;r.add(s);let c=e.type===`ma`||e.type===`ema`||e.type===`wma`?o++:0,u=t.find(e=>e.id===s);return u&&d(u.config,e)?(u.config=e,i.add(u),u):l(e,s,c,n)}),reused:i}},d=(e,t)=>{if(e===t)return!0;let n=new Set([...Object.keys(e),...Object.keys(t)]);n.delete(`visible`);for(let r of n){let n=e[r],i=t[r];if(n!==i&&!(Array.isArray(n)&&Array.isArray(i)&&n.join()===i.join()))return!1}return!0};exports.LINE_COLORS=t,exports.buildStudies=u,exports.createStudy=l,exports.indicatorKey=a;
|
|
1
|
+
const e=require("./indicators.cjs");var t=[`#f59e0b`,`#a855f7`,`#0ea5e9`,`#ec4899`,`#14b8a6`,`#6366f1`,`#84cc16`],n=`#a855f7`,r=`#0ea5e9`,i=`#f59e0b`,a=`#14b8a6`,o=`#6366f1`,s=`#ec4899`,c=`#2962ff`,l=e=>{switch(e.type){case`ma`:case`ema`:case`wma`:return`${e.type}:${e.period}${e.source&&e.source!==`close`?`:${e.source}`:``}`;case`boll`:return`boll:${e.period??20}:${e.multiplier??2}`;case`vwap`:return`vwap:${e.reset??`day`}`;case`volume`:return`volume`;case`macd`:return`macd:${e.fast??12}:${e.slow??26}:${e.signal??9}`;case`rsi`:return`rsi:${e.period??14}`;case`kdj`:return`kdj:${e.period??9}:${e.kPeriod??3}:${e.dPeriod??3}`;case`psar`:return`psar:${e.start??.02}:${e.increment??e.start??.02}:${e.maximum??.2}`;case`ichimoku`:return`ichimoku:${e.conversionPeriod??9}:${e.basePeriod??26}:${e.spanBPeriod??52}:${e.displacement??26}`;case`supertrend`:return`supertrend:${e.period??10}:${e.multiplier??3}`;case`keltner`:return`keltner:${e.period??20}:${e.multiplier??2}:${e.atrPeriod??10}`;case`donchian`:return`donchian:${e.period??20}`;case`obv`:return`obv`;case`cci`:return`cci:${e.period??20}`;case`stochRsi`:return`stochRsi:${e.rsiPeriod??14}:${e.stochPeriod??14}:${e.kPeriod??3}:${e.dPeriod??3}`;case`dmi`:return`dmi:${e.period??14}:${e.adxPeriod??14}`;case`williamsR`:return`williamsR:${e.period??14}`;case`mfi`:return`mfi:${e.period??14}`;default:return`atr:${e.period??14}`}},u=(e,t,n,r)=>{let{open:i,high:a,low:o,close:s}=e;for(let c=r;c<e.length;c++)switch(t){case`open`:n[c]=i[c];break;case`high`:n[c]=a[c];break;case`low`:n[c]=o[c];break;case`hl2`:n[c]=(a[c]+o[c])/2;break;case`hlc3`:n[c]=(a[c]+o[c]+s[c])/3;break;case`ohlc4`:n[c]=(i[c]+a[c]+o[c]+s[c])/4;break;default:n[c]=s[c]}},d=()=>{let e=new Map;return(t,n)=>{let r=e.get(t);if(r&&r.length>=n)return r;let i=new Float64Array(n).fill(NaN);return r&&i.set(r),e.set(t,i),i}},f=(e,t,n=`line`,r=1.5,i=0,a=1)=>({label:e,values:new Float64Array,color:t,kind:n,width:r,shift:i,alpha:a}),p=(l,p,m,h)=>{let g=d(),_=`height`in l&&l.height?l.height:110,v={id:p,type:l.type,config:l,height:_,compact:!1,fills:[]},y=(e,t,n)=>{e.outputs.forEach((e,r)=>{e.values=g(n[r]??`out${r}`,t.capacity)})};switch(l.type){case`ma`:case`ema`:case`wma`:{let n=Math.max(1,Math.floor(l.period)||1),r=l.source??`close`,i=`${l.type.toUpperCase()}${n}`,a=l.type===`ma`?e.smaInto:l.type===`ema`?e.emaInto:e.wmaInto,o={...v,overlay:!0,title:i,outputs:[f(i,l.color??t[m%t.length],`line`,l.lineWidth??1.5)],compute(e,t){y(o,e,[`value`]);let i=e.close;r!==`close`&&(i=g(`src`,e.capacity),u(e,r,i,t)),a(i,e.length,n,o.outputs[0].values,t)}};return o}case`boll`:{let t=l.period??20,n=l.multiplier??2,[a,o,s]=l.colors??[i,r,r],c={...v,overlay:!0,title:`BOLL ${t} ${n}`,plainLegend:!0,outputs:[f(`MID`,a??i,`line`,1.25),f(`UB`,o??r,`line`,1.25),f(`LB`,s??o??r,`line`,1.25)],fills:l.fill===!1?[]:[{a:1,b:2,color:o??r,opacity:.07}],compute(r,i){y(c,r,[`mid`,`up`,`low`]);let a=g(`dev`,r.capacity),[o,s,l]=c.outputs.map(e=>e.values);e.smaInto(r.close,r.length,t,o,i),e.stdevInto(r.close,r.length,t,a,i);for(let e=i;e<r.length;e++)s[e]=o[e]+n*a[e],l[e]=o[e]-n*a[e]}};return c}case`vwap`:{let t=l.reset??`day`,n={...v,overlay:!0,title:`VWAP`,outputs:[f(`VWAP`,l.color??`#ec4899`,`line`,1.5)],compute(r,i){y(n,r,[`value`]),e.vwapInto(r.high,r.low,r.close,r.volume,r.time,r.length,t,h,n.outputs[0].values,g(`pv`,r.capacity),g(`vol`,r.capacity),i)}};return n}case`volume`:{let t=l.maPeriod,n=[f(`VOL`,``,`volume`)];t&&n.push(f(`MA${t}`,r,`line`,1.25));let i={...v,overlay:!!l.overlay,compact:!0,title:`VOL`,outputs:n,compute(n,r){y(i,n,[`vol`,`ma`]);let a=i.outputs[0].values;a.set(n.volume.subarray(r,n.length),r),t&&e.smaInto(a,n.length,t,i.outputs[1].values,r)}};return i}case`macd`:{let t=l.fast??12,n=l.slow??26,a=l.signal??9,[o,s]=l.colors??[r,i],c={...v,overlay:!1,title:`MACD ${t} ${n} ${a}`,bands:[0],zero:!0,outputs:[f(`MACD`,``,`histogram`),f(`DIF`,o??r,`line`,1.25),f(`DEA`,s??i,`line`,1.25)],compute(r,i){y(c,r,[`hist`,`dif`,`dea`]);let o=r.length,s=g(`fast`,r.capacity),l=g(`slow`,r.capacity),[u,d,f]=c.outputs.map(e=>e.values);e.emaInto(r.close,o,t,s,i),e.emaInto(r.close,o,n,l,i);for(let e=i;e<o;e++)d[e]=s[e]-l[e];e.emaInto(d,o,a,f,i);for(let e=i;e<o;e++)u[e]=d[e]-f[e]}};return c}case`rsi`:{let t=l.period??14,r={...v,overlay:!1,title:`RSI ${t}`,range:[0,100],bands:[l.oversold??30,l.overbought??70],bandFill:!0,outputs:[f(`RSI${t}`,l.color??n,`line`,1.5)],compute(n,i){y(r,n,[`value`]),e.rsiInto(n.close,n.length,t,r.outputs[0].values,g(`gain`,n.capacity),g(`loss`,n.capacity),i)}};return r}case`kdj`:{let t=l.period??9,a=l.kPeriod??3,o=l.dPeriod??3,[s,c,u]=l.colors??[i,r,n],d={...v,overlay:!1,title:`KDJ ${t} ${a} ${o}`,bands:[20,80],outputs:[f(`K`,s??i,`line`,1.25),f(`D`,c??r,`line`,1.25),f(`J`,u??n,`line`,1.25)],compute(n,r){y(d,n,[`k`,`d`,`j`]);let[i,s,c]=d.outputs.map(e=>e.values);e.kdjInto(n.high,n.low,n.close,n.length,t,a,o,i,s,c,r)}};return d}case`psar`:{let t=l.start??.02,n=l.increment??t,r=l.maximum??.2,i={...v,overlay:!0,title:`SAR ${t} ${n} ${r}`,outputs:[f(`SAR`,l.color??``,`dots`,1.5)],compute(a,o){y(i,a,[`value`]),e.psarInto(a.high,a.low,a.length,t,n,r,i.outputs[0].values,{ep:g(`ep`,a.capacity),af:g(`af`,a.capacity),trend:g(`trend`,a.capacity)},o)}};return i}case`ichimoku`:{let t=l.conversionPeriod??9,n=l.basePeriod??26,r=l.spanBPeriod??52,i=Math.max(1,Math.floor(l.displacement??26))-1,[a,o,s,u,d]=l.colors??[],p={...v,overlay:!0,title:`${t} ${n} ${r} ${i+1}`,titleKey:`ichimoku`,plainLegend:!0,outputs:[f(`CONV`,a??c,`line`,1.25),f(`BASE`,o??`#e65100`,`line`,1.25),f(`LAG`,s??`#43a047`,`line`,1.25,-i),f(`A`,u??`up`,`line`,1,i,.55),f(`B`,d??`down`,`line`,1,i,.55)],fills:l.cloud===!1?[]:[{a:3,b:4,color:u??`up`,colorBelow:d??`down`,opacity:.12}],compute(i,a){y(p,i,[`conv`,`base`,`lag`,`a`,`b`]);let[o,s,c,l,u]=p.outputs.map(e=>e.values);e.ichimokuInto(i.high,i.low,i.length,t,n,r,o,s,l,u,{highest:g(`highest`,i.capacity),lowest:g(`lowest`,i.capacity)},a),c.set(i.close.subarray(a,i.length),a)}};return p}case`supertrend`:{let t=l.period??10,n=l.multiplier??3,r={...v,overlay:!0,title:`${t} ${n}`,titleKey:`supertrend`,mergeLegend:!0,outputs:[f(`UP`,l.upColor??`up`,`line`,2),f(`DOWN`,l.downColor??`down`,`line`,2)],compute(i,a){y(r,i,[`up`,`down`]);let o=g(`value`,i.capacity),s=g(`direction`,i.capacity);e.supertrendInto(i.high,i.low,i.close,i.length,t,n,o,s,{tr:g(`tr`,i.capacity),atr:g(`atr`,i.capacity),upper:g(`upper`,i.capacity),lower:g(`lower`,i.capacity)},a);let[c,l]=r.outputs.map(e=>e.values);for(let e=a;e<i.length;e++)c[e]=s[e]===1?o[e]:NaN,l[e]=s[e]===-1?o[e]:NaN}};return r}case`keltner`:case`donchian`:{let t=l.type===`keltner`,n=l.period??20,r=t?l.multiplier??2:0,s=t?l.atrPeriod??10:0,c=t?a:o,[u,d,p]=l.colors??[i,c,c],m={...v,overlay:!0,title:t?`KC ${n} ${r} ${s}`:`DC ${n}`,plainLegend:!0,outputs:[f(`MID`,u??i,`line`,1.25),f(`UB`,d??c,`line`,1.25),f(`LB`,p??d??c,`line`,1.25)],fills:l.fill===!1?[]:[{a:1,b:2,color:d??c,opacity:.07}],compute(i,a){y(m,i,[`mid`,`up`,`low`]);let[o,c,l]=m.outputs.map(e=>e.values);t?e.keltnerInto(i.high,i.low,i.close,i.length,n,r,s,o,c,l,{tr:g(`tr`,i.capacity),atr:g(`atr`,i.capacity)},a):e.donchianInto(i.high,i.low,i.length,n,c,l,o,a)}};return m}case`obv`:{let t=l.maPeriod,n=[f(`OBV`,l.color??r,`line`,1.5)];t&&n.push(f(`MA${t}`,i,`line`,1.25));let a={...v,overlay:!1,compact:!0,title:`OBV`,outputs:n,compute(n,r){y(a,n,[`obv`,`ma`]);let i=a.outputs[0].values;e.obvInto(n.close,n.volume,n.length,i,r),t&&e.smaInto(i,n.length,t,a.outputs[1].values,r)}};return a}case`cci`:{let t=l.period??20,n={...v,overlay:!1,title:`CCI ${t}`,bands:[-100,100],bandFill:!0,outputs:[f(`CCI${t}`,l.color??a,`line`,1.5)],compute(r,i){y(n,r,[`value`]),e.cciInto(r.high,r.low,r.close,r.length,t,n.outputs[0].values,g(`typical`,r.capacity),g(`mean`,r.capacity),i)}};return n}case`stochRsi`:{let t=l.rsiPeriod??14,n=l.stochPeriod??14,a=l.kPeriod??3,o=l.dPeriod??3,[s,c]=l.colors??[r,i],u={...v,overlay:!1,title:`Stoch RSI ${t} ${n} ${a} ${o}`,range:[0,100],bands:[20,80],bandFill:!0,outputs:[f(`K`,s??r,`line`,1.25),f(`D`,c??i,`line`,1.25)],compute(r,i){y(u,r,[`k`,`d`]);let[s,c]=u.outputs.map(e=>e.values);e.stochRsiInto(r.close,r.length,t,n,a,o,s,c,{rsi:g(`rsi`,r.capacity),gain:g(`gain`,r.capacity),loss:g(`loss`,r.capacity),highest:g(`highest`,r.capacity),lowest:g(`lowest`,r.capacity),raw:g(`raw`,r.capacity)},i)}};return u}case`dmi`:{let t=l.period??14,n=l.adxPeriod??14,[r,a,o]=l.colors??[`up`,`down`,i],s={...v,overlay:!1,title:`DMI ${t} ${n}`,bands:[25],outputs:[f(`+DI`,r??`up`,`line`,1.25),f(`−DI`,a??`down`,`line`,1.25),f(`ADX`,o??i,`line`,1.75)],compute(r,i){y(s,r,[`plus`,`minus`,`adx`]);let[a,o,c]=s.outputs.map(e=>e.values);e.dmiInto(r.high,r.low,r.close,r.length,t,n,a,o,c,{tr:g(`tr`,r.capacity),plusDm:g(`plusDm`,r.capacity),minusDm:g(`minusDm`,r.capacity),smoothTr:g(`smoothTr`,r.capacity),smoothPlus:g(`smoothPlus`,r.capacity),smoothMinus:g(`smoothMinus`,r.capacity),dx:g(`dx`,r.capacity)},i)}};return s}case`williamsR`:{let t=l.period??14,r={...v,overlay:!1,title:`%R ${t}`,range:[-100,0],bands:[-80,-20],bandFill:!0,outputs:[f(`%R${t}`,l.color??n,`line`,1.5)],compute(n,i){y(r,n,[`value`]),e.williamsRInto(n.high,n.low,n.close,n.length,t,r.outputs[0].values,g(`highest`,n.capacity),g(`lowest`,n.capacity),i)}};return r}case`mfi`:{let t=l.period??14,n={...v,overlay:!1,title:`MFI ${t}`,range:[0,100],bands:[20,80],bandFill:!0,outputs:[f(`MFI${t}`,l.color??s,`line`,1.5)],compute(r,i){y(n,r,[`value`]),e.mfiInto(r.high,r.low,r.close,r.volume,r.length,t,n.outputs[0].values,g(`typical`,r.capacity),i)}};return n}default:{let t=l.period??14,n={...v,overlay:!1,title:`ATR ${t}`,outputs:[f(`ATR${t}`,l.color??r,`line`,1.5)],compute(r,i){y(n,r,[`value`]);let a=g(`tr`,r.capacity);e.trueRangeInto(r.high,r.low,r.close,r.length,a,i),e.rmaInto(a,r.length,t,n.outputs[0].values,i)}};return n}}},m=(e,t,n)=>{let r=new Set,i=new Set,a=0;return{studies:e.map(e=>{let o=e.id??l(e);for(let t=2;r.has(o);t++)o=`${e.id??l(e)}#${t}`;r.add(o);let s=e.type===`ma`||e.type===`ema`||e.type===`wma`?a++:0,c=t.find(e=>e.id===o);return c&&h(c.config,e)?(c.config=e,i.add(c),c):p(e,o,s,n)}),reused:i}},h=(e,t)=>{if(e===t)return!0;let n=new Set([...Object.keys(e),...Object.keys(t)]);n.delete(`visible`);for(let r of n){let n=e[r],i=t[r];if(n!==i&&!(Array.isArray(n)&&Array.isArray(i)&&n.join()===i.join()))return!1}return!0};exports.LINE_COLORS=t,exports.buildStudies=m,exports.createStudy=p,exports.indicatorKey=l;
|
|
2
2
|
//# sourceMappingURL=studies.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"studies.cjs","names":["smaInto","emaInto","wmaInto","require_indicators","LINE_COLORS","VIOLET","INFO","WARNING","indicatorKey","indicator","sourceInto","store","i","from","source","open","high","low","close","columnPool","columns","current","name","capacity","next","output","createStudy","column","paneHeight","config","base","bind","study","names","period","label","kernel","colorIndex","src","k","mid","up","dev","m","u","l","o","reset","utcOffset","maPeriod","outputs","v","fast","slow","signal","lineColor","signalColor","n","f","s","hist","dif","dea","kp","dp","kc","dc","jc","d","j","tr","buildStudies","used","reused","averages","indicators","id","old","previous","sameConfig","a","b","keys","key","va","vb"],"sources":["../../../../../charts/src/engine/trading/studies.ts"],"sourcesContent":["// Indicators of a chart: built from the declarative options, computed into\n// columns as large as the bar store, and recomputed from the first changed\n// bar only (a tick recomputes one value per output).\n\nimport {\n emaInto,\n kdjInto,\n rmaInto,\n rsiInto,\n smaInto,\n stdevInto,\n trueRangeInto,\n vwapInto,\n wmaInto,\n} from \"./indicators\";\nimport type { BarStore } from \"./store\";\nimport type { TradingIndicator, TradingPriceSource } from \"./types\";\n\n/** How an output is drawn */\nexport type StudyOutputKind = \"line\" | \"histogram\" | \"volume\";\n\nexport interface StudyOutput {\n /** Legend label (`\"MA7\"`, `\"DIF\"`) */\n label: string;\n values: Float64Array;\n /** CSS color (may be a `var()`) */\n color: string;\n kind: StudyOutputKind;\n width: number;\n}\n\nexport interface Study {\n id: string;\n type: TradingIndicator[\"type\"];\n config: TradingIndicator;\n /** Drawn over the price (else in its own pane) */\n overlay: boolean;\n /** Legend title (`\"MACD 12 26 9\"`) */\n title: string;\n outputs: StudyOutput[];\n /** Fixed value range of the pane (RSI) */\n range?: readonly [number, number];\n /** Horizontal reference lines (RSI 30 / 70, KDJ 20 / 80, MACD 0) */\n bands?: readonly number[];\n /** Output indices filled between (Bollinger bands) */\n fill?: readonly [number, number];\n /** Default height of its pane */\n height: number;\n /** Values formatted as volumes (compact) rather than prices */\n compact: boolean;\n /** Recomputes the outputs from bar `from` on */\n compute(store: BarStore, from: number): void;\n}\n\n/** Default line colors: vivid hues readable on light and dark backgrounds */\nexport const LINE_COLORS = [\n \"#f59e0b\",\n \"#a855f7\",\n \"#0ea5e9\",\n \"#ec4899\",\n \"#14b8a6\",\n \"#6366f1\",\n \"#84cc16\",\n];\n\nconst VIOLET = \"#a855f7\";\nconst INFO = \"#0ea5e9\";\nconst WARNING = \"#f59e0b\";\n\n/** Default id of an indicator: its type and parameters */\nexport const indicatorKey = (indicator: TradingIndicator): string => {\n switch (indicator.type) {\n case \"ma\":\n case \"ema\":\n case \"wma\":\n return `${indicator.type}:${indicator.period}${\n indicator.source && indicator.source !== \"close\"\n ? `:${indicator.source}`\n : \"\"\n }`;\n case \"boll\":\n return `boll:${indicator.period ?? 20}:${indicator.multiplier ?? 2}`;\n case \"vwap\":\n return `vwap:${indicator.reset ?? \"day\"}`;\n case \"volume\":\n return \"volume\";\n case \"macd\":\n return `macd:${indicator.fast ?? 12}:${indicator.slow ?? 26}:${indicator.signal ?? 9}`;\n case \"rsi\":\n return `rsi:${indicator.period ?? 14}`;\n case \"kdj\":\n return `kdj:${indicator.period ?? 9}:${indicator.kPeriod ?? 3}:${indicator.dPeriod ?? 3}`;\n default:\n return `atr:${indicator.period ?? 14}`;\n }\n};\n\n/** Writes the price `source` of bars `from..n` into `out` */\nconst sourceInto = (\n store: BarStore,\n source: TradingPriceSource,\n out: Float64Array,\n from: number,\n) => {\n const { open, high, low, close } = store;\n for (let i = from; i < store.length; i++) {\n switch (source) {\n case \"open\":\n out[i] = open[i];\n break;\n case \"high\":\n out[i] = high[i];\n break;\n case \"low\":\n out[i] = low[i];\n break;\n case \"hl2\":\n out[i] = (high[i] + low[i]) / 2;\n break;\n case \"hlc3\":\n out[i] = (high[i] + low[i] + close[i]) / 3;\n break;\n case \"ohlc4\":\n out[i] = (open[i] + high[i] + low[i] + close[i]) / 4;\n break;\n default:\n out[i] = close[i];\n }\n }\n};\n\n/**\n * Column set that grows with the store: `get(name)` returns a column of at\n * least `capacity` values, keeping the computed ones\n */\nconst columnPool = () => {\n const columns = new Map<string, Float64Array>();\n return (name: string, capacity: number): Float64Array => {\n const current = columns.get(name);\n if (current && current.length >= capacity) return current;\n const next = new Float64Array(capacity).fill(NaN);\n if (current) next.set(current);\n columns.set(name, next);\n return next;\n };\n};\n\nconst output = (\n label: string,\n color: string,\n kind: StudyOutputKind = \"line\",\n width = 1.5,\n): StudyOutput => ({\n label,\n values: new Float64Array(0),\n color,\n kind,\n width,\n});\n\n/**\n * Builds the runtime of an indicator. `colorIndex` picks the default color\n * of moving averages (one per average).\n */\nexport const createStudy = (\n config: TradingIndicator,\n id: string,\n colorIndex: number,\n utcOffset: number,\n): Study => {\n const column = columnPool();\n const paneHeight = \"height\" in config && config.height ? config.height : 110;\n const base = {\n id,\n type: config.type,\n config,\n height: paneHeight,\n compact: false,\n };\n /** Attaches the output columns (grown with the store) before computing */\n const bind = (study: Study, store: BarStore, names: string[]) => {\n study.outputs.forEach((o, i) => {\n o.values = column(names[i] ?? `out${i}`, store.capacity);\n });\n };\n\n switch (config.type) {\n case \"ma\":\n case \"ema\":\n case \"wma\": {\n const period = Math.max(1, Math.floor(config.period) || 1);\n const source = config.source ?? \"close\";\n const label = `${config.type.toUpperCase()}${period}`;\n const kernel =\n config.type === \"ma\"\n ? smaInto\n : config.type === \"ema\"\n ? emaInto\n : wmaInto;\n const study: Study = {\n ...base,\n overlay: true,\n title: label,\n outputs: [\n output(\n label,\n config.color ?? LINE_COLORS[colorIndex % LINE_COLORS.length],\n \"line\",\n config.lineWidth ?? 1.5,\n ),\n ],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n let src: Float64Array = store.close;\n if (source !== \"close\") {\n src = column(\"src\", store.capacity);\n sourceInto(store, source, src, from);\n }\n kernel(src, store.length, period, study.outputs[0].values, from);\n },\n };\n return study;\n }\n case \"boll\": {\n const period = config.period ?? 20;\n const k = config.multiplier ?? 2;\n const [mid, up, low] = config.colors ?? [WARNING, INFO, INFO];\n const study: Study = {\n ...base,\n overlay: true,\n title: `BOLL ${period} ${k}`,\n outputs: [\n output(\"MID\", mid ?? WARNING, \"line\", 1.25),\n output(\"UB\", up ?? INFO, \"line\", 1.25),\n output(\"LB\", low ?? up ?? INFO, \"line\", 1.25),\n ],\n ...(config.fill === false ? {} : { fill: [1, 2] as const }),\n compute(store, from) {\n bind(study, store, [\"mid\", \"up\", \"low\"]);\n const dev = column(\"dev\", store.capacity);\n const [m, u, l] = study.outputs.map((o) => o.values);\n smaInto(store.close, store.length, period, m, from);\n stdevInto(store.close, store.length, period, dev, from);\n for (let i = from; i < store.length; i++) {\n u[i] = m[i] + k * dev[i];\n l[i] = m[i] - k * dev[i];\n }\n },\n };\n return study;\n }\n case \"vwap\": {\n const reset = config.reset ?? \"day\";\n const study: Study = {\n ...base,\n overlay: true,\n title: \"VWAP\",\n outputs: [output(\"VWAP\", config.color ?? \"#ec4899\", \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n vwapInto(\n store.high,\n store.low,\n store.close,\n store.volume,\n store.time,\n store.length,\n reset,\n utcOffset,\n study.outputs[0].values,\n column(\"pv\", store.capacity),\n column(\"vol\", store.capacity),\n from,\n );\n },\n };\n return study;\n }\n case \"volume\": {\n const maPeriod = config.maPeriod;\n const outputs = [output(\"VOL\", \"\", \"volume\")];\n if (maPeriod) outputs.push(output(`MA${maPeriod}`, INFO, \"line\", 1.25));\n const study: Study = {\n ...base,\n overlay: !!config.overlay,\n compact: true,\n title: \"VOL\",\n outputs,\n compute(store, from) {\n bind(study, store, [\"vol\", \"ma\"]);\n const v = study.outputs[0].values;\n v.set(store.volume.subarray(from, store.length), from);\n if (maPeriod)\n smaInto(v, store.length, maPeriod, study.outputs[1].values, from);\n },\n };\n return study;\n }\n case \"macd\": {\n const fast = config.fast ?? 12;\n const slow = config.slow ?? 26;\n const signal = config.signal ?? 9;\n const [lineColor, signalColor] = config.colors ?? [INFO, WARNING];\n const study: Study = {\n ...base,\n overlay: false,\n title: `MACD ${fast} ${slow} ${signal}`,\n bands: [0],\n outputs: [\n output(\"MACD\", \"\", \"histogram\"),\n output(\"DIF\", lineColor ?? INFO, \"line\", 1.25),\n output(\"DEA\", signalColor ?? WARNING, \"line\", 1.25),\n ],\n compute(store, from) {\n bind(study, store, [\"hist\", \"dif\", \"dea\"]);\n const n = store.length;\n const f = column(\"fast\", store.capacity);\n const s = column(\"slow\", store.capacity);\n const [hist, dif, dea] = study.outputs.map((o) => o.values);\n emaInto(store.close, n, fast, f, from);\n emaInto(store.close, n, slow, s, from);\n for (let i = from; i < n; i++) dif[i] = f[i] - s[i];\n emaInto(dif, n, signal, dea, from);\n for (let i = from; i < n; i++) hist[i] = dif[i] - dea[i];\n },\n };\n return study;\n }\n case \"rsi\": {\n const period = config.period ?? 14;\n const study: Study = {\n ...base,\n overlay: false,\n title: `RSI ${period}`,\n range: [0, 100],\n bands: [config.oversold ?? 30, config.overbought ?? 70],\n outputs: [output(`RSI${period}`, config.color ?? VIOLET, \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n rsiInto(\n store.close,\n store.length,\n period,\n study.outputs[0].values,\n column(\"gain\", store.capacity),\n column(\"loss\", store.capacity),\n from,\n );\n },\n };\n return study;\n }\n case \"kdj\": {\n const period = config.period ?? 9;\n const kp = config.kPeriod ?? 3;\n const dp = config.dPeriod ?? 3;\n const [kc, dc, jc] = config.colors ?? [WARNING, INFO, VIOLET];\n const study: Study = {\n ...base,\n overlay: false,\n title: `KDJ ${period} ${kp} ${dp}`,\n bands: [20, 80],\n outputs: [\n output(\"K\", kc ?? WARNING, \"line\", 1.25),\n output(\"D\", dc ?? INFO, \"line\", 1.25),\n output(\"J\", jc ?? VIOLET, \"line\", 1.25),\n ],\n compute(store, from) {\n bind(study, store, [\"k\", \"d\", \"j\"]);\n const [k, d, j] = study.outputs.map((o) => o.values);\n kdjInto(\n store.high,\n store.low,\n store.close,\n store.length,\n period,\n kp,\n dp,\n k,\n d,\n j,\n from,\n );\n },\n };\n return study;\n }\n default: {\n const period = config.period ?? 14;\n const study: Study = {\n ...base,\n overlay: false,\n title: `ATR ${period}`,\n outputs: [output(`ATR${period}`, config.color ?? INFO, \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n const tr = column(\"tr\", store.capacity);\n trueRangeInto(\n store.high,\n store.low,\n store.close,\n store.length,\n tr,\n from,\n );\n rmaInto(tr, store.length, period, study.outputs[0].values, from);\n },\n };\n return study;\n }\n }\n};\n\n/**\n * Builds the studies of `indicators`, reusing the previous runtime of an\n * indicator whose config is unchanged (same id and same parameters)\n */\nexport const buildStudies = (\n indicators: readonly TradingIndicator[],\n previous: readonly Study[],\n utcOffset: number,\n): { studies: Study[]; reused: Set<Study> } => {\n const used = new Set<string>();\n const reused = new Set<Study>();\n let averages = 0;\n const studies = indicators.map((config) => {\n let id = config.id ?? indicatorKey(config);\n for (let k = 2; used.has(id); k++)\n id = `${config.id ?? indicatorKey(config)}#${k}`;\n used.add(id);\n const colorIndex =\n config.type === \"ma\" || config.type === \"ema\" || config.type === \"wma\"\n ? averages++\n : 0;\n const old = previous.find((s) => s.id === id);\n if (old && sameConfig(old.config, config)) {\n // same parameters: keep the computed values (visibility may differ)\n old.config = config;\n reused.add(old);\n return old;\n }\n return createStudy(config, id, colorIndex, utcOffset);\n });\n return { studies, reused };\n};\n\nconst sameConfig = (a: TradingIndicator, b: TradingIndicator) => {\n if (a === b) return true;\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n keys.delete(\"visible\");\n for (const key of keys) {\n const va = (a as unknown as Record<string, unknown>)[key];\n const vb = (b as unknown as Record<string, unknown>)[key];\n if (va === vb) continue;\n if (Array.isArray(va) && Array.isArray(vb) && va.join() === vb.join())\n continue;\n return false;\n }\n return true;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"studies.cjs","names":["smaInto","emaInto","wmaInto","require_indicators","LINE_COLORS","VIOLET","INFO","WARNING","TEAL","INDIGO","PINK","BLUE","indicatorKey","indicator","sourceInto","store","i","from","source","open","high","low","close","columnPool","columns","current","name","capacity","next","output","createStudy","column","paneHeight","config","base","bind","study","names","period","label","kernel","colorIndex","src","k","mid","up","dev","m","u","o","reset","utcOffset","maPeriod","outputs","v","fast","slow","signal","lineColor","signalColor","n","f","s","hist","dif","dea","kp","dp","kc","dc","jc","d","j","start","increment","maximum","cp","bp","sp","shift","cc","bc","lc","ac","sc","conv","kijun","lag","a","b","value","direction","down","keltner","atrPeriod","band","rp","adxPeriod","pc","mc","plus","minus","adx","tr","buildStudies","used","reused","averages","indicators","id","old","previous","sameConfig","keys","key","va","vb"],"sources":["../../../../../charts/src/engine/trading/studies.ts"],"sourcesContent":["// Indicators of a chart: built from the declarative options, computed into\n// columns as large as the bar store, and recomputed from the first changed\n// bar only (a tick recomputes one value per output).\n\nimport {\n cciInto,\n dmiInto,\n donchianInto,\n emaInto,\n ichimokuInto,\n kdjInto,\n keltnerInto,\n mfiInto,\n obvInto,\n psarInto,\n rmaInto,\n rsiInto,\n smaInto,\n stdevInto,\n stochRsiInto,\n supertrendInto,\n trueRangeInto,\n vwapInto,\n williamsRInto,\n wmaInto,\n} from \"./indicators\";\nimport type { UtcOffset } from \"./format\";\nimport type { BarStore } from \"./store\";\nimport type { TradingIndicator, TradingPriceSource } from \"./types\";\n\n/**\n * How an output is drawn: a line, a histogram around zero (colored by\n * sign and slope), the volume bars, or dots (colored by their side of the\n * close, like the parabolic SAR)\n */\nexport type StudyOutputKind = \"line\" | \"histogram\" | \"volume\" | \"dots\";\n\nexport interface StudyOutput {\n /** Legend label (`\"MA7\"`, `\"DIF\"`) */\n label: string;\n values: Float64Array;\n /**\n * CSS color (may be a `var()`); `\"up\"` / `\"down\"` stand for the colors\n * of rising / falling bars\n */\n color: string;\n kind: StudyOutputKind;\n width: number;\n /** Drawn this many bars later (Ichimoku spans ahead, lagging span back) */\n shift: number;\n /** Opacity of the line (1: opaque) */\n alpha: number;\n}\n\n/** Area filled between two outputs */\nexport interface StudyFill {\n /** Output indices */\n a: number;\n b: number;\n /** Color while `a` is above `b` */\n color: string;\n /** Color while `a` is below `b` (the same color by default) */\n colorBelow?: string;\n opacity: number;\n}\n\nexport interface Study {\n id: string;\n type: TradingIndicator[\"type\"];\n config: TradingIndicator;\n /** Drawn over the price (else in its own pane) */\n overlay: boolean;\n /** Legend title (`\"MACD 12 26 9\"`); the parameters when `titleKey` is set */\n title: string;\n /** Localized name before the parameters in the legend */\n titleKey?: \"ichimoku\" | \"supertrend\";\n outputs: StudyOutput[];\n /** Fixed value range of the pane (RSI) */\n range?: readonly [number, number];\n /** Horizontal reference lines (RSI 30 / 70, KDJ 20 / 80, MACD 0) */\n bands?: readonly number[];\n /** Shades the space between the first two bands (RSI, MFI, CCI...) */\n bandFill?: boolean;\n /** Areas filled between outputs (channels, Ichimoku cloud) */\n fills: StudyFill[];\n /** Legend values without their labels (channels: the colors say it) */\n plainLegend?: boolean;\n /** A single legend value: the first finite output (SuperTrend) */\n mergeLegend?: boolean;\n /** The pane keeps 0 in view (MACD, OBV) */\n zero?: boolean;\n /** Default height of its pane */\n height: number;\n /** Values formatted as volumes (compact) rather than prices */\n compact: boolean;\n /** Recomputes the outputs from bar `from` on */\n compute(store: BarStore, from: number): void;\n}\n\n/** Default line colors: vivid hues readable on light and dark backgrounds */\nexport const LINE_COLORS = [\n \"#f59e0b\",\n \"#a855f7\",\n \"#0ea5e9\",\n \"#ec4899\",\n \"#14b8a6\",\n \"#6366f1\",\n \"#84cc16\",\n];\n\nconst VIOLET = \"#a855f7\";\nconst INFO = \"#0ea5e9\";\nconst WARNING = \"#f59e0b\";\nconst TEAL = \"#14b8a6\";\nconst INDIGO = \"#6366f1\";\nconst PINK = \"#ec4899\";\nconst BLUE = \"#2962ff\";\n\n/** Default id of an indicator: its type and parameters */\nexport const indicatorKey = (indicator: TradingIndicator): string => {\n switch (indicator.type) {\n case \"ma\":\n case \"ema\":\n case \"wma\":\n return `${indicator.type}:${indicator.period}${\n indicator.source && indicator.source !== \"close\"\n ? `:${indicator.source}`\n : \"\"\n }`;\n case \"boll\":\n return `boll:${indicator.period ?? 20}:${indicator.multiplier ?? 2}`;\n case \"vwap\":\n return `vwap:${indicator.reset ?? \"day\"}`;\n case \"volume\":\n return \"volume\";\n case \"macd\":\n return `macd:${indicator.fast ?? 12}:${indicator.slow ?? 26}:${indicator.signal ?? 9}`;\n case \"rsi\":\n return `rsi:${indicator.period ?? 14}`;\n case \"kdj\":\n return `kdj:${indicator.period ?? 9}:${indicator.kPeriod ?? 3}:${indicator.dPeriod ?? 3}`;\n case \"psar\":\n return `psar:${indicator.start ?? 0.02}:${indicator.increment ?? indicator.start ?? 0.02}:${indicator.maximum ?? 0.2}`;\n case \"ichimoku\":\n return `ichimoku:${indicator.conversionPeriod ?? 9}:${indicator.basePeriod ?? 26}:${indicator.spanBPeriod ?? 52}:${indicator.displacement ?? 26}`;\n case \"supertrend\":\n return `supertrend:${indicator.period ?? 10}:${indicator.multiplier ?? 3}`;\n case \"keltner\":\n return `keltner:${indicator.period ?? 20}:${indicator.multiplier ?? 2}:${indicator.atrPeriod ?? 10}`;\n case \"donchian\":\n return `donchian:${indicator.period ?? 20}`;\n case \"obv\":\n return \"obv\";\n case \"cci\":\n return `cci:${indicator.period ?? 20}`;\n case \"stochRsi\":\n return `stochRsi:${indicator.rsiPeriod ?? 14}:${indicator.stochPeriod ?? 14}:${indicator.kPeriod ?? 3}:${indicator.dPeriod ?? 3}`;\n case \"dmi\":\n return `dmi:${indicator.period ?? 14}:${indicator.adxPeriod ?? 14}`;\n case \"williamsR\":\n return `williamsR:${indicator.period ?? 14}`;\n case \"mfi\":\n return `mfi:${indicator.period ?? 14}`;\n default:\n return `atr:${indicator.period ?? 14}`;\n }\n};\n\n/** Writes the price `source` of bars `from..n` into `out` */\nconst sourceInto = (\n store: BarStore,\n source: TradingPriceSource,\n out: Float64Array,\n from: number,\n) => {\n const { open, high, low, close } = store;\n for (let i = from; i < store.length; i++) {\n switch (source) {\n case \"open\":\n out[i] = open[i];\n break;\n case \"high\":\n out[i] = high[i];\n break;\n case \"low\":\n out[i] = low[i];\n break;\n case \"hl2\":\n out[i] = (high[i] + low[i]) / 2;\n break;\n case \"hlc3\":\n out[i] = (high[i] + low[i] + close[i]) / 3;\n break;\n case \"ohlc4\":\n out[i] = (open[i] + high[i] + low[i] + close[i]) / 4;\n break;\n default:\n out[i] = close[i];\n }\n }\n};\n\n/**\n * Column set that grows with the store: `get(name)` returns a column of at\n * least `capacity` values, keeping the computed ones\n */\nconst columnPool = () => {\n const columns = new Map<string, Float64Array>();\n return (name: string, capacity: number): Float64Array => {\n const current = columns.get(name);\n if (current && current.length >= capacity) return current;\n const next = new Float64Array(capacity).fill(NaN);\n if (current) next.set(current);\n columns.set(name, next);\n return next;\n };\n};\n\nconst output = (\n label: string,\n color: string,\n kind: StudyOutputKind = \"line\",\n width = 1.5,\n shift = 0,\n alpha = 1,\n): StudyOutput => ({\n label,\n values: new Float64Array(0),\n color,\n kind,\n width,\n shift,\n alpha,\n});\n\n/**\n * Builds the runtime of an indicator. `colorIndex` picks the default color\n * of moving averages (one per average).\n */\nexport const createStudy = (\n config: TradingIndicator,\n id: string,\n colorIndex: number,\n utcOffset: UtcOffset,\n): Study => {\n const column = columnPool();\n const paneHeight = \"height\" in config && config.height ? config.height : 110;\n const base = {\n id,\n type: config.type,\n config,\n height: paneHeight,\n compact: false,\n fills: [] as StudyFill[],\n };\n /** Attaches the output columns (grown with the store) before computing */\n const bind = (study: Study, store: BarStore, names: string[]) => {\n study.outputs.forEach((o, i) => {\n o.values = column(names[i] ?? `out${i}`, store.capacity);\n });\n };\n\n switch (config.type) {\n case \"ma\":\n case \"ema\":\n case \"wma\": {\n const period = Math.max(1, Math.floor(config.period) || 1);\n const source = config.source ?? \"close\";\n const label = `${config.type.toUpperCase()}${period}`;\n const kernel =\n config.type === \"ma\"\n ? smaInto\n : config.type === \"ema\"\n ? emaInto\n : wmaInto;\n const study: Study = {\n ...base,\n overlay: true,\n title: label,\n outputs: [\n output(\n label,\n config.color ?? LINE_COLORS[colorIndex % LINE_COLORS.length],\n \"line\",\n config.lineWidth ?? 1.5,\n ),\n ],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n let src: Float64Array = store.close;\n if (source !== \"close\") {\n src = column(\"src\", store.capacity);\n sourceInto(store, source, src, from);\n }\n kernel(src, store.length, period, study.outputs[0].values, from);\n },\n };\n return study;\n }\n case \"boll\": {\n const period = config.period ?? 20;\n const k = config.multiplier ?? 2;\n const [mid, up, low] = config.colors ?? [WARNING, INFO, INFO];\n const study: Study = {\n ...base,\n overlay: true,\n title: `BOLL ${period} ${k}`,\n plainLegend: true,\n outputs: [\n output(\"MID\", mid ?? WARNING, \"line\", 1.25),\n output(\"UB\", up ?? INFO, \"line\", 1.25),\n output(\"LB\", low ?? up ?? INFO, \"line\", 1.25),\n ],\n fills:\n config.fill === false\n ? []\n : [{ a: 1, b: 2, color: up ?? INFO, opacity: 0.07 }],\n compute(store, from) {\n bind(study, store, [\"mid\", \"up\", \"low\"]);\n const dev = column(\"dev\", store.capacity);\n const [m, u, l] = study.outputs.map((o) => o.values);\n smaInto(store.close, store.length, period, m, from);\n stdevInto(store.close, store.length, period, dev, from);\n for (let i = from; i < store.length; i++) {\n u[i] = m[i] + k * dev[i];\n l[i] = m[i] - k * dev[i];\n }\n },\n };\n return study;\n }\n case \"vwap\": {\n const reset = config.reset ?? \"day\";\n const study: Study = {\n ...base,\n overlay: true,\n title: \"VWAP\",\n outputs: [output(\"VWAP\", config.color ?? \"#ec4899\", \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n vwapInto(\n store.high,\n store.low,\n store.close,\n store.volume,\n store.time,\n store.length,\n reset,\n utcOffset,\n study.outputs[0].values,\n column(\"pv\", store.capacity),\n column(\"vol\", store.capacity),\n from,\n );\n },\n };\n return study;\n }\n case \"volume\": {\n const maPeriod = config.maPeriod;\n const outputs = [output(\"VOL\", \"\", \"volume\")];\n if (maPeriod) outputs.push(output(`MA${maPeriod}`, INFO, \"line\", 1.25));\n const study: Study = {\n ...base,\n overlay: !!config.overlay,\n compact: true,\n title: \"VOL\",\n outputs,\n compute(store, from) {\n bind(study, store, [\"vol\", \"ma\"]);\n const v = study.outputs[0].values;\n v.set(store.volume.subarray(from, store.length), from);\n if (maPeriod)\n smaInto(v, store.length, maPeriod, study.outputs[1].values, from);\n },\n };\n return study;\n }\n case \"macd\": {\n const fast = config.fast ?? 12;\n const slow = config.slow ?? 26;\n const signal = config.signal ?? 9;\n const [lineColor, signalColor] = config.colors ?? [INFO, WARNING];\n const study: Study = {\n ...base,\n overlay: false,\n title: `MACD ${fast} ${slow} ${signal}`,\n bands: [0],\n zero: true,\n outputs: [\n output(\"MACD\", \"\", \"histogram\"),\n output(\"DIF\", lineColor ?? INFO, \"line\", 1.25),\n output(\"DEA\", signalColor ?? WARNING, \"line\", 1.25),\n ],\n compute(store, from) {\n bind(study, store, [\"hist\", \"dif\", \"dea\"]);\n const n = store.length;\n const f = column(\"fast\", store.capacity);\n const s = column(\"slow\", store.capacity);\n const [hist, dif, dea] = study.outputs.map((o) => o.values);\n emaInto(store.close, n, fast, f, from);\n emaInto(store.close, n, slow, s, from);\n for (let i = from; i < n; i++) dif[i] = f[i] - s[i];\n emaInto(dif, n, signal, dea, from);\n for (let i = from; i < n; i++) hist[i] = dif[i] - dea[i];\n },\n };\n return study;\n }\n case \"rsi\": {\n const period = config.period ?? 14;\n const study: Study = {\n ...base,\n overlay: false,\n title: `RSI ${period}`,\n range: [0, 100],\n bands: [config.oversold ?? 30, config.overbought ?? 70],\n bandFill: true,\n outputs: [output(`RSI${period}`, config.color ?? VIOLET, \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n rsiInto(\n store.close,\n store.length,\n period,\n study.outputs[0].values,\n column(\"gain\", store.capacity),\n column(\"loss\", store.capacity),\n from,\n );\n },\n };\n return study;\n }\n case \"kdj\": {\n const period = config.period ?? 9;\n const kp = config.kPeriod ?? 3;\n const dp = config.dPeriod ?? 3;\n const [kc, dc, jc] = config.colors ?? [WARNING, INFO, VIOLET];\n const study: Study = {\n ...base,\n overlay: false,\n title: `KDJ ${period} ${kp} ${dp}`,\n bands: [20, 80],\n outputs: [\n output(\"K\", kc ?? WARNING, \"line\", 1.25),\n output(\"D\", dc ?? INFO, \"line\", 1.25),\n output(\"J\", jc ?? VIOLET, \"line\", 1.25),\n ],\n compute(store, from) {\n bind(study, store, [\"k\", \"d\", \"j\"]);\n const [k, d, j] = study.outputs.map((o) => o.values);\n kdjInto(\n store.high,\n store.low,\n store.close,\n store.length,\n period,\n kp,\n dp,\n k,\n d,\n j,\n from,\n );\n },\n };\n return study;\n }\n case \"psar\": {\n const start = config.start ?? 0.02;\n const increment = config.increment ?? start;\n const maximum = config.maximum ?? 0.2;\n const study: Study = {\n ...base,\n overlay: true,\n title: `SAR ${start} ${increment} ${maximum}`,\n outputs: [output(\"SAR\", config.color ?? \"\", \"dots\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n psarInto(\n store.high,\n store.low,\n store.length,\n start,\n increment,\n maximum,\n study.outputs[0].values,\n {\n ep: column(\"ep\", store.capacity),\n af: column(\"af\", store.capacity),\n trend: column(\"trend\", store.capacity),\n },\n from,\n );\n },\n };\n return study;\n }\n case \"ichimoku\": {\n const cp = config.conversionPeriod ?? 9;\n const bp = config.basePeriod ?? 26;\n const sp = config.spanBPeriod ?? 52;\n const shift = Math.max(1, Math.floor(config.displacement ?? 26)) - 1;\n const [cc, bc, lc, ac, sc] = config.colors ?? [];\n const study: Study = {\n ...base,\n overlay: true,\n title: `${cp} ${bp} ${sp} ${shift + 1}`,\n titleKey: \"ichimoku\",\n plainLegend: true,\n outputs: [\n output(\"CONV\", cc ?? BLUE, \"line\", 1.25),\n output(\"BASE\", bc ?? \"#e65100\", \"line\", 1.25),\n output(\"LAG\", lc ?? \"#43a047\", \"line\", 1.25, -shift),\n output(\"A\", ac ?? \"up\", \"line\", 1, shift, 0.55),\n output(\"B\", sc ?? \"down\", \"line\", 1, shift, 0.55),\n ],\n fills:\n config.cloud === false\n ? []\n : [\n {\n a: 3,\n b: 4,\n color: ac ?? \"up\",\n colorBelow: sc ?? \"down\",\n opacity: 0.12,\n },\n ],\n compute(store, from) {\n bind(study, store, [\"conv\", \"base\", \"lag\", \"a\", \"b\"]);\n const [conv, kijun, lag, a, b] = study.outputs.map((o) => o.values);\n ichimokuInto(\n store.high,\n store.low,\n store.length,\n cp,\n bp,\n sp,\n conv,\n kijun,\n a,\n b,\n {\n highest: column(\"highest\", store.capacity),\n lowest: column(\"lowest\", store.capacity),\n },\n from,\n );\n lag.set(store.close.subarray(from, store.length), from);\n },\n };\n return study;\n }\n case \"supertrend\": {\n const period = config.period ?? 10;\n const k = config.multiplier ?? 3;\n const study: Study = {\n ...base,\n overlay: true,\n title: `${period} ${k}`,\n titleKey: \"supertrend\",\n mergeLegend: true,\n outputs: [\n output(\"UP\", config.upColor ?? \"up\", \"line\", 2),\n output(\"DOWN\", config.downColor ?? \"down\", \"line\", 2),\n ],\n compute(store, from) {\n bind(study, store, [\"up\", \"down\"]);\n const value = column(\"value\", store.capacity);\n const direction = column(\"direction\", store.capacity);\n supertrendInto(\n store.high,\n store.low,\n store.close,\n store.length,\n period,\n k,\n value,\n direction,\n {\n tr: column(\"tr\", store.capacity),\n atr: column(\"atr\", store.capacity),\n upper: column(\"upper\", store.capacity),\n lower: column(\"lower\", store.capacity),\n },\n from,\n );\n const [up, down] = study.outputs.map((o) => o.values);\n for (let i = from; i < store.length; i++) {\n up[i] = direction[i] === 1 ? value[i] : NaN;\n down[i] = direction[i] === -1 ? value[i] : NaN;\n }\n },\n };\n return study;\n }\n case \"keltner\":\n case \"donchian\": {\n const keltner = config.type === \"keltner\";\n const period = config.period ?? 20;\n const k = keltner ? (config.multiplier ?? 2) : 0;\n const atrPeriod = keltner ? (config.atrPeriod ?? 10) : 0;\n const band = keltner ? TEAL : INDIGO;\n const [mid, up, low] = config.colors ?? [WARNING, band, band];\n const study: Study = {\n ...base,\n overlay: true,\n title: keltner ? `KC ${period} ${k} ${atrPeriod}` : `DC ${period}`,\n plainLegend: true,\n outputs: [\n output(\"MID\", mid ?? WARNING, \"line\", 1.25),\n output(\"UB\", up ?? band, \"line\", 1.25),\n output(\"LB\", low ?? up ?? band, \"line\", 1.25),\n ],\n fills:\n config.fill === false\n ? []\n : [{ a: 1, b: 2, color: up ?? band, opacity: 0.07 }],\n compute(store, from) {\n bind(study, store, [\"mid\", \"up\", \"low\"]);\n const [m, u, l] = study.outputs.map((o) => o.values);\n if (keltner) {\n keltnerInto(\n store.high,\n store.low,\n store.close,\n store.length,\n period,\n k,\n atrPeriod,\n m,\n u,\n l,\n {\n tr: column(\"tr\", store.capacity),\n atr: column(\"atr\", store.capacity),\n },\n from,\n );\n } else {\n donchianInto(\n store.high,\n store.low,\n store.length,\n period,\n u,\n l,\n m,\n from,\n );\n }\n },\n };\n return study;\n }\n case \"obv\": {\n const maPeriod = config.maPeriod;\n const outputs = [output(\"OBV\", config.color ?? INFO, \"line\", 1.5)];\n if (maPeriod)\n outputs.push(output(`MA${maPeriod}`, WARNING, \"line\", 1.25));\n const study: Study = {\n ...base,\n overlay: false,\n compact: true,\n title: \"OBV\",\n outputs,\n compute(store, from) {\n bind(study, store, [\"obv\", \"ma\"]);\n const v = study.outputs[0].values;\n obvInto(store.close, store.volume, store.length, v, from);\n if (maPeriod)\n smaInto(v, store.length, maPeriod, study.outputs[1].values, from);\n },\n };\n return study;\n }\n case \"cci\": {\n const period = config.period ?? 20;\n const study: Study = {\n ...base,\n overlay: false,\n title: `CCI ${period}`,\n bands: [-100, 100],\n bandFill: true,\n outputs: [output(`CCI${period}`, config.color ?? TEAL, \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n cciInto(\n store.high,\n store.low,\n store.close,\n store.length,\n period,\n study.outputs[0].values,\n column(\"typical\", store.capacity),\n column(\"mean\", store.capacity),\n from,\n );\n },\n };\n return study;\n }\n case \"stochRsi\": {\n const rp = config.rsiPeriod ?? 14;\n const sp = config.stochPeriod ?? 14;\n const kp = config.kPeriod ?? 3;\n const dp = config.dPeriod ?? 3;\n const [kc, dc] = config.colors ?? [INFO, WARNING];\n const study: Study = {\n ...base,\n overlay: false,\n title: `Stoch RSI ${rp} ${sp} ${kp} ${dp}`,\n range: [0, 100],\n bands: [20, 80],\n bandFill: true,\n outputs: [\n output(\"K\", kc ?? INFO, \"line\", 1.25),\n output(\"D\", dc ?? WARNING, \"line\", 1.25),\n ],\n compute(store, from) {\n bind(study, store, [\"k\", \"d\"]);\n const [k, d] = study.outputs.map((o) => o.values);\n stochRsiInto(\n store.close,\n store.length,\n rp,\n sp,\n kp,\n dp,\n k,\n d,\n {\n rsi: column(\"rsi\", store.capacity),\n gain: column(\"gain\", store.capacity),\n loss: column(\"loss\", store.capacity),\n highest: column(\"highest\", store.capacity),\n lowest: column(\"lowest\", store.capacity),\n raw: column(\"raw\", store.capacity),\n },\n from,\n );\n },\n };\n return study;\n }\n case \"dmi\": {\n const period = config.period ?? 14;\n const adxPeriod = config.adxPeriod ?? 14;\n const [pc, mc, ac] = config.colors ?? [\"up\", \"down\", WARNING];\n const study: Study = {\n ...base,\n overlay: false,\n title: `DMI ${period} ${adxPeriod}`,\n bands: [25],\n outputs: [\n output(\"+DI\", pc ?? \"up\", \"line\", 1.25),\n output(\"−DI\", mc ?? \"down\", \"line\", 1.25),\n output(\"ADX\", ac ?? WARNING, \"line\", 1.75),\n ],\n compute(store, from) {\n bind(study, store, [\"plus\", \"minus\", \"adx\"]);\n const [plus, minus, adx] = study.outputs.map((o) => o.values);\n dmiInto(\n store.high,\n store.low,\n store.close,\n store.length,\n period,\n adxPeriod,\n plus,\n minus,\n adx,\n {\n tr: column(\"tr\", store.capacity),\n plusDm: column(\"plusDm\", store.capacity),\n minusDm: column(\"minusDm\", store.capacity),\n smoothTr: column(\"smoothTr\", store.capacity),\n smoothPlus: column(\"smoothPlus\", store.capacity),\n smoothMinus: column(\"smoothMinus\", store.capacity),\n dx: column(\"dx\", store.capacity),\n },\n from,\n );\n },\n };\n return study;\n }\n case \"williamsR\": {\n const period = config.period ?? 14;\n const study: Study = {\n ...base,\n overlay: false,\n title: `%R ${period}`,\n range: [-100, 0],\n bands: [-80, -20],\n bandFill: true,\n outputs: [output(`%R${period}`, config.color ?? VIOLET, \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n williamsRInto(\n store.high,\n store.low,\n store.close,\n store.length,\n period,\n study.outputs[0].values,\n column(\"highest\", store.capacity),\n column(\"lowest\", store.capacity),\n from,\n );\n },\n };\n return study;\n }\n case \"mfi\": {\n const period = config.period ?? 14;\n const study: Study = {\n ...base,\n overlay: false,\n title: `MFI ${period}`,\n range: [0, 100],\n bands: [20, 80],\n bandFill: true,\n outputs: [output(`MFI${period}`, config.color ?? PINK, \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n mfiInto(\n store.high,\n store.low,\n store.close,\n store.volume,\n store.length,\n period,\n study.outputs[0].values,\n column(\"typical\", store.capacity),\n from,\n );\n },\n };\n return study;\n }\n default: {\n const period = config.period ?? 14;\n const study: Study = {\n ...base,\n overlay: false,\n title: `ATR ${period}`,\n outputs: [output(`ATR${period}`, config.color ?? INFO, \"line\", 1.5)],\n compute(store, from) {\n bind(study, store, [\"value\"]);\n const tr = column(\"tr\", store.capacity);\n trueRangeInto(\n store.high,\n store.low,\n store.close,\n store.length,\n tr,\n from,\n );\n rmaInto(tr, store.length, period, study.outputs[0].values, from);\n },\n };\n return study;\n }\n }\n};\n\n/**\n * Builds the studies of `indicators`, reusing the previous runtime of an\n * indicator whose config is unchanged (same id and same parameters)\n */\nexport const buildStudies = (\n indicators: readonly TradingIndicator[],\n previous: readonly Study[],\n utcOffset: UtcOffset,\n): { studies: Study[]; reused: Set<Study> } => {\n const used = new Set<string>();\n const reused = new Set<Study>();\n let averages = 0;\n const studies = indicators.map((config) => {\n let id = config.id ?? indicatorKey(config);\n for (let k = 2; used.has(id); k++)\n id = `${config.id ?? indicatorKey(config)}#${k}`;\n used.add(id);\n const colorIndex =\n config.type === \"ma\" || config.type === \"ema\" || config.type === \"wma\"\n ? averages++\n : 0;\n const old = previous.find((s) => s.id === id);\n if (old && sameConfig(old.config, config)) {\n // same parameters: keep the computed values (visibility may differ)\n old.config = config;\n reused.add(old);\n return old;\n }\n return createStudy(config, id, colorIndex, utcOffset);\n });\n return { studies, reused };\n};\n\nconst sameConfig = (a: TradingIndicator, b: TradingIndicator) => {\n if (a === b) return true;\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n keys.delete(\"visible\");\n for (const key of keys) {\n const va = (a as unknown as Record<string, unknown>)[key];\n const vb = (b as unknown as Record<string, unknown>)[key];\n if (va === vb) continue;\n if (Array.isArray(va) && Array.isArray(vb) && va.join() === vb.join())\n continue;\n return false;\n }\n return true;\n};\n"],"mappings":"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"}
|
|
@@ -1,15 +1,38 @@
|
|
|
1
|
+
import { UtcOffset } from './format.cjs';
|
|
1
2
|
import { BarStore } from './store.cjs';
|
|
2
3
|
import { TradingIndicator } from './types.cjs';
|
|
3
|
-
/**
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* How an output is drawn: a line, a histogram around zero (colored by
|
|
6
|
+
* sign and slope), the volume bars, or dots (colored by their side of the
|
|
7
|
+
* close, like the parabolic SAR)
|
|
8
|
+
*/
|
|
9
|
+
export type StudyOutputKind = "line" | "histogram" | "volume" | "dots";
|
|
5
10
|
export interface StudyOutput {
|
|
6
11
|
/** Legend label (`"MA7"`, `"DIF"`) */
|
|
7
12
|
label: string;
|
|
8
13
|
values: Float64Array;
|
|
9
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* CSS color (may be a `var()`); `"up"` / `"down"` stand for the colors
|
|
16
|
+
* of rising / falling bars
|
|
17
|
+
*/
|
|
10
18
|
color: string;
|
|
11
19
|
kind: StudyOutputKind;
|
|
12
20
|
width: number;
|
|
21
|
+
/** Drawn this many bars later (Ichimoku spans ahead, lagging span back) */
|
|
22
|
+
shift: number;
|
|
23
|
+
/** Opacity of the line (1: opaque) */
|
|
24
|
+
alpha: number;
|
|
25
|
+
}
|
|
26
|
+
/** Area filled between two outputs */
|
|
27
|
+
export interface StudyFill {
|
|
28
|
+
/** Output indices */
|
|
29
|
+
a: number;
|
|
30
|
+
b: number;
|
|
31
|
+
/** Color while `a` is above `b` */
|
|
32
|
+
color: string;
|
|
33
|
+
/** Color while `a` is below `b` (the same color by default) */
|
|
34
|
+
colorBelow?: string;
|
|
35
|
+
opacity: number;
|
|
13
36
|
}
|
|
14
37
|
export interface Study {
|
|
15
38
|
id: string;
|
|
@@ -17,15 +40,25 @@ export interface Study {
|
|
|
17
40
|
config: TradingIndicator;
|
|
18
41
|
/** Drawn over the price (else in its own pane) */
|
|
19
42
|
overlay: boolean;
|
|
20
|
-
/** Legend title (`"MACD 12 26 9"`) */
|
|
43
|
+
/** Legend title (`"MACD 12 26 9"`); the parameters when `titleKey` is set */
|
|
21
44
|
title: string;
|
|
45
|
+
/** Localized name before the parameters in the legend */
|
|
46
|
+
titleKey?: "ichimoku" | "supertrend";
|
|
22
47
|
outputs: StudyOutput[];
|
|
23
48
|
/** Fixed value range of the pane (RSI) */
|
|
24
49
|
range?: readonly [number, number];
|
|
25
50
|
/** Horizontal reference lines (RSI 30 / 70, KDJ 20 / 80, MACD 0) */
|
|
26
51
|
bands?: readonly number[];
|
|
27
|
-
/**
|
|
28
|
-
|
|
52
|
+
/** Shades the space between the first two bands (RSI, MFI, CCI...) */
|
|
53
|
+
bandFill?: boolean;
|
|
54
|
+
/** Areas filled between outputs (channels, Ichimoku cloud) */
|
|
55
|
+
fills: StudyFill[];
|
|
56
|
+
/** Legend values without their labels (channels: the colors say it) */
|
|
57
|
+
plainLegend?: boolean;
|
|
58
|
+
/** A single legend value: the first finite output (SuperTrend) */
|
|
59
|
+
mergeLegend?: boolean;
|
|
60
|
+
/** The pane keeps 0 in view (MACD, OBV) */
|
|
61
|
+
zero?: boolean;
|
|
29
62
|
/** Default height of its pane */
|
|
30
63
|
height: number;
|
|
31
64
|
/** Values formatted as volumes (compact) rather than prices */
|
|
@@ -41,12 +74,12 @@ export declare const indicatorKey: (indicator: TradingIndicator) => string;
|
|
|
41
74
|
* Builds the runtime of an indicator. `colorIndex` picks the default color
|
|
42
75
|
* of moving averages (one per average).
|
|
43
76
|
*/
|
|
44
|
-
export declare const createStudy: (config: TradingIndicator, id: string, colorIndex: number, utcOffset:
|
|
77
|
+
export declare const createStudy: (config: TradingIndicator, id: string, colorIndex: number, utcOffset: UtcOffset) => Study;
|
|
45
78
|
/**
|
|
46
79
|
* Builds the studies of `indicators`, reusing the previous runtime of an
|
|
47
80
|
* indicator whose config is unchanged (same id and same parameters)
|
|
48
81
|
*/
|
|
49
|
-
export declare const buildStudies: (indicators: readonly TradingIndicator[], previous: readonly Study[], utcOffset:
|
|
82
|
+
export declare const buildStudies: (indicators: readonly TradingIndicator[], previous: readonly Study[], utcOffset: UtcOffset) => {
|
|
50
83
|
studies: Study[];
|
|
51
84
|
reused: Set<Study>;
|
|
52
85
|
};
|
|
@@ -1,15 +1,38 @@
|
|
|
1
|
+
import { UtcOffset } from './format.js';
|
|
1
2
|
import { BarStore } from './store.js';
|
|
2
3
|
import { TradingIndicator } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* How an output is drawn: a line, a histogram around zero (colored by
|
|
6
|
+
* sign and slope), the volume bars, or dots (colored by their side of the
|
|
7
|
+
* close, like the parabolic SAR)
|
|
8
|
+
*/
|
|
9
|
+
export type StudyOutputKind = "line" | "histogram" | "volume" | "dots";
|
|
5
10
|
export interface StudyOutput {
|
|
6
11
|
/** Legend label (`"MA7"`, `"DIF"`) */
|
|
7
12
|
label: string;
|
|
8
13
|
values: Float64Array;
|
|
9
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* CSS color (may be a `var()`); `"up"` / `"down"` stand for the colors
|
|
16
|
+
* of rising / falling bars
|
|
17
|
+
*/
|
|
10
18
|
color: string;
|
|
11
19
|
kind: StudyOutputKind;
|
|
12
20
|
width: number;
|
|
21
|
+
/** Drawn this many bars later (Ichimoku spans ahead, lagging span back) */
|
|
22
|
+
shift: number;
|
|
23
|
+
/** Opacity of the line (1: opaque) */
|
|
24
|
+
alpha: number;
|
|
25
|
+
}
|
|
26
|
+
/** Area filled between two outputs */
|
|
27
|
+
export interface StudyFill {
|
|
28
|
+
/** Output indices */
|
|
29
|
+
a: number;
|
|
30
|
+
b: number;
|
|
31
|
+
/** Color while `a` is above `b` */
|
|
32
|
+
color: string;
|
|
33
|
+
/** Color while `a` is below `b` (the same color by default) */
|
|
34
|
+
colorBelow?: string;
|
|
35
|
+
opacity: number;
|
|
13
36
|
}
|
|
14
37
|
export interface Study {
|
|
15
38
|
id: string;
|
|
@@ -17,15 +40,25 @@ export interface Study {
|
|
|
17
40
|
config: TradingIndicator;
|
|
18
41
|
/** Drawn over the price (else in its own pane) */
|
|
19
42
|
overlay: boolean;
|
|
20
|
-
/** Legend title (`"MACD 12 26 9"`) */
|
|
43
|
+
/** Legend title (`"MACD 12 26 9"`); the parameters when `titleKey` is set */
|
|
21
44
|
title: string;
|
|
45
|
+
/** Localized name before the parameters in the legend */
|
|
46
|
+
titleKey?: "ichimoku" | "supertrend";
|
|
22
47
|
outputs: StudyOutput[];
|
|
23
48
|
/** Fixed value range of the pane (RSI) */
|
|
24
49
|
range?: readonly [number, number];
|
|
25
50
|
/** Horizontal reference lines (RSI 30 / 70, KDJ 20 / 80, MACD 0) */
|
|
26
51
|
bands?: readonly number[];
|
|
27
|
-
/**
|
|
28
|
-
|
|
52
|
+
/** Shades the space between the first two bands (RSI, MFI, CCI...) */
|
|
53
|
+
bandFill?: boolean;
|
|
54
|
+
/** Areas filled between outputs (channels, Ichimoku cloud) */
|
|
55
|
+
fills: StudyFill[];
|
|
56
|
+
/** Legend values without their labels (channels: the colors say it) */
|
|
57
|
+
plainLegend?: boolean;
|
|
58
|
+
/** A single legend value: the first finite output (SuperTrend) */
|
|
59
|
+
mergeLegend?: boolean;
|
|
60
|
+
/** The pane keeps 0 in view (MACD, OBV) */
|
|
61
|
+
zero?: boolean;
|
|
29
62
|
/** Default height of its pane */
|
|
30
63
|
height: number;
|
|
31
64
|
/** Values formatted as volumes (compact) rather than prices */
|
|
@@ -41,12 +74,12 @@ export declare const indicatorKey: (indicator: TradingIndicator) => string;
|
|
|
41
74
|
* Builds the runtime of an indicator. `colorIndex` picks the default color
|
|
42
75
|
* of moving averages (one per average).
|
|
43
76
|
*/
|
|
44
|
-
export declare const createStudy: (config: TradingIndicator, id: string, colorIndex: number, utcOffset:
|
|
77
|
+
export declare const createStudy: (config: TradingIndicator, id: string, colorIndex: number, utcOffset: UtcOffset) => Study;
|
|
45
78
|
/**
|
|
46
79
|
* Builds the studies of `indicators`, reusing the previous runtime of an
|
|
47
80
|
* indicator whose config is unchanged (same id and same parameters)
|
|
48
81
|
*/
|
|
49
|
-
export declare const buildStudies: (indicators: readonly TradingIndicator[], previous: readonly Study[], utcOffset:
|
|
82
|
+
export declare const buildStudies: (indicators: readonly TradingIndicator[], previous: readonly Study[], utcOffset: UtcOffset) => {
|
|
50
83
|
studies: Study[];
|
|
51
84
|
reused: Set<Study>;
|
|
52
85
|
};
|