@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,311 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors'
|
|
2
|
+
/**
|
|
3
|
+
* Renko bricks — price-based bars that ignore time.
|
|
4
|
+
*
|
|
5
|
+
* A Renko chart drops a fixed-size "brick" every time price advances by one
|
|
6
|
+
* brick-size from the previous brick's close. Time is collapsed: a quiet hour
|
|
7
|
+
* may produce zero bricks, a volatile minute may produce ten.
|
|
8
|
+
*
|
|
9
|
+
* ## Modes
|
|
10
|
+
*
|
|
11
|
+
* - **Fixed brick size** (`{ brickSize }`): the classic chart. Brick height
|
|
12
|
+
* is constant across the entire series.
|
|
13
|
+
* - **ATR-adaptive brick size** (`{ useATR: { period } }`): brick size is the
|
|
14
|
+
* rolling ATR(period) over the *input* OHLCV series. We compute the full
|
|
15
|
+
* ATR series upfront and then use, for each candidate brick, the **trailing
|
|
16
|
+
* ATR at the source bar that triggered it**. This means brick height varies
|
|
17
|
+
* along the chart — wider in volatile regimes, tighter in quiet ones —
|
|
18
|
+
* which is the whole point of ATR mode.
|
|
19
|
+
*
|
|
20
|
+
* Trade-off (documented because it's a real one): ATR bricks are NOT
|
|
21
|
+
* uniform-height, so the chart loses the "every step is the same size"
|
|
22
|
+
* visual property that classical Renko has. In return, the brick rhythm
|
|
23
|
+
* adapts to volatility — a feature TradingView only offers in a separate
|
|
24
|
+
* chart-type ("ATR Renko") and which requires the user to reload the
|
|
25
|
+
* series to change. Our implementation supports flipping `useATR` on a
|
|
26
|
+
* live transform incrementally — see §"Enhancements over TradingView".
|
|
27
|
+
*
|
|
28
|
+
* ## Classic reversal rule (the 2× brick-size requirement)
|
|
29
|
+
*
|
|
30
|
+
* Once a column of up-bricks has been emitted, a single brick-size reverse
|
|
31
|
+
* move is NOT enough to start a down-column — it must travel **2 × brickSize**
|
|
32
|
+
* in the opposite direction from the last brick's close. This is the
|
|
33
|
+
* "classic" Nison/Steve Nison rule. Without the 2× requirement the chart
|
|
34
|
+
* "flutters" — every wiggle near the brick-size threshold flips direction.
|
|
35
|
+
*
|
|
36
|
+
* In code:
|
|
37
|
+
* - Continuation (same direction as last brick): need ≥ 1 × brickSize.
|
|
38
|
+
* - Reversal (opposite direction): need ≥ 2 × brickSize.
|
|
39
|
+
*
|
|
40
|
+
* The very first brick has no "previous direction", so it uses the 1× rule.
|
|
41
|
+
*
|
|
42
|
+
* ## Brick shape
|
|
43
|
+
*
|
|
44
|
+
* Each brick is OHLCV-shaped to fit the candle renderer:
|
|
45
|
+
*
|
|
46
|
+
* up-brick: open = lastBrickClose
|
|
47
|
+
* close = lastBrickClose + brickSize
|
|
48
|
+
* high = close, low = open
|
|
49
|
+
*
|
|
50
|
+
* down-brick: open = lastBrickClose
|
|
51
|
+
* close = lastBrickClose - brickSize
|
|
52
|
+
* high = open, low = close
|
|
53
|
+
*
|
|
54
|
+
* `volume` is the sum of input-bar volumes assigned to this brick. We use a
|
|
55
|
+
* simple rule: each input bar contributes all of its volume to **the first
|
|
56
|
+
* brick** it triggers in that bar. When one bar triggers N bricks (a gap),
|
|
57
|
+
* the bar's full volume goes on the first brick and the rest carry zero. This
|
|
58
|
+
* matches TradingView; the alternative (split evenly) creates phantom volume
|
|
59
|
+
* spikes when ATR mode changes brick sizes between bricks.
|
|
60
|
+
*
|
|
61
|
+
* ## Meta
|
|
62
|
+
*
|
|
63
|
+
* `meta.direction` is `'up'` or `'down'` for downstream colour selection.
|
|
64
|
+
* `meta.brickSize` is the brick height at the time of emission (especially
|
|
65
|
+
* meaningful in ATR mode).
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
import type { ChartTypeTransform, OHLCV, TransformedBar } from './types'
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Renko configuration.
|
|
72
|
+
*
|
|
73
|
+
* Exactly one of `brickSize` or `useATR` must be supplied. If both are present
|
|
74
|
+
* `useATR` wins (so callers can store both and toggle a flag).
|
|
75
|
+
*/
|
|
76
|
+
export interface RenkoConfig {
|
|
77
|
+
/** Fixed brick height in price units. Must be > 0. */
|
|
78
|
+
brickSize?: number
|
|
79
|
+
/** ATR-adaptive mode. `period` is the ATR lookback. */
|
|
80
|
+
useATR?: { period: number }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface RenkoState {
|
|
84
|
+
/** Close of the most recently emitted brick. `null` until the first brick. */
|
|
85
|
+
lastBrickClose: number | null
|
|
86
|
+
/** Direction of the most recently emitted brick. `null` for the first brick. */
|
|
87
|
+
lastDirection: 'up' | 'down' | null
|
|
88
|
+
/** Count of input bars consumed so far (= next source index). */
|
|
89
|
+
nextIndex: number
|
|
90
|
+
/** For ATR mode — the rolling TR window (last `period` true ranges). */
|
|
91
|
+
trWindow: number[]
|
|
92
|
+
/** For ATR mode — previous close, needed to compute TR. */
|
|
93
|
+
prevClose: number | null
|
|
94
|
+
/** Effective brick size at the most recent emission (for inspection / tests). */
|
|
95
|
+
lastBrickSize: number | null
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Compute true range for a bar against the prior close. */
|
|
99
|
+
const trueRange = (bar: OHLCV, prevClose: number | null): number => {
|
|
100
|
+
const hl = bar.high - bar.low
|
|
101
|
+
if (prevClose === null) return hl
|
|
102
|
+
const hc = Math.abs(bar.high - prevClose)
|
|
103
|
+
const lc = Math.abs(bar.low - prevClose)
|
|
104
|
+
return Math.max(hl, hc, lc)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Build a Renko transform.
|
|
109
|
+
*
|
|
110
|
+
* The transform supports both `transform(input, config)` and `appendBar(bar)`.
|
|
111
|
+
* The config passed to `transform` is also captured for subsequent
|
|
112
|
+
* `appendBar` calls — so the typical flow is:
|
|
113
|
+
*
|
|
114
|
+
* const r = createRenko()
|
|
115
|
+
* const history = r.transform(historicalBars, { brickSize: 10 })
|
|
116
|
+
* // ...later, as ticks arrive:
|
|
117
|
+
* const newBricks = r.appendBar(liveBar)
|
|
118
|
+
*/
|
|
119
|
+
export function createRenko(): ChartTypeTransform<RenkoConfig> {
|
|
120
|
+
let state: RenkoState = {
|
|
121
|
+
lastBrickClose: null,
|
|
122
|
+
lastDirection: null,
|
|
123
|
+
nextIndex: 0,
|
|
124
|
+
trWindow: [],
|
|
125
|
+
prevClose: null,
|
|
126
|
+
lastBrickSize: null,
|
|
127
|
+
}
|
|
128
|
+
let activeConfig: RenkoConfig = { brickSize: 1 }
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Return the current effective brick size given the active config and the
|
|
132
|
+
* current ATR window. Returns `null` when ATR mode is enabled but the
|
|
133
|
+
* window hasn't filled yet (no bricks can form until we have a brick
|
|
134
|
+
* size).
|
|
135
|
+
*/
|
|
136
|
+
const currentBrickSize = (): number | null => {
|
|
137
|
+
if (activeConfig.useATR) {
|
|
138
|
+
const period = activeConfig.useATR.period
|
|
139
|
+
if (state.trWindow.length < period) return null
|
|
140
|
+
let sum = 0
|
|
141
|
+
// Use only the most recent `period` entries — older history is
|
|
142
|
+
// not part of the rolling ATR (Wilder's smoothing is a separate
|
|
143
|
+
// discussion; we use the simple rolling mean which is the
|
|
144
|
+
// baseline TradingView ATR-Renko shows).
|
|
145
|
+
for (let i = state.trWindow.length - period; i < state.trWindow.length; i++) {
|
|
146
|
+
sum += state.trWindow[i] ?? 0
|
|
147
|
+
}
|
|
148
|
+
return sum / period
|
|
149
|
+
}
|
|
150
|
+
return activeConfig.brickSize ?? null
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Try to emit bricks from a single input bar. The bar's `close` is the
|
|
155
|
+
* trigger; we ignore intra-bar high/low for brick formation because Renko
|
|
156
|
+
* is canonically a *close-only* construction. (Using high/low works on
|
|
157
|
+
* tick data but creates phantom bricks on OHLC bars.)
|
|
158
|
+
*/
|
|
159
|
+
const emitBricksFromBar = (bar: OHLCV, sourceIndex: number): TransformedBar[] => {
|
|
160
|
+
const out: TransformedBar[] = []
|
|
161
|
+
const brickSize = currentBrickSize()
|
|
162
|
+
if (brickSize === null || brickSize <= 0) return out
|
|
163
|
+
|
|
164
|
+
// Initialise the "last brick close" lazily on the first bar — we
|
|
165
|
+
// anchor it to the bar's close so the first non-trivial move starts
|
|
166
|
+
// brick formation. (Anchoring to `open` would mean the very first bar
|
|
167
|
+
// could itself form a brick, which differs from the convention.)
|
|
168
|
+
if (state.lastBrickClose === null) {
|
|
169
|
+
state.lastBrickClose = bar.close
|
|
170
|
+
return out
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const close = bar.close
|
|
174
|
+
let firstBrickInThisBar = true
|
|
175
|
+
|
|
176
|
+
// Keep stepping bricks until the close no longer satisfies the
|
|
177
|
+
// threshold. Each iteration emits one brick and advances state.
|
|
178
|
+
// Loop bound: at most ceil(|close - lastBrickClose| / brickSize) — a
|
|
179
|
+
// hard upper bound prevents pathological infinite loops if brickSize
|
|
180
|
+
// becomes zero mid-iteration.
|
|
181
|
+
let safety = 0
|
|
182
|
+
while (safety++ < 1_000_000) {
|
|
183
|
+
const last: number | null = state.lastBrickClose
|
|
184
|
+
if (last === null) break
|
|
185
|
+
const diff: number = close - last
|
|
186
|
+
|
|
187
|
+
// Continuation needs 1×, reversal needs 2×. First-ever brick uses 1×.
|
|
188
|
+
let upThreshold: number
|
|
189
|
+
let downThreshold: number
|
|
190
|
+
if (state.lastDirection === 'up') {
|
|
191
|
+
upThreshold = brickSize
|
|
192
|
+
downThreshold = -2 * brickSize
|
|
193
|
+
} else if (state.lastDirection === 'down') {
|
|
194
|
+
upThreshold = 2 * brickSize
|
|
195
|
+
downThreshold = -brickSize
|
|
196
|
+
} else {
|
|
197
|
+
upThreshold = brickSize
|
|
198
|
+
downThreshold = -brickSize
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (diff >= upThreshold) {
|
|
202
|
+
const newClose: number = last + brickSize
|
|
203
|
+
out.push({
|
|
204
|
+
timestamp: bar.timestamp,
|
|
205
|
+
open: last,
|
|
206
|
+
close: newClose,
|
|
207
|
+
high: newClose,
|
|
208
|
+
low: last,
|
|
209
|
+
volume: firstBrickInThisBar ? bar.volume : 0,
|
|
210
|
+
sourceBarIndexStart: sourceIndex,
|
|
211
|
+
sourceBarIndexEnd: sourceIndex,
|
|
212
|
+
meta: { direction: 'up', brickSize },
|
|
213
|
+
})
|
|
214
|
+
state.lastBrickClose = newClose
|
|
215
|
+
state.lastDirection = 'up'
|
|
216
|
+
state.lastBrickSize = brickSize
|
|
217
|
+
firstBrickInThisBar = false
|
|
218
|
+
continue
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (diff <= downThreshold) {
|
|
222
|
+
const newClose: number = last - brickSize
|
|
223
|
+
out.push({
|
|
224
|
+
timestamp: bar.timestamp,
|
|
225
|
+
open: last,
|
|
226
|
+
close: newClose,
|
|
227
|
+
high: last,
|
|
228
|
+
low: newClose,
|
|
229
|
+
volume: firstBrickInThisBar ? bar.volume : 0,
|
|
230
|
+
sourceBarIndexStart: sourceIndex,
|
|
231
|
+
sourceBarIndexEnd: sourceIndex,
|
|
232
|
+
meta: { direction: 'down', brickSize },
|
|
233
|
+
})
|
|
234
|
+
state.lastBrickClose = newClose
|
|
235
|
+
state.lastDirection = 'down'
|
|
236
|
+
state.lastBrickSize = brickSize
|
|
237
|
+
firstBrickInThisBar = false
|
|
238
|
+
continue
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
break
|
|
242
|
+
}
|
|
243
|
+
return out
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const consumeBar = (bar: OHLCV): TransformedBar[] => {
|
|
247
|
+
const sourceIndex = state.nextIndex
|
|
248
|
+
// Update TR window BEFORE checking brick formation so the first ATR
|
|
249
|
+
// window's worth of bars participate in brick sizing as soon as
|
|
250
|
+
// possible.
|
|
251
|
+
const tr = trueRange(bar, state.prevClose)
|
|
252
|
+
state.trWindow.push(tr)
|
|
253
|
+
// Cap the window growth to twice the period for memory bound;
|
|
254
|
+
// anything older is never read.
|
|
255
|
+
if (activeConfig.useATR) {
|
|
256
|
+
const period = activeConfig.useATR.period
|
|
257
|
+
if (state.trWindow.length > period * 2) {
|
|
258
|
+
state.trWindow = state.trWindow.slice(state.trWindow.length - period)
|
|
259
|
+
}
|
|
260
|
+
} else if (state.trWindow.length > 2048) {
|
|
261
|
+
// For non-ATR mode we don't need the window at all — clear it.
|
|
262
|
+
state.trWindow = []
|
|
263
|
+
}
|
|
264
|
+
state.prevClose = bar.close
|
|
265
|
+
|
|
266
|
+
const emitted = emitBricksFromBar(bar, sourceIndex)
|
|
267
|
+
state.nextIndex = sourceIndex + 1
|
|
268
|
+
return emitted
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const resetState = (): void => {
|
|
272
|
+
state = {
|
|
273
|
+
lastBrickClose: null,
|
|
274
|
+
lastDirection: null,
|
|
275
|
+
nextIndex: 0,
|
|
276
|
+
trWindow: [],
|
|
277
|
+
prevClose: null,
|
|
278
|
+
lastBrickSize: null,
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return {
|
|
283
|
+
typeId: 'renko',
|
|
284
|
+
|
|
285
|
+
transform(input: ReadonlyArray<OHLCV>, config: RenkoConfig): ReadonlyArray<TransformedBar> {
|
|
286
|
+
// Validate: at least one mode must be set with sane values.
|
|
287
|
+
if (!config.useATR && (config.brickSize === undefined || config.brickSize <= 0)) {
|
|
288
|
+
throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: config requires brickSize > 0 or useATR { period }')
|
|
289
|
+
}
|
|
290
|
+
if (config.useATR && config.useATR.period < 1) {
|
|
291
|
+
throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: useATR.period must be >= 1')
|
|
292
|
+
}
|
|
293
|
+
activeConfig = config
|
|
294
|
+
resetState()
|
|
295
|
+
const out: TransformedBar[] = []
|
|
296
|
+
for (const bar of input) {
|
|
297
|
+
const fresh = consumeBar(bar)
|
|
298
|
+
for (const b of fresh) out.push(b)
|
|
299
|
+
}
|
|
300
|
+
return out
|
|
301
|
+
},
|
|
302
|
+
|
|
303
|
+
appendBar(bar: OHLCV): ReadonlyArray<TransformedBar> {
|
|
304
|
+
return consumeBar(bar)
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
reset(): void {
|
|
308
|
+
resetState()
|
|
309
|
+
},
|
|
310
|
+
}
|
|
311
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
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
|
+
|
|
39
|
+
/** Standard OHLCV row. Timestamps are epoch milliseconds. */
|
|
40
|
+
export interface OHLCV {
|
|
41
|
+
timestamp: number
|
|
42
|
+
open: number
|
|
43
|
+
high: number
|
|
44
|
+
low: number
|
|
45
|
+
close: number
|
|
46
|
+
volume: number
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* One output bar from a chart-type transform. Extends `OHLCV` so it can flow
|
|
51
|
+
* through the same scale / renderer pipeline as raw candles.
|
|
52
|
+
*
|
|
53
|
+
* `sourceBarIndexStart` / `sourceBarIndexEnd` mark which input rows were
|
|
54
|
+
* aggregated into this output row (inclusive). For 1:1 transforms (Heikin
|
|
55
|
+
* Ashi) they are equal. For aggregating transforms (Renko, P&F, Range Bars)
|
|
56
|
+
* they describe a range of source rows. For "fanning" transforms — one input
|
|
57
|
+
* bar that produces multiple output bars (large-gap Renko, oversized Range
|
|
58
|
+
* bar) — every fanned-out output row shares the same start/end index.
|
|
59
|
+
*/
|
|
60
|
+
export interface TransformedBar extends OHLCV {
|
|
61
|
+
/** Lowest source index folded into this output bar (inclusive). */
|
|
62
|
+
sourceBarIndexStart: number
|
|
63
|
+
/** Highest source index folded into this output bar (inclusive). */
|
|
64
|
+
sourceBarIndexEnd: number
|
|
65
|
+
/**
|
|
66
|
+
* Transform-specific metadata. Marked `Readonly` so consumers can rely on
|
|
67
|
+
* structural sharing — a transform must never mutate metadata after
|
|
68
|
+
* emitting it.
|
|
69
|
+
*/
|
|
70
|
+
meta?: Readonly<Record<string, unknown>>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Common shape for all chart-type transformers.
|
|
75
|
+
*
|
|
76
|
+
* `transform` is pure — it does NOT mutate `input` and (for stateful
|
|
77
|
+
* transforms) calling it resets internal state first so the result depends
|
|
78
|
+
* only on `input` + `config`.
|
|
79
|
+
*
|
|
80
|
+
* `appendBar` is incremental — it does mutate internal state. Calling
|
|
81
|
+
* `reset()` returns the transform to its initial state.
|
|
82
|
+
*
|
|
83
|
+
* `typeId` is a stable, human-readable identifier used by the scene/registry.
|
|
84
|
+
*/
|
|
85
|
+
export interface ChartTypeTransform<TConfig = unknown> {
|
|
86
|
+
readonly typeId: string
|
|
87
|
+
transform(input: ReadonlyArray<OHLCV>, config: TConfig): ReadonlyArray<TransformedBar>
|
|
88
|
+
/**
|
|
89
|
+
* Append one input bar and emit zero, one, or many output bars.
|
|
90
|
+
*
|
|
91
|
+
* Implementations that do not support incremental mode omit this method.
|
|
92
|
+
* For Heikin Ashi the output is always exactly one bar per call. For
|
|
93
|
+
* Renko / Range Bars / P&F the count can be 0..N depending on whether the
|
|
94
|
+
* new bar triggers brick/box formation.
|
|
95
|
+
*/
|
|
96
|
+
appendBar?(input: OHLCV): ReadonlyArray<TransformedBar>
|
|
97
|
+
/** Drop internal state. Idempotent. Safe to call on stateless transforms. */
|
|
98
|
+
reset?(): void
|
|
99
|
+
}
|