@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chartTypes/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chartTypes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAoB,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAA6B,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,eAAe,EAAwB,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Point & Figure (P&F) — classic three-box-reversal column chart.
|
|
3
|
+
*
|
|
4
|
+
* P&F is the oldest non-time chart type still in use (de Villiers documented
|
|
5
|
+
* it in 1933, traders were drawing it on graph paper a century before that).
|
|
6
|
+
* It is a column chart: each column is either rising X's or falling O's, and
|
|
7
|
+
* we move to a new column only when price reverses by `reversal × boxSize`.
|
|
8
|
+
*
|
|
9
|
+
* ## Algorithm (classic 3-box reversal)
|
|
10
|
+
*
|
|
11
|
+
* - State: current column `direction`, current column extent `[low, high]`.
|
|
12
|
+
* - For each new input bar with `[H, L]`:
|
|
13
|
+
*
|
|
14
|
+
* - If column is X (up):
|
|
15
|
+
* * If `H >= high + boxSize`: extend the X column up to the highest box
|
|
16
|
+
* containing `H` (i.e. set `high := floor(H / boxSize) * boxSize`).
|
|
17
|
+
* * Else if `L <= high - reversal * boxSize`: reverse — start a new O
|
|
18
|
+
* column. The new column starts **one box below** the prior X
|
|
19
|
+
* column's high, and goes down to the lowest box `>= L`. The "one
|
|
20
|
+
* box below" rule is the classical de Villiers convention and is
|
|
21
|
+
* what TradingView uses.
|
|
22
|
+
* * Else: bar does nothing.
|
|
23
|
+
*
|
|
24
|
+
* - Symmetric for an O (down) column.
|
|
25
|
+
*
|
|
26
|
+
* - First-ever input bar seeds the chart with an X column anchored on the
|
|
27
|
+
* bar's `low` rounded down to a box boundary, extended up to `H` rounded
|
|
28
|
+
* down to a box boundary. (Some traditions start with the high; we use
|
|
29
|
+
* low-anchored which is more deterministic for a single bar.)
|
|
30
|
+
*
|
|
31
|
+
* ## Why this is lossy by design
|
|
32
|
+
*
|
|
33
|
+
* P&F deletes time entirely. Two bars produced at very different times can
|
|
34
|
+
* land in the same column. We therefore set every output column's
|
|
35
|
+
* `timestamp` to the timestamp of the source bar that **closed** the column
|
|
36
|
+
* (i.e. the last bar that touched it). This gives downstream tooltips a
|
|
37
|
+
* meaningful anchor while honouring the lossy semantics.
|
|
38
|
+
*
|
|
39
|
+
* ## OHLCV mapping for one column
|
|
40
|
+
*
|
|
41
|
+
* - `open` = starting box price (column entry)
|
|
42
|
+
* - `close` = final box price (column exit / current frontier)
|
|
43
|
+
* - `high` = max box price reached in this column
|
|
44
|
+
* - `low` = min box price reached in this column
|
|
45
|
+
* - `volume`= sum of input bar volumes that touched this column
|
|
46
|
+
*
|
|
47
|
+
* For an X column `close === high` and `open === low`. For an O column
|
|
48
|
+
* `close === low` and `open === high`. We populate `meta.direction` so
|
|
49
|
+
* renderers can colour distinctly.
|
|
50
|
+
*
|
|
51
|
+
* ## Reversal vs extension at the exact threshold
|
|
52
|
+
*
|
|
53
|
+
* If a bar simultaneously satisfies both extension and reversal — e.g. an X
|
|
54
|
+
* column where `H >= high + boxSize` AND `L <= high - reversal * boxSize` —
|
|
55
|
+
* **extension wins** (we follow the direction-of-momentum rule). This avoids
|
|
56
|
+
* "chop" in volatile bars but is a deliberate trade-off; some older systems
|
|
57
|
+
* give reversal priority on the basis of "the down move came second". We
|
|
58
|
+
* pick extension because it matches modern interactive P&F implementations
|
|
59
|
+
* including TradingView.
|
|
60
|
+
*
|
|
61
|
+
* ## Emission strategy
|
|
62
|
+
*
|
|
63
|
+
* Each completed column emits exactly **one** TransformedBar — the column's
|
|
64
|
+
* snapshot at the moment it closed. While a column is still "open" (i.e. it
|
|
65
|
+
* is the current column being extended) it does NOT appear in the output.
|
|
66
|
+
* `appendBar` therefore returns `[]` for bars that only extend the current
|
|
67
|
+
* column, and `[completedColumn, ...]` for bars that trigger a reversal.
|
|
68
|
+
*
|
|
69
|
+
* In batch mode `transform()` returns every column INCLUDING the in-progress
|
|
70
|
+
* final column so the user sees the full picture. This is the only place
|
|
71
|
+
* where batch and incremental diverge — and it's intentional, because there
|
|
72
|
+
* is no streaming convention to "tentatively emit" a still-open column.
|
|
73
|
+
* Tests assert that *closed* columns match between modes.
|
|
74
|
+
*/
|
|
75
|
+
import type { ChartTypeTransform } from './types';
|
|
76
|
+
export interface PointAndFigureConfig {
|
|
77
|
+
/** Box height in price units. Must be > 0. */
|
|
78
|
+
boxSize: number;
|
|
79
|
+
/** Reversal in number of boxes. Classic value is 3. Must be >= 1. */
|
|
80
|
+
reversal: number;
|
|
81
|
+
}
|
|
82
|
+
export declare function createPointAndFigure(): ChartTypeTransform<PointAndFigureConfig>;
|
|
83
|
+
//# sourceMappingURL=pointAndFigure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointAndFigure.d.ts","sourceRoot":"","sources":["../../src/chartTypes/pointAndFigure.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,SAAS,CAAA;AAExE,MAAM,WAAW,oBAAoB;IACjC,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAA;CACnB;AA8CD,wBAAgB,oBAAoB,IAAI,kBAAkB,CAAC,oBAAoB,CAAC,CAoJ/E"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors';
|
|
2
|
+
/**
|
|
3
|
+
* Convert an internal column to a `TransformedBar`. We compute `open`, `close`,
|
|
4
|
+
* `high`, `low` from the column's two endpoints (P&F columns are monotonic in
|
|
5
|
+
* one direction so the two endpoints are the extremes).
|
|
6
|
+
*/
|
|
7
|
+
const columnToBar = (col) => {
|
|
8
|
+
const open = col.startPrice;
|
|
9
|
+
const close = col.endPrice;
|
|
10
|
+
const high = Math.max(open, close);
|
|
11
|
+
const low = Math.min(open, close);
|
|
12
|
+
return {
|
|
13
|
+
timestamp: col.timestamp,
|
|
14
|
+
open,
|
|
15
|
+
high,
|
|
16
|
+
low,
|
|
17
|
+
close,
|
|
18
|
+
volume: col.volume,
|
|
19
|
+
sourceBarIndexStart: col.sourceStart,
|
|
20
|
+
sourceBarIndexEnd: col.sourceEnd,
|
|
21
|
+
meta: { direction: col.direction },
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export function createPointAndFigure() {
|
|
25
|
+
let state = { column: null, nextIndex: 0, closedColumns: [] };
|
|
26
|
+
let activeConfig = { boxSize: 1, reversal: 3 };
|
|
27
|
+
/** Snap `p` down to the nearest box boundary. */
|
|
28
|
+
const floorToBox = (p, box) => Math.floor(p / box) * box;
|
|
29
|
+
/** Snap `p` up to the nearest box boundary. */
|
|
30
|
+
const ceilToBox = (p, box) => Math.ceil(p / box) * box;
|
|
31
|
+
/**
|
|
32
|
+
* Process one input bar and return any column(s) that **closed** as a
|
|
33
|
+
* result. The in-progress column is held in `state.column` and is NOT
|
|
34
|
+
* returned until it closes (i.e. a reversal pushes it into closedColumns).
|
|
35
|
+
*/
|
|
36
|
+
const consumeBar = (bar) => {
|
|
37
|
+
const sourceIndex = state.nextIndex;
|
|
38
|
+
state.nextIndex = sourceIndex + 1;
|
|
39
|
+
const { boxSize, reversal } = activeConfig;
|
|
40
|
+
const closed = [];
|
|
41
|
+
// Seed: no current column. Anchor an X column on the bar's low/high
|
|
42
|
+
// rounded to box boundaries. If high-low rounds to the same box (very
|
|
43
|
+
// narrow bar) we still create a degenerate column of height zero so
|
|
44
|
+
// the chart has a starting point — it will be extended by future bars.
|
|
45
|
+
if (state.column === null) {
|
|
46
|
+
const start = floorToBox(bar.low, boxSize);
|
|
47
|
+
const end = floorToBox(bar.high, boxSize);
|
|
48
|
+
state.column = {
|
|
49
|
+
direction: 'up',
|
|
50
|
+
startPrice: start,
|
|
51
|
+
endPrice: end,
|
|
52
|
+
sourceStart: sourceIndex,
|
|
53
|
+
sourceEnd: sourceIndex,
|
|
54
|
+
volume: bar.volume,
|
|
55
|
+
timestamp: bar.timestamp,
|
|
56
|
+
};
|
|
57
|
+
return closed;
|
|
58
|
+
}
|
|
59
|
+
const col = state.column;
|
|
60
|
+
if (col.direction === 'up') {
|
|
61
|
+
// Try extension first (extension wins ties — see file header).
|
|
62
|
+
const newHigh = floorToBox(bar.high, boxSize);
|
|
63
|
+
if (newHigh >= col.endPrice + boxSize) {
|
|
64
|
+
col.endPrice = newHigh;
|
|
65
|
+
col.sourceEnd = sourceIndex;
|
|
66
|
+
col.volume += bar.volume;
|
|
67
|
+
col.timestamp = bar.timestamp;
|
|
68
|
+
return closed;
|
|
69
|
+
}
|
|
70
|
+
// Then reversal.
|
|
71
|
+
if (bar.low <= col.endPrice - reversal * boxSize) {
|
|
72
|
+
// Close the X column.
|
|
73
|
+
closed.push(columnToBar(col));
|
|
74
|
+
state.closedColumns.push(closed[closed.length - 1]);
|
|
75
|
+
// Start a new O column ONE box below the X column's high.
|
|
76
|
+
const newColumnStart = col.endPrice - boxSize;
|
|
77
|
+
const newColumnEnd = ceilToBox(bar.low, boxSize);
|
|
78
|
+
state.column = {
|
|
79
|
+
direction: 'down',
|
|
80
|
+
startPrice: newColumnStart,
|
|
81
|
+
endPrice: newColumnEnd <= newColumnStart ? newColumnEnd : newColumnStart,
|
|
82
|
+
sourceStart: sourceIndex,
|
|
83
|
+
sourceEnd: sourceIndex,
|
|
84
|
+
volume: bar.volume,
|
|
85
|
+
timestamp: bar.timestamp,
|
|
86
|
+
};
|
|
87
|
+
return closed;
|
|
88
|
+
}
|
|
89
|
+
// Bar does nothing — still attribute volume + advance source range
|
|
90
|
+
// so the column's metadata reflects the bars that touched it.
|
|
91
|
+
col.sourceEnd = sourceIndex;
|
|
92
|
+
col.volume += bar.volume;
|
|
93
|
+
col.timestamp = bar.timestamp;
|
|
94
|
+
return closed;
|
|
95
|
+
}
|
|
96
|
+
// col.direction === 'down'
|
|
97
|
+
const newLow = ceilToBox(bar.low, boxSize);
|
|
98
|
+
if (newLow <= col.endPrice - boxSize) {
|
|
99
|
+
col.endPrice = newLow;
|
|
100
|
+
col.sourceEnd = sourceIndex;
|
|
101
|
+
col.volume += bar.volume;
|
|
102
|
+
col.timestamp = bar.timestamp;
|
|
103
|
+
return closed;
|
|
104
|
+
}
|
|
105
|
+
if (bar.high >= col.endPrice + reversal * boxSize) {
|
|
106
|
+
closed.push(columnToBar(col));
|
|
107
|
+
state.closedColumns.push(closed[closed.length - 1]);
|
|
108
|
+
const newColumnStart = col.endPrice + boxSize;
|
|
109
|
+
const newColumnEnd = floorToBox(bar.high, boxSize);
|
|
110
|
+
state.column = {
|
|
111
|
+
direction: 'up',
|
|
112
|
+
startPrice: newColumnStart,
|
|
113
|
+
endPrice: newColumnEnd >= newColumnStart ? newColumnEnd : newColumnStart,
|
|
114
|
+
sourceStart: sourceIndex,
|
|
115
|
+
sourceEnd: sourceIndex,
|
|
116
|
+
volume: bar.volume,
|
|
117
|
+
timestamp: bar.timestamp,
|
|
118
|
+
};
|
|
119
|
+
return closed;
|
|
120
|
+
}
|
|
121
|
+
col.sourceEnd = sourceIndex;
|
|
122
|
+
col.volume += bar.volume;
|
|
123
|
+
col.timestamp = bar.timestamp;
|
|
124
|
+
return closed;
|
|
125
|
+
};
|
|
126
|
+
const resetState = () => {
|
|
127
|
+
state = { column: null, nextIndex: 0, closedColumns: [] };
|
|
128
|
+
};
|
|
129
|
+
return {
|
|
130
|
+
typeId: 'point-and-figure',
|
|
131
|
+
transform(input, config) {
|
|
132
|
+
if (config.boxSize <= 0) {
|
|
133
|
+
throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createPointAndFigure: boxSize must be > 0');
|
|
134
|
+
}
|
|
135
|
+
if (config.reversal < 1 || !Number.isFinite(config.reversal)) {
|
|
136
|
+
throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createPointAndFigure: reversal must be >= 1');
|
|
137
|
+
}
|
|
138
|
+
activeConfig = config;
|
|
139
|
+
resetState();
|
|
140
|
+
for (const bar of input) {
|
|
141
|
+
consumeBar(bar);
|
|
142
|
+
}
|
|
143
|
+
// Batch mode includes the currently-open column as the last entry —
|
|
144
|
+
// see file header. Incremental mode does not.
|
|
145
|
+
const out = state.closedColumns.slice();
|
|
146
|
+
if (state.column !== null) {
|
|
147
|
+
out.push(columnToBar(state.column));
|
|
148
|
+
}
|
|
149
|
+
return out;
|
|
150
|
+
},
|
|
151
|
+
appendBar(bar) {
|
|
152
|
+
return consumeBar(bar);
|
|
153
|
+
},
|
|
154
|
+
reset() {
|
|
155
|
+
resetState();
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=pointAndFigure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointAndFigure.js","sourceRoot":"","sources":["../../src/chartTypes/pointAndFigure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Range Bars — fixed-range price bars.
|
|
3
|
+
*
|
|
4
|
+
* Every output bar spans exactly `range` price units (high - low === range at
|
|
5
|
+
* close). When the active bar's range reaches the threshold it is closed and
|
|
6
|
+
* a new bar begins, opening at the trigger price. Time, like Renko and P&F,
|
|
7
|
+
* is collapsed.
|
|
8
|
+
*
|
|
9
|
+
* ## Why range bars over Renko
|
|
10
|
+
*
|
|
11
|
+
* - **Renko** uses only the close; intra-bar wicks are invisible. Good for
|
|
12
|
+
* long-term swing visualisation.
|
|
13
|
+
* - **Range bars** use the entire (high, low) of every input bar. They show
|
|
14
|
+
* intra-bar excursions and tend to be more responsive to spikes.
|
|
15
|
+
*
|
|
16
|
+
* ## Algorithm
|
|
17
|
+
*
|
|
18
|
+
* State carries the in-progress bar `{open, high, low, volume, ...}`. For each
|
|
19
|
+
* input bar:
|
|
20
|
+
*
|
|
21
|
+
* 1. Decide a *direction* for the input bar (`up` if close >= open, else
|
|
22
|
+
* `down`). Range bars need a direction because OHLC bars don't carry the
|
|
23
|
+
* tick-level path between low and high.
|
|
24
|
+
* 2. Merge the input bar into the open bar BUT only along the direction —
|
|
25
|
+
* meaning we honour both high and low, but if the merged span exceeds
|
|
26
|
+
* `range` we *carve* the range bar in the direction of motion.
|
|
27
|
+
* 3. Carving: an "up" input that pushes total span past `range` closes the
|
|
28
|
+
* current bar at `low + range`. The carved excess starts the next bar
|
|
29
|
+
* with `open = low + range`, and any remaining high above the carved
|
|
30
|
+
* ceiling becomes the next bar's high (recursion).
|
|
31
|
+
* 4. Edge case: a single input bar with `high - low > range` walks the bar's
|
|
32
|
+
* range in `range`-sized steps in the input's direction and emits one
|
|
33
|
+
* output bar per full step.
|
|
34
|
+
*
|
|
35
|
+
* ## Direction heuristic for OHLC inputs
|
|
36
|
+
*
|
|
37
|
+
* When closing from a single input contribution, we use `input.close >= input.open`
|
|
38
|
+
* to choose the carve direction. This is the same heuristic TradingView uses
|
|
39
|
+
* with OHLC input — exact tick-by-tick directionality would require trades.
|
|
40
|
+
*
|
|
41
|
+
* ## Volume aggregation
|
|
42
|
+
*
|
|
43
|
+
* Volume is summed across every input bar that contributes any range. For a
|
|
44
|
+
* single input that produces multiple output bars (a split), the input's
|
|
45
|
+
* volume is divided proportionally to the price extent each output bar
|
|
46
|
+
* carves of the input bar's total H-L.
|
|
47
|
+
*
|
|
48
|
+
* ## Emission strategy
|
|
49
|
+
*
|
|
50
|
+
* `transform()` returns every closed bar PLUS the currently-open bar (mirrors
|
|
51
|
+
* a live chart). `appendBar()` returns only the bars that closed on this
|
|
52
|
+
* append — the open bar is held in state. Tests assert the closed prefix
|
|
53
|
+
* matches between modes.
|
|
54
|
+
*/
|
|
55
|
+
import type { ChartTypeTransform } from './types';
|
|
56
|
+
export interface RangeBarsConfig {
|
|
57
|
+
/** Range height in price units. Must be > 0. */
|
|
58
|
+
range: number;
|
|
59
|
+
}
|
|
60
|
+
export declare function createRangeBars(): ChartTypeTransform<RangeBarsConfig>;
|
|
61
|
+
//# sourceMappingURL=rangeBars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rangeBars.d.ts","sourceRoot":"","sources":["../../src/chartTypes/rangeBars.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,SAAS,CAAA;AAExE,MAAM,WAAW,eAAe;IAC5B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;CAChB;AA0CD,wBAAgB,eAAe,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAuMrE"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors';
|
|
2
|
+
const makeClosed = (open, high, low, close, volume, sourceStart, sourceEnd, timestamp) => {
|
|
3
|
+
const direction = close >= open ? 'up' : 'down';
|
|
4
|
+
return {
|
|
5
|
+
timestamp,
|
|
6
|
+
open,
|
|
7
|
+
high,
|
|
8
|
+
low,
|
|
9
|
+
close,
|
|
10
|
+
volume,
|
|
11
|
+
sourceBarIndexStart: sourceStart,
|
|
12
|
+
sourceBarIndexEnd: sourceEnd,
|
|
13
|
+
meta: { direction },
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export function createRangeBars() {
|
|
17
|
+
let state = { open: null, nextIndex: 0, closed: [] };
|
|
18
|
+
let activeConfig = { range: 1 };
|
|
19
|
+
/**
|
|
20
|
+
* Merge one input bar into the open range bar, carving as many closed
|
|
21
|
+
* range bars as needed. Returns the bars that closed during this merge.
|
|
22
|
+
*/
|
|
23
|
+
const consumeBar = (bar) => {
|
|
24
|
+
const sourceIndex = state.nextIndex;
|
|
25
|
+
state.nextIndex = sourceIndex + 1;
|
|
26
|
+
const range = activeConfig.range;
|
|
27
|
+
const closed = [];
|
|
28
|
+
const upward = bar.close >= bar.open;
|
|
29
|
+
const inputExtent = Math.max(bar.high - bar.low, 1e-12);
|
|
30
|
+
// Seed: no in-progress bar yet. Open one at the input's open. The
|
|
31
|
+
// input's full H/L participates immediately.
|
|
32
|
+
if (state.open === null) {
|
|
33
|
+
state.open = {
|
|
34
|
+
open: bar.open,
|
|
35
|
+
high: bar.open,
|
|
36
|
+
low: bar.open,
|
|
37
|
+
volume: 0,
|
|
38
|
+
sourceStart: sourceIndex,
|
|
39
|
+
sourceEnd: sourceIndex,
|
|
40
|
+
timestamp: bar.timestamp,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Track how much input volume we've attributed so we can split it
|
|
44
|
+
// proportionally across any carved bars.
|
|
45
|
+
let inputVolUsed = 0;
|
|
46
|
+
// Repeatedly merge the input into the open bar; each iteration either
|
|
47
|
+
// (a) closes a bar and seeds a new open one from the carved-off
|
|
48
|
+
// remainder, or (b) finishes by absorbing the entire input range.
|
|
49
|
+
//
|
|
50
|
+
// We walk the input bar along its direction. `remainingHigh` and
|
|
51
|
+
// `remainingLow` shrink as we carve. We stop when no further range
|
|
52
|
+
// bar can be closed.
|
|
53
|
+
let remainingHigh = bar.high;
|
|
54
|
+
let remainingLow = bar.low;
|
|
55
|
+
let safety = 0;
|
|
56
|
+
while (safety++ < 1_000_000) {
|
|
57
|
+
const opened = state.open;
|
|
58
|
+
// Apply the remaining input extent to the open bar.
|
|
59
|
+
const mergedHigh = Math.max(opened.high, remainingHigh);
|
|
60
|
+
const mergedLow = Math.min(opened.low, remainingLow);
|
|
61
|
+
const span = mergedHigh - mergedLow;
|
|
62
|
+
if (span < range) {
|
|
63
|
+
// Whole remainder fits within range — absorb and stop.
|
|
64
|
+
opened.high = mergedHigh;
|
|
65
|
+
opened.low = mergedLow;
|
|
66
|
+
opened.sourceEnd = sourceIndex;
|
|
67
|
+
opened.timestamp = bar.timestamp;
|
|
68
|
+
// All remaining input volume goes here.
|
|
69
|
+
opened.volume += bar.volume - inputVolUsed;
|
|
70
|
+
inputVolUsed = bar.volume;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
// Span >= range. Carve a range bar in the direction of motion.
|
|
74
|
+
// For an up bar: close at low + range (we move up first).
|
|
75
|
+
// For a down bar: close at high - range.
|
|
76
|
+
let closePrice;
|
|
77
|
+
let closedHigh;
|
|
78
|
+
let closedLow;
|
|
79
|
+
if (upward) {
|
|
80
|
+
closedLow = mergedLow;
|
|
81
|
+
closedHigh = mergedLow + range;
|
|
82
|
+
closePrice = closedHigh;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
closedHigh = mergedHigh;
|
|
86
|
+
closedLow = mergedHigh - range;
|
|
87
|
+
closePrice = closedLow;
|
|
88
|
+
}
|
|
89
|
+
// Volume attributed to this carved bar: proportional to the
|
|
90
|
+
// input extent it covers, plus any volume already accumulated on
|
|
91
|
+
// the open bar from prior input bars.
|
|
92
|
+
const carvedExtent = Math.min(range, span);
|
|
93
|
+
const inputShare = (carvedExtent / inputExtent) * bar.volume;
|
|
94
|
+
const attribInput = Math.min(inputShare, bar.volume - inputVolUsed);
|
|
95
|
+
inputVolUsed += attribInput;
|
|
96
|
+
const closedVolume = opened.volume + attribInput;
|
|
97
|
+
closed.push(makeClosed(opened.open, closedHigh, closedLow, closePrice, closedVolume, opened.sourceStart, sourceIndex, bar.timestamp));
|
|
98
|
+
state.closed.push(closed[closed.length - 1]);
|
|
99
|
+
// Seed the next open bar at the carve boundary. The remaining
|
|
100
|
+
// input extent above (for up) or below (for down) the carve
|
|
101
|
+
// continues into the new bar.
|
|
102
|
+
if (upward) {
|
|
103
|
+
remainingLow = closePrice;
|
|
104
|
+
state.open = {
|
|
105
|
+
open: closePrice,
|
|
106
|
+
high: closePrice,
|
|
107
|
+
low: closePrice,
|
|
108
|
+
volume: 0,
|
|
109
|
+
sourceStart: sourceIndex,
|
|
110
|
+
sourceEnd: sourceIndex,
|
|
111
|
+
timestamp: bar.timestamp,
|
|
112
|
+
};
|
|
113
|
+
// If the input bar's high is no greater than the carve
|
|
114
|
+
// ceiling, nothing more from this input remains for further
|
|
115
|
+
// carving.
|
|
116
|
+
if (remainingHigh <= closePrice) {
|
|
117
|
+
// The new open bar already has open=closePrice; the
|
|
118
|
+
// remaining high contributes nothing further. Stop.
|
|
119
|
+
state.open.high = closePrice;
|
|
120
|
+
state.open.low = closePrice;
|
|
121
|
+
// Attribute leftover input volume to the now-current open.
|
|
122
|
+
state.open.volume = bar.volume - inputVolUsed;
|
|
123
|
+
inputVolUsed = bar.volume;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
remainingHigh = closePrice;
|
|
129
|
+
state.open = {
|
|
130
|
+
open: closePrice,
|
|
131
|
+
high: closePrice,
|
|
132
|
+
low: closePrice,
|
|
133
|
+
volume: 0,
|
|
134
|
+
sourceStart: sourceIndex,
|
|
135
|
+
sourceEnd: sourceIndex,
|
|
136
|
+
timestamp: bar.timestamp,
|
|
137
|
+
};
|
|
138
|
+
if (remainingLow >= closePrice) {
|
|
139
|
+
state.open.high = closePrice;
|
|
140
|
+
state.open.low = closePrice;
|
|
141
|
+
state.open.volume = bar.volume - inputVolUsed;
|
|
142
|
+
inputVolUsed = bar.volume;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return closed;
|
|
148
|
+
};
|
|
149
|
+
const resetState = () => {
|
|
150
|
+
state = { open: null, nextIndex: 0, closed: [] };
|
|
151
|
+
};
|
|
152
|
+
return {
|
|
153
|
+
typeId: 'range-bars',
|
|
154
|
+
transform(input, config) {
|
|
155
|
+
if (config.range <= 0 || !Number.isFinite(config.range)) {
|
|
156
|
+
throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRangeBars: range must be > 0');
|
|
157
|
+
}
|
|
158
|
+
activeConfig = config;
|
|
159
|
+
resetState();
|
|
160
|
+
for (const bar of input)
|
|
161
|
+
consumeBar(bar);
|
|
162
|
+
const out = state.closed.slice();
|
|
163
|
+
if (state.open !== null) {
|
|
164
|
+
// The trailing in-progress bar's "close" is its frontier — the
|
|
165
|
+
// direction of last accumulation. We pick high for "up" if
|
|
166
|
+
// close>=open, else low, matching candle semantics.
|
|
167
|
+
const o = state.open;
|
|
168
|
+
const close = o.high - o.open >= o.open - o.low ? o.high : o.low;
|
|
169
|
+
out.push(makeClosed(o.open, o.high, o.low, close, o.volume, o.sourceStart, o.sourceEnd, o.timestamp));
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
172
|
+
},
|
|
173
|
+
appendBar(bar) {
|
|
174
|
+
return consumeBar(bar);
|
|
175
|
+
},
|
|
176
|
+
reset() {
|
|
177
|
+
resetState();
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=rangeBars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rangeBars.js","sourceRoot":"","sources":["../../src/chartTypes/rangeBars.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renko bricks — price-based bars that ignore time.
|
|
3
|
+
*
|
|
4
|
+
* A Renko chart drops a fixed-size "brick" every time price advances by one
|
|
5
|
+
* brick-size from the previous brick's close. Time is collapsed: a quiet hour
|
|
6
|
+
* may produce zero bricks, a volatile minute may produce ten.
|
|
7
|
+
*
|
|
8
|
+
* ## Modes
|
|
9
|
+
*
|
|
10
|
+
* - **Fixed brick size** (`{ brickSize }`): the classic chart. Brick height
|
|
11
|
+
* is constant across the entire series.
|
|
12
|
+
* - **ATR-adaptive brick size** (`{ useATR: { period } }`): brick size is the
|
|
13
|
+
* rolling ATR(period) over the *input* OHLCV series. We compute the full
|
|
14
|
+
* ATR series upfront and then use, for each candidate brick, the **trailing
|
|
15
|
+
* ATR at the source bar that triggered it**. This means brick height varies
|
|
16
|
+
* along the chart — wider in volatile regimes, tighter in quiet ones —
|
|
17
|
+
* which is the whole point of ATR mode.
|
|
18
|
+
*
|
|
19
|
+
* Trade-off (documented because it's a real one): ATR bricks are NOT
|
|
20
|
+
* uniform-height, so the chart loses the "every step is the same size"
|
|
21
|
+
* visual property that classical Renko has. In return, the brick rhythm
|
|
22
|
+
* adapts to volatility — a feature TradingView only offers in a separate
|
|
23
|
+
* chart-type ("ATR Renko") and which requires the user to reload the
|
|
24
|
+
* series to change. Our implementation supports flipping `useATR` on a
|
|
25
|
+
* live transform incrementally — see §"Enhancements over TradingView".
|
|
26
|
+
*
|
|
27
|
+
* ## Classic reversal rule (the 2× brick-size requirement)
|
|
28
|
+
*
|
|
29
|
+
* Once a column of up-bricks has been emitted, a single brick-size reverse
|
|
30
|
+
* move is NOT enough to start a down-column — it must travel **2 × brickSize**
|
|
31
|
+
* in the opposite direction from the last brick's close. This is the
|
|
32
|
+
* "classic" Nison/Steve Nison rule. Without the 2× requirement the chart
|
|
33
|
+
* "flutters" — every wiggle near the brick-size threshold flips direction.
|
|
34
|
+
*
|
|
35
|
+
* In code:
|
|
36
|
+
* - Continuation (same direction as last brick): need ≥ 1 × brickSize.
|
|
37
|
+
* - Reversal (opposite direction): need ≥ 2 × brickSize.
|
|
38
|
+
*
|
|
39
|
+
* The very first brick has no "previous direction", so it uses the 1× rule.
|
|
40
|
+
*
|
|
41
|
+
* ## Brick shape
|
|
42
|
+
*
|
|
43
|
+
* Each brick is OHLCV-shaped to fit the candle renderer:
|
|
44
|
+
*
|
|
45
|
+
* up-brick: open = lastBrickClose
|
|
46
|
+
* close = lastBrickClose + brickSize
|
|
47
|
+
* high = close, low = open
|
|
48
|
+
*
|
|
49
|
+
* down-brick: open = lastBrickClose
|
|
50
|
+
* close = lastBrickClose - brickSize
|
|
51
|
+
* high = open, low = close
|
|
52
|
+
*
|
|
53
|
+
* `volume` is the sum of input-bar volumes assigned to this brick. We use a
|
|
54
|
+
* simple rule: each input bar contributes all of its volume to **the first
|
|
55
|
+
* brick** it triggers in that bar. When one bar triggers N bricks (a gap),
|
|
56
|
+
* the bar's full volume goes on the first brick and the rest carry zero. This
|
|
57
|
+
* matches TradingView; the alternative (split evenly) creates phantom volume
|
|
58
|
+
* spikes when ATR mode changes brick sizes between bricks.
|
|
59
|
+
*
|
|
60
|
+
* ## Meta
|
|
61
|
+
*
|
|
62
|
+
* `meta.direction` is `'up'` or `'down'` for downstream colour selection.
|
|
63
|
+
* `meta.brickSize` is the brick height at the time of emission (especially
|
|
64
|
+
* meaningful in ATR mode).
|
|
65
|
+
*/
|
|
66
|
+
import type { ChartTypeTransform } from './types';
|
|
67
|
+
/**
|
|
68
|
+
* Renko configuration.
|
|
69
|
+
*
|
|
70
|
+
* Exactly one of `brickSize` or `useATR` must be supplied. If both are present
|
|
71
|
+
* `useATR` wins (so callers can store both and toggle a flag).
|
|
72
|
+
*/
|
|
73
|
+
export interface RenkoConfig {
|
|
74
|
+
/** Fixed brick height in price units. Must be > 0. */
|
|
75
|
+
brickSize?: number;
|
|
76
|
+
/** ATR-adaptive mode. `period` is the ATR lookback. */
|
|
77
|
+
useATR?: {
|
|
78
|
+
period: number;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build a Renko transform.
|
|
83
|
+
*
|
|
84
|
+
* The transform supports both `transform(input, config)` and `appendBar(bar)`.
|
|
85
|
+
* The config passed to `transform` is also captured for subsequent
|
|
86
|
+
* `appendBar` calls — so the typical flow is:
|
|
87
|
+
*
|
|
88
|
+
* const r = createRenko()
|
|
89
|
+
* const history = r.transform(historicalBars, { brickSize: 10 })
|
|
90
|
+
* // ...later, as ticks arrive:
|
|
91
|
+
* const newBricks = r.appendBar(liveBar)
|
|
92
|
+
*/
|
|
93
|
+
export declare function createRenko(): ChartTypeTransform<RenkoConfig>;
|
|
94
|
+
//# sourceMappingURL=renko.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renko.d.ts","sourceRoot":"","sources":["../../src/chartTypes/renko.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,SAAS,CAAA;AAExE;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IACxB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9B;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAgM7D"}
|