@363045841yyt/klinechart-core 0.8.11-alpha.0 → 0.8.12
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/dist/alerts/createAlertController.d.ts +30 -0
- package/dist/alerts/createAlertController.d.ts.map +1 -0
- package/dist/alerts/createAlertController.js +261 -0
- package/dist/alerts/createAlertController.js.map +1 -0
- package/dist/alerts/index.d.ts +5 -0
- package/dist/alerts/index.d.ts.map +1 -0
- package/dist/alerts/index.js +4 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/predicates.d.ts +28 -0
- package/dist/alerts/predicates.d.ts.map +1 -0
- package/dist/alerts/predicates.js +211 -0
- package/dist/alerts/predicates.js.map +1 -0
- package/dist/alerts/rollingVolume.d.ts +15 -0
- package/dist/alerts/rollingVolume.d.ts.map +1 -0
- package/dist/alerts/rollingVolume.js +42 -0
- package/dist/alerts/rollingVolume.js.map +1 -0
- package/dist/alerts/ruleSchema.d.ts +42 -0
- package/dist/alerts/ruleSchema.d.ts.map +1 -0
- package/dist/alerts/ruleSchema.js +240 -0
- package/dist/alerts/ruleSchema.js.map +1 -0
- package/dist/alerts/types.d.ts +169 -0
- package/dist/alerts/types.d.ts.map +1 -0
- package/dist/alerts/types.js +24 -0
- package/dist/alerts/types.js.map +1 -0
- package/dist/chartTypes/heikinAshi.d.ts +49 -0
- package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
- package/dist/chartTypes/heikinAshi.js +94 -0
- package/dist/chartTypes/heikinAshi.js.map +1 -0
- package/dist/chartTypes/index.d.ts +6 -0
- package/dist/chartTypes/index.d.ts.map +1 -0
- package/dist/chartTypes/index.js +5 -0
- package/dist/chartTypes/index.js.map +1 -0
- package/dist/chartTypes/pointAndFigure.d.ts +83 -0
- package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
- package/dist/chartTypes/pointAndFigure.js +159 -0
- package/dist/chartTypes/pointAndFigure.js.map +1 -0
- package/dist/chartTypes/rangeBars.d.ts +61 -0
- package/dist/chartTypes/rangeBars.d.ts.map +1 -0
- package/dist/chartTypes/rangeBars.js +181 -0
- package/dist/chartTypes/rangeBars.js.map +1 -0
- package/dist/chartTypes/renko.d.ts +94 -0
- package/dist/chartTypes/renko.d.ts.map +1 -0
- package/dist/chartTypes/renko.js +207 -0
- package/dist/chartTypes/renko.js.map +1 -0
- package/dist/chartTypes/types.d.ts +97 -0
- package/dist/chartTypes/types.d.ts.map +1 -0
- package/dist/chartTypes/types.js +39 -0
- package/dist/chartTypes/types.js.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
- package/dist/components/anchoredVwap/index.d.ts +11 -0
- package/dist/components/anchoredVwap/index.d.ts.map +1 -0
- package/dist/components/anchoredVwap/index.js +10 -0
- package/dist/components/anchoredVwap/index.js.map +1 -0
- package/dist/components/anchoredVwap/types.d.ts +171 -0
- package/dist/components/anchoredVwap/types.d.ts.map +1 -0
- package/dist/components/anchoredVwap/types.js +25 -0
- package/dist/components/anchoredVwap/types.js.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
- package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
- package/dist/components/crosshairSync/index.d.ts +2 -0
- package/dist/components/crosshairSync/index.d.ts.map +1 -0
- package/dist/components/crosshairSync/index.js +2 -0
- package/dist/components/crosshairSync/index.js.map +1 -0
- package/dist/components/footprint/aggressor.d.ts +89 -0
- package/dist/components/footprint/aggressor.d.ts.map +1 -0
- package/dist/components/footprint/aggressor.js +106 -0
- package/dist/components/footprint/aggressor.js.map +1 -0
- package/dist/components/footprint/createFootprintController.d.ts +29 -0
- package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
- package/dist/components/footprint/createFootprintController.js +264 -0
- package/dist/components/footprint/createFootprintController.js.map +1 -0
- package/dist/components/footprint/index.d.ts +7 -0
- package/dist/components/footprint/index.d.ts.map +1 -0
- package/dist/components/footprint/index.js +4 -0
- package/dist/components/footprint/index.js.map +1 -0
- package/dist/components/footprint/perBarStats.d.ts +63 -0
- package/dist/components/footprint/perBarStats.d.ts.map +1 -0
- package/dist/components/footprint/perBarStats.js +123 -0
- package/dist/components/footprint/perBarStats.js.map +1 -0
- package/dist/components/footprint/types.d.ts +197 -0
- package/dist/components/footprint/types.d.ts.map +1 -0
- package/dist/components/footprint/types.js +23 -0
- package/dist/components/footprint/types.js.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.js +134 -0
- package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
- package/dist/components/mtfOverlay/index.d.ts +19 -0
- package/dist/components/mtfOverlay/index.d.ts.map +1 -0
- package/dist/components/mtfOverlay/index.js +18 -0
- package/dist/components/mtfOverlay/index.js.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.js +93 -0
- package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
- package/dist/components/mtfOverlay/types.d.ts +132 -0
- package/dist/components/mtfOverlay/types.d.ts.map +1 -0
- package/dist/components/mtfOverlay/types.js +22 -0
- package/dist/components/mtfOverlay/types.js.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
- package/dist/components/orderBookHeatmap/index.d.ts +13 -0
- package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/index.js +12 -0
- package/dist/components/orderBookHeatmap/index.js.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
- package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
- package/dist/components/orderBookHeatmap/types.d.ts +128 -0
- package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/types.js +16 -0
- package/dist/components/orderBookHeatmap/types.js.map +1 -0
- package/dist/components/volumeProfile/binning.d.ts +54 -0
- package/dist/components/volumeProfile/binning.d.ts.map +1 -0
- package/dist/components/volumeProfile/binning.js +123 -0
- package/dist/components/volumeProfile/binning.js.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
- package/dist/components/volumeProfile/index.d.ts +6 -0
- package/dist/components/volumeProfile/index.d.ts.map +1 -0
- package/dist/components/volumeProfile/index.js +5 -0
- package/dist/components/volumeProfile/index.js.map +1 -0
- package/dist/components/volumeProfile/poc.d.ts +35 -0
- package/dist/components/volumeProfile/poc.d.ts.map +1 -0
- package/dist/components/volumeProfile/poc.js +51 -0
- package/dist/components/volumeProfile/poc.js.map +1 -0
- package/dist/components/volumeProfile/types.d.ts +138 -0
- package/dist/components/volumeProfile/types.d.ts.map +1 -0
- package/dist/components/volumeProfile/types.js +19 -0
- package/dist/components/volumeProfile/types.js.map +1 -0
- package/dist/components/volumeProfile/valueArea.d.ts +58 -0
- package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
- package/dist/components/volumeProfile/valueArea.js +172 -0
- package/dist/components/volumeProfile/valueArea.js.map +1 -0
- package/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +22 -11
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +3 -1
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +2 -1
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.js +2 -1
- package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
- package/dist/data-fetchers/gotdx.js +4 -3
- package/dist/data-fetchers/gotdx.js.map +1 -1
- package/dist/data-fetchers/router.d.ts.map +1 -1
- package/dist/data-fetchers/router.js +4 -3
- package/dist/data-fetchers/router.js.map +1 -1
- package/dist/data-fetchers/tradingview.js +3 -2
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/engine/chart.d.ts +13 -0
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +109 -0
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/data/chartDataManager.d.ts +1 -0
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +27 -4
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
- package/dist/engine/drawing/toolConfig.js +2 -1
- package/dist/engine/drawing/toolConfig.js.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.js +2 -1
- package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.js +2 -1
- package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.js +6 -5
- package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
- package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
- package/dist/engine/indicators/registerBuiltins.js +2 -1
- package/dist/engine/indicators/registerBuiltins.js.map +1 -1
- package/dist/engine/indicators/scheduler.d.ts +6 -0
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +12 -0
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/indicators/soa.d.ts.map +1 -1
- package/dist/engine/indicators/soa.js +2 -1
- package/dist/engine/indicators/soa.js.map +1 -1
- package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
- package/dist/engine/indicators/stateComposer.js +2 -1
- package/dist/engine/indicators/stateComposer.js.map +1 -1
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +2 -1
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/engine/utils/chartZoomController.d.ts +2 -0
- package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
- package/dist/engine/utils/chartZoomController.js +5 -1
- package/dist/engine/utils/chartZoomController.js.map +1 -1
- package/dist/errors-help.d.ts +72 -0
- package/dist/errors-help.d.ts.map +1 -0
- package/dist/errors-help.js +149 -0
- package/dist/errors-help.js.map +1 -0
- package/dist/errors.d.ts +64 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/indicators/alma.d.ts +27 -0
- package/dist/indicators/alma.d.ts.map +1 -0
- package/dist/indicators/alma.js +36 -0
- package/dist/indicators/alma.js.map +1 -0
- package/dist/indicators/awesomeOscillator.d.ts +19 -0
- package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
- package/dist/indicators/awesomeOscillator.js +36 -0
- package/dist/indicators/awesomeOscillator.js.map +1 -0
- package/dist/indicators/dpo.d.ts +17 -0
- package/dist/indicators/dpo.d.ts.map +1 -0
- package/dist/indicators/dpo.js +24 -0
- package/dist/indicators/dpo.js.map +1 -0
- package/dist/indicators/fisherTransform.d.ts +26 -0
- package/dist/indicators/fisherTransform.d.ts.map +1 -0
- package/dist/indicators/fisherTransform.js +44 -0
- package/dist/indicators/fisherTransform.js.map +1 -0
- package/dist/indicators/frama.d.ts +25 -0
- package/dist/indicators/frama.d.ts.map +1 -0
- package/dist/indicators/frama.js +61 -0
- package/dist/indicators/frama.js.map +1 -0
- package/dist/indicators/index.d.ts +24 -0
- package/dist/indicators/index.d.ts.map +1 -0
- package/dist/indicators/index.js +26 -0
- package/dist/indicators/index.js.map +1 -0
- package/dist/indicators/lsma.d.ts +21 -0
- package/dist/indicators/lsma.d.ts.map +1 -0
- package/dist/indicators/lsma.js +37 -0
- package/dist/indicators/lsma.js.map +1 -0
- package/dist/indicators/schaffTrendCycle.d.ts +24 -0
- package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
- package/dist/indicators/schaffTrendCycle.js +70 -0
- package/dist/indicators/schaffTrendCycle.js.map +1 -0
- package/dist/indicators/stochRSI.d.ts +24 -0
- package/dist/indicators/stochRSI.d.ts.map +1 -0
- package/dist/indicators/stochRSI.js +86 -0
- package/dist/indicators/stochRSI.js.map +1 -0
- package/dist/indicators/t3.d.ts +31 -0
- package/dist/indicators/t3.d.ts.map +1 -0
- package/dist/indicators/t3.js +63 -0
- package/dist/indicators/t3.js.map +1 -0
- package/dist/indicators/ultimateOscillator.d.ts +26 -0
- package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
- package/dist/indicators/ultimateOscillator.js +59 -0
- package/dist/indicators/ultimateOscillator.js.map +1 -0
- package/dist/indicators/vidya.d.ts +24 -0
- package/dist/indicators/vidya.d.ts.map +1 -0
- package/dist/indicators/vidya.js +54 -0
- package/dist/indicators/vidya.js.map +1 -0
- package/dist/indicators/zlema.d.ts +16 -0
- package/dist/indicators/zlema.d.ts.map +1 -0
- package/dist/indicators/zlema.js +26 -0
- package/dist/indicators/zlema.js.map +1 -0
- package/dist/input/gesture.d.ts +125 -0
- package/dist/input/gesture.d.ts.map +1 -0
- package/dist/input/gesture.js +249 -0
- package/dist/input/gesture.js.map +1 -0
- package/dist/input/index.d.ts +9 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +9 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/keyboard.d.ts +140 -0
- package/dist/input/keyboard.d.ts.map +1 -0
- package/dist/input/keyboard.js +260 -0
- package/dist/input/keyboard.js.map +1 -0
- package/dist/mcp/chartBridge.d.ts +2 -2
- package/dist/mcp/chartBridge.d.ts.map +1 -1
- package/dist/mcp/chartBridge.js +27 -21
- package/dist/mcp/chartBridge.js.map +1 -1
- package/dist/plugin/PluginHost.d.ts +0 -3
- package/dist/plugin/PluginHost.d.ts.map +1 -1
- package/dist/plugin/PluginHost.js +7 -3
- package/dist/plugin/PluginHost.js.map +1 -1
- package/dist/plugin/PluginRegistry.d.ts +0 -3
- package/dist/plugin/PluginRegistry.d.ts.map +1 -1
- package/dist/plugin/PluginRegistry.js +5 -1
- package/dist/plugin/PluginRegistry.js.map +1 -1
- package/dist/render/Renderer.d.ts +116 -0
- package/dist/render/Renderer.d.ts.map +1 -0
- package/dist/render/Renderer.js +31 -0
- package/dist/render/Renderer.js.map +1 -0
- package/dist/render/SurfaceBackend.d.ts +83 -0
- package/dist/render/SurfaceBackend.d.ts.map +1 -0
- package/dist/render/SurfaceBackend.js +27 -0
- package/dist/render/SurfaceBackend.js.map +1 -0
- package/dist/render/index.d.ts +12 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
- package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
- package/dist/renderer-tier/detectRendererTier.js +143 -0
- package/dist/renderer-tier/detectRendererTier.js.map +1 -0
- package/dist/renderer-tier/index.d.ts +12 -0
- package/dist/renderer-tier/index.d.ts.map +1 -0
- package/dist/renderer-tier/index.js +12 -0
- package/dist/renderer-tier/index.js.map +1 -0
- package/dist/renderer-tier/selectBackend.d.ts +106 -0
- package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
- package/dist/renderer-tier/selectBackend.js +113 -0
- package/dist/renderer-tier/selectBackend.js.map +1 -0
- package/dist/renderer-tier/types.d.ts +50 -0
- package/dist/renderer-tier/types.d.ts.map +1 -0
- package/dist/renderer-tier/types.js +24 -0
- package/dist/renderer-tier/types.js.map +1 -0
- package/dist/replay/createReplayController.d.ts +3 -0
- package/dist/replay/createReplayController.d.ts.map +1 -0
- package/dist/replay/createReplayController.js +251 -0
- package/dist/replay/createReplayController.js.map +1 -0
- package/dist/replay/index.d.ts +5 -0
- package/dist/replay/index.d.ts.map +1 -0
- package/dist/replay/index.js +3 -0
- package/dist/replay/index.js.map +1 -0
- package/dist/replay/timeline.d.ts +50 -0
- package/dist/replay/timeline.d.ts.map +1 -0
- package/dist/replay/timeline.js +104 -0
- package/dist/replay/timeline.js.map +1 -0
- package/dist/replay/types.d.ts +94 -0
- package/dist/replay/types.d.ts.map +1 -0
- package/dist/replay/types.js +21 -0
- package/dist/replay/types.js.map +1 -0
- package/dist/scale/anchoredZoom.d.ts +64 -0
- package/dist/scale/anchoredZoom.d.ts.map +1 -0
- package/dist/scale/anchoredZoom.js +67 -0
- package/dist/scale/anchoredZoom.js.map +1 -0
- package/dist/scale/createPriceScale.d.ts +49 -0
- package/dist/scale/createPriceScale.d.ts.map +1 -0
- package/dist/scale/createPriceScale.js +175 -0
- package/dist/scale/createPriceScale.js.map +1 -0
- package/dist/scale/createTimeScale.d.ts +27 -0
- package/dist/scale/createTimeScale.d.ts.map +1 -0
- package/dist/scale/createTimeScale.js +139 -0
- package/dist/scale/createTimeScale.js.map +1 -0
- package/dist/scale/index.d.ts +6 -0
- package/dist/scale/index.d.ts.map +1 -0
- package/dist/scale/index.js +5 -0
- package/dist/scale/index.js.map +1 -0
- package/dist/scale/originShift.d.ts +69 -0
- package/dist/scale/originShift.d.ts.map +1 -0
- package/dist/scale/originShift.js +41 -0
- package/dist/scale/originShift.js.map +1 -0
- package/dist/scale/types.d.ts +90 -0
- package/dist/scale/types.d.ts.map +1 -0
- package/dist/scale/types.js +17 -0
- package/dist/scale/types.js.map +1 -0
- package/dist/scene/createScene.d.ts +22 -0
- package/dist/scene/createScene.d.ts.map +1 -0
- package/dist/scene/createScene.js +114 -0
- package/dist/scene/createScene.js.map +1 -0
- package/dist/scene/index.d.ts +13 -0
- package/dist/scene/index.d.ts.map +1 -0
- package/dist/scene/index.js +11 -0
- package/dist/scene/index.js.map +1 -0
- package/dist/scene/layerRegistry.d.ts +83 -0
- package/dist/scene/layerRegistry.d.ts.map +1 -0
- package/dist/scene/layerRegistry.js +43 -0
- package/dist/scene/layerRegistry.js.map +1 -0
- package/dist/scene/types.d.ts +128 -0
- package/dist/scene/types.d.ts.map +1 -0
- package/dist/scene/types.js +21 -0
- package/dist/scene/types.js.map +1 -0
- package/dist/scheduler/createFrameBudget.d.ts +91 -0
- package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
- package/dist/scheduler/createFrameBudget.js +232 -0
- package/dist/scheduler/createFrameBudget.js.map +1 -0
- package/dist/scheduler/index.d.ts +2 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/tokens/themeToCssVars.d.ts.map +1 -1
- package/dist/tokens/themeToCssVars.js +2 -28
- package/dist/tokens/themeToCssVars.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/__bench__/indicators.bench.ts +215 -0
- package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
- package/src/__bench__/scale.bench.ts +80 -0
- package/src/__bench__/signal.bench.ts +41 -0
- package/src/__bench__/volumeProfile.bench.ts +66 -0
- package/src/__tests__/errors-help.test.ts +184 -0
- package/src/__tests__/errors.test.ts +187 -0
- package/src/alerts/__tests__/controller.test.ts +231 -0
- package/src/alerts/__tests__/predicates.test.ts +374 -0
- package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
- package/src/alerts/createAlertController.ts +312 -0
- package/src/alerts/index.ts +18 -0
- package/src/alerts/predicates.ts +231 -0
- package/src/alerts/rollingVolume.ts +51 -0
- package/src/alerts/ruleSchema.ts +278 -0
- package/src/alerts/types.ts +177 -0
- package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
- package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
- package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
- package/src/chartTypes/__tests__/renko.test.ts +160 -0
- package/src/chartTypes/heikinAshi.ts +116 -0
- package/src/chartTypes/index.ts +5 -0
- package/src/chartTypes/pointAndFigure.ts +278 -0
- package/src/chartTypes/rangeBars.ts +303 -0
- package/src/chartTypes/renko.ts +311 -0
- package/src/chartTypes/types.ts +99 -0
- package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
- package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
- package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
- package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
- package/src/components/anchoredVwap/index.ts +17 -0
- package/src/components/anchoredVwap/types.ts +187 -0
- package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
- package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
- package/src/components/crosshairSync/index.ts +5 -0
- package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
- package/src/components/footprint/__tests__/controller.test.ts +130 -0
- package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
- package/src/components/footprint/aggressor.ts +165 -0
- package/src/components/footprint/createFootprintController.ts +338 -0
- package/src/components/footprint/index.ts +21 -0
- package/src/components/footprint/perBarStats.ts +137 -0
- package/src/components/footprint/types.ts +232 -0
- package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
- package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
- package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
- package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
- package/src/components/mtfOverlay/createMtfController.ts +180 -0
- package/src/components/mtfOverlay/index.ts +26 -0
- package/src/components/mtfOverlay/resampleBars.ts +134 -0
- package/src/components/mtfOverlay/types.ts +148 -0
- package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
- package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
- package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
- package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
- package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
- package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
- package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
- package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
- package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
- package/src/components/orderBookHeatmap/index.ts +25 -0
- package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
- package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
- package/src/components/orderBookHeatmap/types.ts +168 -0
- package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
- package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
- package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
- package/src/components/volumeProfile/binning.ts +133 -0
- package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
- package/src/components/volumeProfile/index.ts +12 -0
- package/src/components/volumeProfile/poc.ts +53 -0
- package/src/components/volumeProfile/types.ts +148 -0
- package/src/components/volumeProfile/valueArea.ts +187 -0
- package/src/controllers/createChartController.ts +23 -10
- package/src/controllers/types.ts +5 -1
- package/src/data-fetchers/baostock.ts +2 -1
- package/src/data-fetchers/dataBuffer.effects.ts +3 -1
- package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
- package/src/data-fetchers/gotdx.ts +4 -3
- package/src/data-fetchers/router.ts +6 -3
- package/src/data-fetchers/tradingview.ts +3 -2
- package/src/engine/chart.ts +126 -3
- package/src/engine/data/chartDataManager.ts +26 -4
- package/src/engine/drawing/toolConfig.ts +2 -1
- package/src/engine/indicators/chartIndicatorManager.ts +2 -1
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
- package/src/engine/indicators/indicatorMetadata.ts +2 -1
- package/src/engine/indicators/indicatorRegistry.ts +6 -5
- package/src/engine/indicators/registerBuiltins.ts +2 -1
- package/src/engine/indicators/scheduler.ts +15 -0
- package/src/engine/indicators/soa.ts +2 -1
- package/src/engine/indicators/stateComposer.ts +2 -1
- package/src/engine/subPaneManager.ts +2 -1
- package/src/engine/utils/chartZoomController.ts +7 -1
- package/src/errors-help.ts +218 -0
- package/src/errors.ts +128 -0
- package/src/index.ts +37 -0
- package/src/indicators/__tests__/maFamily.test.ts +159 -0
- package/src/indicators/__tests__/oscillators.test.ts +150 -0
- package/src/indicators/alma.ts +61 -0
- package/src/indicators/awesomeOscillator.ts +54 -0
- package/src/indicators/dpo.ts +37 -0
- package/src/indicators/fisherTransform.ts +63 -0
- package/src/indicators/frama.ts +87 -0
- package/src/indicators/index.ts +39 -0
- package/src/indicators/lsma.ts +58 -0
- package/src/indicators/schaffTrendCycle.ts +92 -0
- package/src/indicators/stochRSI.ts +108 -0
- package/src/indicators/t3.ts +96 -0
- package/src/indicators/ultimateOscillator.ts +83 -0
- package/src/indicators/vidya.ts +80 -0
- package/src/indicators/zlema.ts +41 -0
- package/src/input/__tests__/gesture.test.ts +271 -0
- package/src/input/__tests__/keyboard.test.ts +317 -0
- package/src/input/gesture.ts +357 -0
- package/src/input/index.ts +26 -0
- package/src/input/keyboard.ts +373 -0
- package/src/mcp/chartBridge.ts +98 -72
- package/src/plugin/PluginHost.ts +4 -3
- package/src/plugin/PluginRegistry.ts +2 -1
- package/src/render/Renderer.ts +127 -0
- package/src/render/SurfaceBackend.ts +94 -0
- package/src/render/__tests__/contract.test.ts +176 -0
- package/src/render/index.ts +27 -0
- package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
- package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
- package/src/renderer-tier/detectRendererTier.ts +168 -0
- package/src/renderer-tier/index.ts +30 -0
- package/src/renderer-tier/selectBackend.ts +201 -0
- package/src/renderer-tier/types.ts +59 -0
- package/src/replay/__tests__/controller.test.ts +309 -0
- package/src/replay/__tests__/timeline.test.ts +99 -0
- package/src/replay/createReplayController.ts +302 -0
- package/src/replay/index.ts +15 -0
- package/src/replay/timeline.ts +106 -0
- package/src/replay/types.ts +107 -0
- package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
- package/src/scale/__tests__/originShift.test.ts +97 -0
- package/src/scale/__tests__/priceScale.test.ts +219 -0
- package/src/scale/__tests__/timeScale.test.ts +119 -0
- package/src/scale/anchoredZoom.ts +104 -0
- package/src/scale/createPriceScale.ts +226 -0
- package/src/scale/createTimeScale.ts +150 -0
- package/src/scale/index.ts +9 -0
- package/src/scale/originShift.ts +111 -0
- package/src/scale/types.ts +100 -0
- package/src/scene/__tests__/layerRegistry.test.ts +207 -0
- package/src/scene/__tests__/scene.test.ts +411 -0
- package/src/scene/createScene.ts +117 -0
- package/src/scene/index.ts +29 -0
- package/src/scene/layerRegistry.ts +117 -0
- package/src/scene/types.ts +143 -0
- package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
- package/src/scheduler/createFrameBudget.ts +316 -0
- package/src/scheduler/index.ts +7 -0
- package/src/tokens/themeToCssVars.ts +3 -1
- package/src/version.ts +1 -1
- package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
- package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
- package/dist/data-fetchers/gotdx/gotdx.js +0 -7
- package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
- package/src/data-fetchers/gotdx/gotdx.ts +0 -6
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors';
|
|
2
|
+
/** Compute true range for a bar against the prior close. */
|
|
3
|
+
const trueRange = (bar, prevClose) => {
|
|
4
|
+
const hl = bar.high - bar.low;
|
|
5
|
+
if (prevClose === null)
|
|
6
|
+
return hl;
|
|
7
|
+
const hc = Math.abs(bar.high - prevClose);
|
|
8
|
+
const lc = Math.abs(bar.low - prevClose);
|
|
9
|
+
return Math.max(hl, hc, lc);
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Build a Renko transform.
|
|
13
|
+
*
|
|
14
|
+
* The transform supports both `transform(input, config)` and `appendBar(bar)`.
|
|
15
|
+
* The config passed to `transform` is also captured for subsequent
|
|
16
|
+
* `appendBar` calls — so the typical flow is:
|
|
17
|
+
*
|
|
18
|
+
* const r = createRenko()
|
|
19
|
+
* const history = r.transform(historicalBars, { brickSize: 10 })
|
|
20
|
+
* // ...later, as ticks arrive:
|
|
21
|
+
* const newBricks = r.appendBar(liveBar)
|
|
22
|
+
*/
|
|
23
|
+
export function createRenko() {
|
|
24
|
+
let state = {
|
|
25
|
+
lastBrickClose: null,
|
|
26
|
+
lastDirection: null,
|
|
27
|
+
nextIndex: 0,
|
|
28
|
+
trWindow: [],
|
|
29
|
+
prevClose: null,
|
|
30
|
+
lastBrickSize: null,
|
|
31
|
+
};
|
|
32
|
+
let activeConfig = { brickSize: 1 };
|
|
33
|
+
/**
|
|
34
|
+
* Return the current effective brick size given the active config and the
|
|
35
|
+
* current ATR window. Returns `null` when ATR mode is enabled but the
|
|
36
|
+
* window hasn't filled yet (no bricks can form until we have a brick
|
|
37
|
+
* size).
|
|
38
|
+
*/
|
|
39
|
+
const currentBrickSize = () => {
|
|
40
|
+
if (activeConfig.useATR) {
|
|
41
|
+
const period = activeConfig.useATR.period;
|
|
42
|
+
if (state.trWindow.length < period)
|
|
43
|
+
return null;
|
|
44
|
+
let sum = 0;
|
|
45
|
+
// Use only the most recent `period` entries — older history is
|
|
46
|
+
// not part of the rolling ATR (Wilder's smoothing is a separate
|
|
47
|
+
// discussion; we use the simple rolling mean which is the
|
|
48
|
+
// baseline TradingView ATR-Renko shows).
|
|
49
|
+
for (let i = state.trWindow.length - period; i < state.trWindow.length; i++) {
|
|
50
|
+
sum += state.trWindow[i] ?? 0;
|
|
51
|
+
}
|
|
52
|
+
return sum / period;
|
|
53
|
+
}
|
|
54
|
+
return activeConfig.brickSize ?? null;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Try to emit bricks from a single input bar. The bar's `close` is the
|
|
58
|
+
* trigger; we ignore intra-bar high/low for brick formation because Renko
|
|
59
|
+
* is canonically a *close-only* construction. (Using high/low works on
|
|
60
|
+
* tick data but creates phantom bricks on OHLC bars.)
|
|
61
|
+
*/
|
|
62
|
+
const emitBricksFromBar = (bar, sourceIndex) => {
|
|
63
|
+
const out = [];
|
|
64
|
+
const brickSize = currentBrickSize();
|
|
65
|
+
if (brickSize === null || brickSize <= 0)
|
|
66
|
+
return out;
|
|
67
|
+
// Initialise the "last brick close" lazily on the first bar — we
|
|
68
|
+
// anchor it to the bar's close so the first non-trivial move starts
|
|
69
|
+
// brick formation. (Anchoring to `open` would mean the very first bar
|
|
70
|
+
// could itself form a brick, which differs from the convention.)
|
|
71
|
+
if (state.lastBrickClose === null) {
|
|
72
|
+
state.lastBrickClose = bar.close;
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
const close = bar.close;
|
|
76
|
+
let firstBrickInThisBar = true;
|
|
77
|
+
// Keep stepping bricks until the close no longer satisfies the
|
|
78
|
+
// threshold. Each iteration emits one brick and advances state.
|
|
79
|
+
// Loop bound: at most ceil(|close - lastBrickClose| / brickSize) — a
|
|
80
|
+
// hard upper bound prevents pathological infinite loops if brickSize
|
|
81
|
+
// becomes zero mid-iteration.
|
|
82
|
+
let safety = 0;
|
|
83
|
+
while (safety++ < 1_000_000) {
|
|
84
|
+
const last = state.lastBrickClose;
|
|
85
|
+
if (last === null)
|
|
86
|
+
break;
|
|
87
|
+
const diff = close - last;
|
|
88
|
+
// Continuation needs 1×, reversal needs 2×. First-ever brick uses 1×.
|
|
89
|
+
let upThreshold;
|
|
90
|
+
let downThreshold;
|
|
91
|
+
if (state.lastDirection === 'up') {
|
|
92
|
+
upThreshold = brickSize;
|
|
93
|
+
downThreshold = -2 * brickSize;
|
|
94
|
+
}
|
|
95
|
+
else if (state.lastDirection === 'down') {
|
|
96
|
+
upThreshold = 2 * brickSize;
|
|
97
|
+
downThreshold = -brickSize;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
upThreshold = brickSize;
|
|
101
|
+
downThreshold = -brickSize;
|
|
102
|
+
}
|
|
103
|
+
if (diff >= upThreshold) {
|
|
104
|
+
const newClose = last + brickSize;
|
|
105
|
+
out.push({
|
|
106
|
+
timestamp: bar.timestamp,
|
|
107
|
+
open: last,
|
|
108
|
+
close: newClose,
|
|
109
|
+
high: newClose,
|
|
110
|
+
low: last,
|
|
111
|
+
volume: firstBrickInThisBar ? bar.volume : 0,
|
|
112
|
+
sourceBarIndexStart: sourceIndex,
|
|
113
|
+
sourceBarIndexEnd: sourceIndex,
|
|
114
|
+
meta: { direction: 'up', brickSize },
|
|
115
|
+
});
|
|
116
|
+
state.lastBrickClose = newClose;
|
|
117
|
+
state.lastDirection = 'up';
|
|
118
|
+
state.lastBrickSize = brickSize;
|
|
119
|
+
firstBrickInThisBar = false;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (diff <= downThreshold) {
|
|
123
|
+
const newClose = last - brickSize;
|
|
124
|
+
out.push({
|
|
125
|
+
timestamp: bar.timestamp,
|
|
126
|
+
open: last,
|
|
127
|
+
close: newClose,
|
|
128
|
+
high: last,
|
|
129
|
+
low: newClose,
|
|
130
|
+
volume: firstBrickInThisBar ? bar.volume : 0,
|
|
131
|
+
sourceBarIndexStart: sourceIndex,
|
|
132
|
+
sourceBarIndexEnd: sourceIndex,
|
|
133
|
+
meta: { direction: 'down', brickSize },
|
|
134
|
+
});
|
|
135
|
+
state.lastBrickClose = newClose;
|
|
136
|
+
state.lastDirection = 'down';
|
|
137
|
+
state.lastBrickSize = brickSize;
|
|
138
|
+
firstBrickInThisBar = false;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
};
|
|
145
|
+
const consumeBar = (bar) => {
|
|
146
|
+
const sourceIndex = state.nextIndex;
|
|
147
|
+
// Update TR window BEFORE checking brick formation so the first ATR
|
|
148
|
+
// window's worth of bars participate in brick sizing as soon as
|
|
149
|
+
// possible.
|
|
150
|
+
const tr = trueRange(bar, state.prevClose);
|
|
151
|
+
state.trWindow.push(tr);
|
|
152
|
+
// Cap the window growth to twice the period for memory bound;
|
|
153
|
+
// anything older is never read.
|
|
154
|
+
if (activeConfig.useATR) {
|
|
155
|
+
const period = activeConfig.useATR.period;
|
|
156
|
+
if (state.trWindow.length > period * 2) {
|
|
157
|
+
state.trWindow = state.trWindow.slice(state.trWindow.length - period);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (state.trWindow.length > 2048) {
|
|
161
|
+
// For non-ATR mode we don't need the window at all — clear it.
|
|
162
|
+
state.trWindow = [];
|
|
163
|
+
}
|
|
164
|
+
state.prevClose = bar.close;
|
|
165
|
+
const emitted = emitBricksFromBar(bar, sourceIndex);
|
|
166
|
+
state.nextIndex = sourceIndex + 1;
|
|
167
|
+
return emitted;
|
|
168
|
+
};
|
|
169
|
+
const resetState = () => {
|
|
170
|
+
state = {
|
|
171
|
+
lastBrickClose: null,
|
|
172
|
+
lastDirection: null,
|
|
173
|
+
nextIndex: 0,
|
|
174
|
+
trWindow: [],
|
|
175
|
+
prevClose: null,
|
|
176
|
+
lastBrickSize: null,
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
return {
|
|
180
|
+
typeId: 'renko',
|
|
181
|
+
transform(input, config) {
|
|
182
|
+
// Validate: at least one mode must be set with sane values.
|
|
183
|
+
if (!config.useATR && (config.brickSize === undefined || config.brickSize <= 0)) {
|
|
184
|
+
throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: config requires brickSize > 0 or useATR { period }');
|
|
185
|
+
}
|
|
186
|
+
if (config.useATR && config.useATR.period < 1) {
|
|
187
|
+
throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: useATR.period must be >= 1');
|
|
188
|
+
}
|
|
189
|
+
activeConfig = config;
|
|
190
|
+
resetState();
|
|
191
|
+
const out = [];
|
|
192
|
+
for (const bar of input) {
|
|
193
|
+
const fresh = consumeBar(bar);
|
|
194
|
+
for (const b of fresh)
|
|
195
|
+
out.push(b);
|
|
196
|
+
}
|
|
197
|
+
return out;
|
|
198
|
+
},
|
|
199
|
+
appendBar(bar) {
|
|
200
|
+
return consumeBar(bar);
|
|
201
|
+
},
|
|
202
|
+
reset() {
|
|
203
|
+
resetState();
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=renko.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renko.js","sourceRoot":"","sources":["../../src/chartTypes/renko.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chart-type transformers — public type contract.
|
|
3
|
+
*
|
|
4
|
+
* A "chart type" in TradingView (Heikin Ashi, Renko, P&F, Range Bars, etc.) is
|
|
5
|
+
* a **data transform**, not a different renderer. Every output is still
|
|
6
|
+
* OHLCV-shaped, so the same candle renderer paints all of them. This package
|
|
7
|
+
* is therefore deliberately headless: rendering belongs to the
|
|
8
|
+
* Renderer/Scene layer (see `docs/ROADMAP.md` §0).
|
|
9
|
+
*
|
|
10
|
+
* Why this matters for the WebGPU path: because the output is OHLCV, the
|
|
11
|
+
* existing instanced-quad K-line vertex pipeline (see `docs/ROADMAP.md` §2.3)
|
|
12
|
+
* draws Heikin Ashi / Renko / P&F / Range Bars at the same throughput as raw
|
|
13
|
+
* candles — no new render path, no new shader.
|
|
14
|
+
*
|
|
15
|
+
* ## Two transforms in one interface — batch vs incremental
|
|
16
|
+
*
|
|
17
|
+
* Every transform here supports two modes:
|
|
18
|
+
*
|
|
19
|
+
* - **Batch** (`transform`): pure function over an OHLCV slice. Re-derives the
|
|
20
|
+
* output from scratch. Use this for chart loads / history scrolls.
|
|
21
|
+
* - **Incremental** (`appendBar`): consume one live bar at a time, emit zero
|
|
22
|
+
* or more output bars, and update internal state. Use this for streaming
|
|
23
|
+
* quotes.
|
|
24
|
+
*
|
|
25
|
+
* Calling `appendBar` repeatedly over the same sequence must produce **bit-for-
|
|
26
|
+
* bit identical** output to a single `transform` over that sequence. The test
|
|
27
|
+
* suite enforces this with a randomised property test on a ≥30-bar input.
|
|
28
|
+
*
|
|
29
|
+
* ## A note on time semantics
|
|
30
|
+
*
|
|
31
|
+
* Renko, P&F and Range Bars all break the "one input bar = one output bar"
|
|
32
|
+
* assumption. We preserve provenance with `sourceBarIndexStart` /
|
|
33
|
+
* `sourceBarIndexEnd` so callers can map back to the source series for
|
|
34
|
+
* tooltips, x-axis labels, and event correlation. The `timestamp` on a
|
|
35
|
+
* derived bar is the timestamp of the source bar that **closed** it (i.e. the
|
|
36
|
+
* trigger).
|
|
37
|
+
*/
|
|
38
|
+
/** Standard OHLCV row. Timestamps are epoch milliseconds. */
|
|
39
|
+
export interface OHLCV {
|
|
40
|
+
timestamp: number;
|
|
41
|
+
open: number;
|
|
42
|
+
high: number;
|
|
43
|
+
low: number;
|
|
44
|
+
close: number;
|
|
45
|
+
volume: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* One output bar from a chart-type transform. Extends `OHLCV` so it can flow
|
|
49
|
+
* through the same scale / renderer pipeline as raw candles.
|
|
50
|
+
*
|
|
51
|
+
* `sourceBarIndexStart` / `sourceBarIndexEnd` mark which input rows were
|
|
52
|
+
* aggregated into this output row (inclusive). For 1:1 transforms (Heikin
|
|
53
|
+
* Ashi) they are equal. For aggregating transforms (Renko, P&F, Range Bars)
|
|
54
|
+
* they describe a range of source rows. For "fanning" transforms — one input
|
|
55
|
+
* bar that produces multiple output bars (large-gap Renko, oversized Range
|
|
56
|
+
* bar) — every fanned-out output row shares the same start/end index.
|
|
57
|
+
*/
|
|
58
|
+
export interface TransformedBar extends OHLCV {
|
|
59
|
+
/** Lowest source index folded into this output bar (inclusive). */
|
|
60
|
+
sourceBarIndexStart: number;
|
|
61
|
+
/** Highest source index folded into this output bar (inclusive). */
|
|
62
|
+
sourceBarIndexEnd: number;
|
|
63
|
+
/**
|
|
64
|
+
* Transform-specific metadata. Marked `Readonly` so consumers can rely on
|
|
65
|
+
* structural sharing — a transform must never mutate metadata after
|
|
66
|
+
* emitting it.
|
|
67
|
+
*/
|
|
68
|
+
meta?: Readonly<Record<string, unknown>>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Common shape for all chart-type transformers.
|
|
72
|
+
*
|
|
73
|
+
* `transform` is pure — it does NOT mutate `input` and (for stateful
|
|
74
|
+
* transforms) calling it resets internal state first so the result depends
|
|
75
|
+
* only on `input` + `config`.
|
|
76
|
+
*
|
|
77
|
+
* `appendBar` is incremental — it does mutate internal state. Calling
|
|
78
|
+
* `reset()` returns the transform to its initial state.
|
|
79
|
+
*
|
|
80
|
+
* `typeId` is a stable, human-readable identifier used by the scene/registry.
|
|
81
|
+
*/
|
|
82
|
+
export interface ChartTypeTransform<TConfig = unknown> {
|
|
83
|
+
readonly typeId: string;
|
|
84
|
+
transform(input: ReadonlyArray<OHLCV>, config: TConfig): ReadonlyArray<TransformedBar>;
|
|
85
|
+
/**
|
|
86
|
+
* Append one input bar and emit zero, one, or many output bars.
|
|
87
|
+
*
|
|
88
|
+
* Implementations that do not support incremental mode omit this method.
|
|
89
|
+
* For Heikin Ashi the output is always exactly one bar per call. For
|
|
90
|
+
* Renko / Range Bars / P&F the count can be 0..N depending on whether the
|
|
91
|
+
* new bar triggers brick/box formation.
|
|
92
|
+
*/
|
|
93
|
+
appendBar?(input: OHLCV): ReadonlyArray<TransformedBar>;
|
|
94
|
+
/** Drop internal state. Idempotent. Safe to call on stateless transforms. */
|
|
95
|
+
reset?(): void;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chartTypes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,KAAK;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAe,SAAQ,KAAK;IACzC,mEAAmE;IACnE,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB,CAAC,OAAO,GAAG,OAAO;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA;IACtF;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA;IACvD,6EAA6E;IAC7E,KAAK,CAAC,IAAI,IAAI,CAAA;CACjB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chart-type transformers — public type contract.
|
|
3
|
+
*
|
|
4
|
+
* A "chart type" in TradingView (Heikin Ashi, Renko, P&F, Range Bars, etc.) is
|
|
5
|
+
* a **data transform**, not a different renderer. Every output is still
|
|
6
|
+
* OHLCV-shaped, so the same candle renderer paints all of them. This package
|
|
7
|
+
* is therefore deliberately headless: rendering belongs to the
|
|
8
|
+
* Renderer/Scene layer (see `docs/ROADMAP.md` §0).
|
|
9
|
+
*
|
|
10
|
+
* Why this matters for the WebGPU path: because the output is OHLCV, the
|
|
11
|
+
* existing instanced-quad K-line vertex pipeline (see `docs/ROADMAP.md` §2.3)
|
|
12
|
+
* draws Heikin Ashi / Renko / P&F / Range Bars at the same throughput as raw
|
|
13
|
+
* candles — no new render path, no new shader.
|
|
14
|
+
*
|
|
15
|
+
* ## Two transforms in one interface — batch vs incremental
|
|
16
|
+
*
|
|
17
|
+
* Every transform here supports two modes:
|
|
18
|
+
*
|
|
19
|
+
* - **Batch** (`transform`): pure function over an OHLCV slice. Re-derives the
|
|
20
|
+
* output from scratch. Use this for chart loads / history scrolls.
|
|
21
|
+
* - **Incremental** (`appendBar`): consume one live bar at a time, emit zero
|
|
22
|
+
* or more output bars, and update internal state. Use this for streaming
|
|
23
|
+
* quotes.
|
|
24
|
+
*
|
|
25
|
+
* Calling `appendBar` repeatedly over the same sequence must produce **bit-for-
|
|
26
|
+
* bit identical** output to a single `transform` over that sequence. The test
|
|
27
|
+
* suite enforces this with a randomised property test on a ≥30-bar input.
|
|
28
|
+
*
|
|
29
|
+
* ## A note on time semantics
|
|
30
|
+
*
|
|
31
|
+
* Renko, P&F and Range Bars all break the "one input bar = one output bar"
|
|
32
|
+
* assumption. We preserve provenance with `sourceBarIndexStart` /
|
|
33
|
+
* `sourceBarIndexEnd` so callers can map back to the source series for
|
|
34
|
+
* tooltips, x-axis labels, and event correlation. The `timestamp` on a
|
|
35
|
+
* derived bar is the timestamp of the source bar that **closed** it (i.e. the
|
|
36
|
+
* trigger).
|
|
37
|
+
*/
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chartTypes/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure math: anchored VWAP + volume-weighted standard-deviation bands.
|
|
3
|
+
*
|
|
4
|
+
* Used by `createAnchoredVwapController` for the from-scratch path
|
|
5
|
+
* (`setBars`, `addAnchor`, `updateAnchor` when `barIndex` changes). The
|
|
6
|
+
* controller's incremental `appendBar` reuses the same formulas via
|
|
7
|
+
* running sums; the controller's tests pin equivalence between the two
|
|
8
|
+
* paths.
|
|
9
|
+
*
|
|
10
|
+
* Math summary (formal derivation in `docs/ROADMAP.md` §3):
|
|
11
|
+
*
|
|
12
|
+
* typicalPrice(j) = (H[j] + L[j] + C[j]) / 3
|
|
13
|
+
* vwp(j) = typicalPrice(j) * V[j]
|
|
14
|
+
* sumVwp(i) = Σ_{j=a..i} vwp(j)
|
|
15
|
+
* sumVol(i) = Σ_{j=a..i} V[j]
|
|
16
|
+
* AVWAP(i) = sumVwp(i) / sumVol(i) (when sumVol > 0)
|
|
17
|
+
*
|
|
18
|
+
* ─── important subtlety ─────────────────────────────────────────────────
|
|
19
|
+
* The standard-deviation bands MUST use the **prevailing** AVWAP(j) at
|
|
20
|
+
* each bar j ∈ [a..i], NOT the final AVWAP(i). Naive implementations that
|
|
21
|
+
* reuse the final mean understate the deviation early in the anchor and
|
|
22
|
+
* overstate it late — the bands wind up visibly off-centre on long
|
|
23
|
+
* anchors. The dedicated test
|
|
24
|
+
* `computeAnchoredVwap.test.ts → "bands use prevailing AVWAP at j"` pins
|
|
25
|
+
* this and would catch a regression to the wrong formula.
|
|
26
|
+
*
|
|
27
|
+
* sqDev(j) = (typicalPrice(j) - AVWAP(j))^2 * V[j]
|
|
28
|
+
* sumSqDev(i) = Σ_{j=a..i} sqDev(j)
|
|
29
|
+
* variance(i) = sumSqDev(i) / sumVol(i)
|
|
30
|
+
* stdDev(i) = sqrt(variance(i))
|
|
31
|
+
* upper1(i) = AVWAP(i) + stdDev(i)
|
|
32
|
+
* lower1(i) = AVWAP(i) - stdDev(i)
|
|
33
|
+
* upper2(i) = AVWAP(i) + 2 * stdDev(i)
|
|
34
|
+
* lower2(i) = AVWAP(i) - 2 * stdDev(i)
|
|
35
|
+
*
|
|
36
|
+
* Zero-volume handling:
|
|
37
|
+
* - A bar with `volume === 0` contributes 0 to numerator, 0 to
|
|
38
|
+
* denominator, and 0 to the squared-deviation sum. The cumulative
|
|
39
|
+
* volume is unchanged.
|
|
40
|
+
* - If the cumulative volume is still > 0 at this bar (i.e. there was a
|
|
41
|
+
* prior non-zero bar) the AVWAP and bands **carry forward** the prior
|
|
42
|
+
* values — they are still mathematically well-defined.
|
|
43
|
+
* - If the cumulative volume is 0 (i.e. the anchor bar itself has
|
|
44
|
+
* volume 0 and every subsequent bar so far has volume 0 too), the
|
|
45
|
+
* point's `vwap` and band fields are `NaN`. The series still has an
|
|
46
|
+
* entry for the bar — `barIndex` and `cumulativeVolume` are filled in.
|
|
47
|
+
*/
|
|
48
|
+
import type { AVWAPBar, AVWAPPoint } from './types';
|
|
49
|
+
/**
|
|
50
|
+
* Compute the Anchored VWAP series for `bars`, anchored at
|
|
51
|
+
* `anchorIndex` (inclusive). Returns one `AVWAPPoint` per bar from
|
|
52
|
+
* `bars[anchorIndex]` through `bars[bars.length - 1]`.
|
|
53
|
+
*
|
|
54
|
+
* @param bars the bar series; the anchor must lie inside it
|
|
55
|
+
* @param anchorIndex 0-based index of the anchor bar (must satisfy
|
|
56
|
+
* `0 <= anchorIndex < bars.length`)
|
|
57
|
+
* @param includeBands when `false`, the four band fields equal `vwap` and
|
|
58
|
+
* the (cheaper) one-pass cumulative-volume math is
|
|
59
|
+
* used. The second pass that drives the bands is
|
|
60
|
+
* skipped entirely.
|
|
61
|
+
*
|
|
62
|
+
* @throws RangeError when `anchorIndex` is out of range and `bars` is
|
|
63
|
+
* non-empty. An empty `bars` array returns `[]` even
|
|
64
|
+
* if `anchorIndex` would otherwise be invalid — this
|
|
65
|
+
* mirrors the "no data, no work" convention used by
|
|
66
|
+
* the volume-profile controller.
|
|
67
|
+
*
|
|
68
|
+
* @internal — building block used by the corresponding controller
|
|
69
|
+
* factory. Reachable today via the top-level `@klinechart-quant/core`
|
|
70
|
+
* barrel but **NOT part of the supported public API**. typedoc / api-
|
|
71
|
+
* extractor hide it from generated docs. Prefer the controller
|
|
72
|
+
* factory (e.g. `createVolumeProfileController`) for stable user code.
|
|
73
|
+
* Closes API audit BLOCKER-002 (export * leakage taxonomy).
|
|
74
|
+
*/
|
|
75
|
+
export declare function computeAnchoredVwap(bars: ReadonlyArray<AVWAPBar>, anchorIndex: number, includeBands: boolean): ReadonlyArray<AVWAPPoint>;
|
|
76
|
+
//# sourceMappingURL=computeAnchoredVwap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeAnchoredVwap.d.ts","sourceRoot":"","sources":["../../../src/components/anchoredVwap/computeAnchoredVwap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGnD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,GACtB,aAAa,CAAC,UAAU,CAAC,CA4F3B"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure math: anchored VWAP + volume-weighted standard-deviation bands.
|
|
3
|
+
*
|
|
4
|
+
* Used by `createAnchoredVwapController` for the from-scratch path
|
|
5
|
+
* (`setBars`, `addAnchor`, `updateAnchor` when `barIndex` changes). The
|
|
6
|
+
* controller's incremental `appendBar` reuses the same formulas via
|
|
7
|
+
* running sums; the controller's tests pin equivalence between the two
|
|
8
|
+
* paths.
|
|
9
|
+
*
|
|
10
|
+
* Math summary (formal derivation in `docs/ROADMAP.md` §3):
|
|
11
|
+
*
|
|
12
|
+
* typicalPrice(j) = (H[j] + L[j] + C[j]) / 3
|
|
13
|
+
* vwp(j) = typicalPrice(j) * V[j]
|
|
14
|
+
* sumVwp(i) = Σ_{j=a..i} vwp(j)
|
|
15
|
+
* sumVol(i) = Σ_{j=a..i} V[j]
|
|
16
|
+
* AVWAP(i) = sumVwp(i) / sumVol(i) (when sumVol > 0)
|
|
17
|
+
*
|
|
18
|
+
* ─── important subtlety ─────────────────────────────────────────────────
|
|
19
|
+
* The standard-deviation bands MUST use the **prevailing** AVWAP(j) at
|
|
20
|
+
* each bar j ∈ [a..i], NOT the final AVWAP(i). Naive implementations that
|
|
21
|
+
* reuse the final mean understate the deviation early in the anchor and
|
|
22
|
+
* overstate it late — the bands wind up visibly off-centre on long
|
|
23
|
+
* anchors. The dedicated test
|
|
24
|
+
* `computeAnchoredVwap.test.ts → "bands use prevailing AVWAP at j"` pins
|
|
25
|
+
* this and would catch a regression to the wrong formula.
|
|
26
|
+
*
|
|
27
|
+
* sqDev(j) = (typicalPrice(j) - AVWAP(j))^2 * V[j]
|
|
28
|
+
* sumSqDev(i) = Σ_{j=a..i} sqDev(j)
|
|
29
|
+
* variance(i) = sumSqDev(i) / sumVol(i)
|
|
30
|
+
* stdDev(i) = sqrt(variance(i))
|
|
31
|
+
* upper1(i) = AVWAP(i) + stdDev(i)
|
|
32
|
+
* lower1(i) = AVWAP(i) - stdDev(i)
|
|
33
|
+
* upper2(i) = AVWAP(i) + 2 * stdDev(i)
|
|
34
|
+
* lower2(i) = AVWAP(i) - 2 * stdDev(i)
|
|
35
|
+
*
|
|
36
|
+
* Zero-volume handling:
|
|
37
|
+
* - A bar with `volume === 0` contributes 0 to numerator, 0 to
|
|
38
|
+
* denominator, and 0 to the squared-deviation sum. The cumulative
|
|
39
|
+
* volume is unchanged.
|
|
40
|
+
* - If the cumulative volume is still > 0 at this bar (i.e. there was a
|
|
41
|
+
* prior non-zero bar) the AVWAP and bands **carry forward** the prior
|
|
42
|
+
* values — they are still mathematically well-defined.
|
|
43
|
+
* - If the cumulative volume is 0 (i.e. the anchor bar itself has
|
|
44
|
+
* volume 0 and every subsequent bar so far has volume 0 too), the
|
|
45
|
+
* point's `vwap` and band fields are `NaN`. The series still has an
|
|
46
|
+
* entry for the bar — `barIndex` and `cumulativeVolume` are filled in.
|
|
47
|
+
*/
|
|
48
|
+
import { KLineChartError } from '../../errors';
|
|
49
|
+
/**
|
|
50
|
+
* Compute the Anchored VWAP series for `bars`, anchored at
|
|
51
|
+
* `anchorIndex` (inclusive). Returns one `AVWAPPoint` per bar from
|
|
52
|
+
* `bars[anchorIndex]` through `bars[bars.length - 1]`.
|
|
53
|
+
*
|
|
54
|
+
* @param bars the bar series; the anchor must lie inside it
|
|
55
|
+
* @param anchorIndex 0-based index of the anchor bar (must satisfy
|
|
56
|
+
* `0 <= anchorIndex < bars.length`)
|
|
57
|
+
* @param includeBands when `false`, the four band fields equal `vwap` and
|
|
58
|
+
* the (cheaper) one-pass cumulative-volume math is
|
|
59
|
+
* used. The second pass that drives the bands is
|
|
60
|
+
* skipped entirely.
|
|
61
|
+
*
|
|
62
|
+
* @throws RangeError when `anchorIndex` is out of range and `bars` is
|
|
63
|
+
* non-empty. An empty `bars` array returns `[]` even
|
|
64
|
+
* if `anchorIndex` would otherwise be invalid — this
|
|
65
|
+
* mirrors the "no data, no work" convention used by
|
|
66
|
+
* the volume-profile controller.
|
|
67
|
+
*
|
|
68
|
+
* @internal — building block used by the corresponding controller
|
|
69
|
+
* factory. Reachable today via the top-level `@klinechart-quant/core`
|
|
70
|
+
* barrel but **NOT part of the supported public API**. typedoc / api-
|
|
71
|
+
* extractor hide it from generated docs. Prefer the controller
|
|
72
|
+
* factory (e.g. `createVolumeProfileController`) for stable user code.
|
|
73
|
+
* Closes API audit BLOCKER-002 (export * leakage taxonomy).
|
|
74
|
+
*/
|
|
75
|
+
export function computeAnchoredVwap(bars, anchorIndex, includeBands) {
|
|
76
|
+
if (bars.length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
if (anchorIndex < 0 || anchorIndex >= bars.length) {
|
|
79
|
+
throw new KLineChartError('AVWAP_ANCHOR_OUT_OF_RANGE', `anchoredVwap: anchorIndex ${anchorIndex} is out of range ` +
|
|
80
|
+
`for bars of length ${bars.length}`);
|
|
81
|
+
}
|
|
82
|
+
const out = [];
|
|
83
|
+
// Running sums, advanced bar-by-bar.
|
|
84
|
+
let sumVwp = 0;
|
|
85
|
+
let sumVol = 0;
|
|
86
|
+
let sumSqDev = 0;
|
|
87
|
+
// `prevVwap` carries forward when a bar has zero volume but the
|
|
88
|
+
// cumulative volume so far is > 0. Initial value `NaN` flags the
|
|
89
|
+
// "anchor bar volume 0" case (see the docstring).
|
|
90
|
+
let prevVwap = Number.NaN;
|
|
91
|
+
for (let i = anchorIndex; i < bars.length; i++) {
|
|
92
|
+
const bar = bars[i];
|
|
93
|
+
// Guard against sparse arrays / undefined entries. `Float64Array`
|
|
94
|
+
// would never have this hole, but plain arrays might.
|
|
95
|
+
if (bar === undefined)
|
|
96
|
+
continue;
|
|
97
|
+
const tp = (bar.high + bar.low + bar.close) / 3;
|
|
98
|
+
const v = bar.volume;
|
|
99
|
+
// First update cumulative volume + vwp. A v === 0 bar is a no-op
|
|
100
|
+
// here and the running totals stay where they were.
|
|
101
|
+
if (v > 0) {
|
|
102
|
+
sumVwp += tp * v;
|
|
103
|
+
sumVol += v;
|
|
104
|
+
}
|
|
105
|
+
let vwap;
|
|
106
|
+
if (sumVol > 0) {
|
|
107
|
+
vwap = sumVwp / sumVol;
|
|
108
|
+
prevVwap = vwap;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// No volume ever ingested — emit NaN. This only happens when
|
|
112
|
+
// the anchor bar and every bar since it has v === 0.
|
|
113
|
+
vwap = Number.NaN;
|
|
114
|
+
}
|
|
115
|
+
// Bands: the *prevailing* AVWAP at bar j is the mean used to weigh
|
|
116
|
+
// sqDev. That's exactly the `vwap` we just computed. Important:
|
|
117
|
+
// if v === 0 the squared-deviation contribution is also 0, so we
|
|
118
|
+
// can skip the term entirely (which also avoids touching `tp`
|
|
119
|
+
// when `vwap` is NaN).
|
|
120
|
+
if (includeBands && v > 0 && Number.isFinite(vwap)) {
|
|
121
|
+
const diff = tp - vwap;
|
|
122
|
+
sumSqDev += diff * diff * v;
|
|
123
|
+
}
|
|
124
|
+
let upper1 = vwap;
|
|
125
|
+
let lower1 = vwap;
|
|
126
|
+
let upper2 = vwap;
|
|
127
|
+
let lower2 = vwap;
|
|
128
|
+
if (includeBands && sumVol > 0 && Number.isFinite(vwap)) {
|
|
129
|
+
const variance = sumSqDev / sumVol;
|
|
130
|
+
// Numerical safety: variance can be a tiny negative on
|
|
131
|
+
// catastrophic cancellation. Treat as 0.
|
|
132
|
+
const stdDev = Math.sqrt(variance > 0 ? variance : 0);
|
|
133
|
+
upper1 = vwap + stdDev;
|
|
134
|
+
lower1 = vwap - stdDev;
|
|
135
|
+
upper2 = vwap + 2 * stdDev;
|
|
136
|
+
lower2 = vwap - 2 * stdDev;
|
|
137
|
+
}
|
|
138
|
+
out.push({
|
|
139
|
+
barIndex: i,
|
|
140
|
+
vwap,
|
|
141
|
+
upper1,
|
|
142
|
+
lower1,
|
|
143
|
+
upper2,
|
|
144
|
+
lower2,
|
|
145
|
+
cumulativeVolume: sumVol,
|
|
146
|
+
});
|
|
147
|
+
// `prevVwap` is kept up to date for documentation/clarity even
|
|
148
|
+
// though we don't currently read it (the `sumVol > 0` branch above
|
|
149
|
+
// assigns directly). Left in place to make the carry-forward
|
|
150
|
+
// semantics explicit to future readers.
|
|
151
|
+
void prevVwap;
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=computeAnchoredVwap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeAnchoredVwap.js","sourceRoot":"","sources":["../../../src/components/anchoredVwap/computeAnchoredVwap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,mBAAmB,CAC/B,IAA6B,EAC7B,WAAmB,EACnB,YAAqB;IAErB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEhC,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,IAAI,eAAe,CACrB,2BAA2B,EAC3B,6BAA6B,WAAW,mBAAmB;YACvD,sBAAsB,IAAI,CAAC,MAAM,EAAE,CAC1C,CAAA;IACL,CAAC;IAED,MAAM,GAAG,GAAiB,EAAE,CAAA;IAE5B,qCAAqC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,gEAAgE;IAChE,iEAAiE;IACjE,kDAAkD;IAClD,IAAI,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;IAEzB,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,kEAAkE;QAClE,sDAAsD;QACtD,IAAI,GAAG,KAAK,SAAS;YAAE,SAAQ;QAE/B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;QAEpB,iEAAiE;QACjE,oDAAoD;QACpD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACR,MAAM,IAAI,EAAE,GAAG,CAAC,CAAA;YAChB,MAAM,IAAI,CAAC,CAAA;QACf,CAAC;QAED,IAAI,IAAY,CAAA;QAChB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;YACtB,QAAQ,GAAG,IAAI,CAAA;QACnB,CAAC;aAAM,CAAC;YACJ,6DAA6D;YAC7D,qDAAqD;YACrD,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA;QACrB,CAAC;QAED,mEAAmE;QACnE,gEAAgE;QAChE,iEAAiE;QACjE,8DAA8D;QAC9D,uBAAuB;QACvB,IAAI,YAAY,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,CAAA;YACtB,QAAQ,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,CAAA;QAC/B,CAAC;QAED,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,YAAY,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;YAClC,uDAAuD;YACvD,yCAAyC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACrD,MAAM,GAAG,IAAI,GAAG,MAAM,CAAA;YACtB,MAAM,GAAG,IAAI,GAAG,MAAM,CAAA;YACtB,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAA;YAC1B,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAA;QAC9B,CAAC;QAED,GAAG,CAAC,IAAI,CAAC;YACL,QAAQ,EAAE,CAAC;YACX,IAAI;YACJ,MAAM;YACN,MAAM;YACN,MAAM;YACN,MAAM;YACN,gBAAgB,EAAE,MAAM;SAC3B,CAAC,CAAA;QAEF,+DAA+D;QAC/D,mEAAmE;QACnE,6DAA6D;QAC7D,wCAAwC;QACxC,KAAK,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO,GAAG,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anchored VWAP controller — framework-agnostic, signal-based, multi-anchor.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the dispose-guard pattern from
|
|
5
|
+
* `createIndicatorSelectorController` and `createVolumeProfileController` so
|
|
6
|
+
* React/Vue/Angular adapters bridge identically. The controller is pure
|
|
7
|
+
* data — no DOM, no rendering, no canvas.
|
|
8
|
+
*
|
|
9
|
+
* Why multi-anchor with per-anchor running sums:
|
|
10
|
+
* TradingView's lower tiers cap the number of simultaneous anchors at
|
|
11
|
+
* 3 because each AVWAP is recomputed from scratch on every new bar. By
|
|
12
|
+
* keeping per-anchor `sumVwp` / `sumVol` / `sumSqDev` totals we drop
|
|
13
|
+
* `appendBar` from O(bars-since-anchor) to O(1) per anchor — anchors
|
|
14
|
+
* become cheap enough to keep many open at once.
|
|
15
|
+
*
|
|
16
|
+
* Equivalence guarantee:
|
|
17
|
+
* The point produced by `appendBar` is bit-for-bit identical (to
|
|
18
|
+
* floating-point precision) to the point that `computeAnchoredVwap`
|
|
19
|
+
* would produce on the same bar at the same anchor — same operands
|
|
20
|
+
* added in the same order. The controller test
|
|
21
|
+
* `appendBar incrementally matches full recompute` pins this.
|
|
22
|
+
*/
|
|
23
|
+
import type { AnchoredVwapController, AVWAPBar } from './types';
|
|
24
|
+
export interface AnchoredVwapControllerInit {
|
|
25
|
+
initialBars?: ReadonlyArray<AVWAPBar>;
|
|
26
|
+
}
|
|
27
|
+
export declare function createAnchoredVwapController(opts?: AnchoredVwapControllerInit): AnchoredVwapController;
|
|
28
|
+
//# sourceMappingURL=createAnchoredVwapController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAnchoredVwapController.d.ts","sourceRoot":"","sources":["../../../src/components/anchoredVwap/createAnchoredVwapController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAGR,sBAAsB,EACtB,QAAQ,EAEX,MAAM,SAAS,CAAA;AAuBhB,MAAM,WAAW,0BAA0B;IACvC,WAAW,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CACxC;AAED,wBAAgB,4BAA4B,CACxC,IAAI,CAAC,EAAE,0BAA0B,GAClC,sBAAsB,CAySxB"}
|