@363045841yyt/klinechart-core 0.8.6 → 0.8.8
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/config/chartSettings.d.ts +18 -2
- package/dist/config/chartSettings.d.ts.map +1 -1
- package/dist/config/chartSettings.js +8 -1
- package/dist/config/chartSettings.js.map +1 -1
- package/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +56 -2
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +36 -23
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.d.ts +0 -3
- package/dist/data-fetchers/baostock.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +0 -1
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.d.ts +13 -2
- package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.js +41 -7
- package/dist/data-fetchers/dataBuffer.js.map +1 -1
- package/dist/data-fetchers/dataBufferTypes.d.ts +11 -0
- package/dist/data-fetchers/dataBufferTypes.d.ts.map +1 -0
- package/dist/data-fetchers/dataBufferTypes.js +2 -0
- package/dist/data-fetchers/dataBufferTypes.js.map +1 -0
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts +4 -3
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js +9 -2
- package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
- package/dist/data-fetchers/gotdx/gotdx.d.ts +7 -0
- package/dist/data-fetchers/gotdx/gotdx.d.ts.map +1 -0
- package/dist/data-fetchers/gotdx/gotdx.js +7 -0
- package/dist/data-fetchers/gotdx/gotdx.js.map +1 -0
- package/dist/data-fetchers/gotdx.d.ts +0 -8
- package/dist/data-fetchers/gotdx.d.ts.map +1 -1
- package/dist/data-fetchers/gotdx.js +40 -3
- package/dist/data-fetchers/gotdx.js.map +1 -1
- package/dist/data-fetchers/hundred-mock.d.ts +0 -3
- package/dist/data-fetchers/hundred-mock.d.ts.map +1 -1
- package/dist/data-fetchers/hundred-mock.js +0 -1
- package/dist/data-fetchers/hundred-mock.js.map +1 -1
- package/dist/data-fetchers/index.d.ts +10 -8
- package/dist/data-fetchers/index.d.ts.map +1 -1
- package/dist/data-fetchers/index.js +8 -7
- package/dist/data-fetchers/index.js.map +1 -1
- package/dist/data-fetchers/router.d.ts +2 -0
- package/dist/data-fetchers/router.d.ts.map +1 -1
- package/dist/data-fetchers/router.js +8 -1
- package/dist/data-fetchers/router.js.map +1 -1
- package/dist/data-fetchers/thousand-mock.d.ts +0 -3
- package/dist/data-fetchers/thousand-mock.d.ts.map +1 -1
- package/dist/data-fetchers/thousand-mock.js +0 -1
- package/dist/data-fetchers/thousand-mock.js.map +1 -1
- package/dist/data-fetchers/timeShareBuffer.d.ts +27 -0
- package/dist/data-fetchers/timeShareBuffer.d.ts.map +1 -0
- package/dist/data-fetchers/timeShareBuffer.js +79 -0
- package/dist/data-fetchers/timeShareBuffer.js.map +1 -0
- package/dist/data-fetchers/tradingview.d.ts +0 -8
- package/dist/data-fetchers/tradingview.d.ts.map +1 -1
- package/dist/data-fetchers/tradingview.js +1 -2
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/data-fetchers/types.d.ts +9 -1
- package/dist/data-fetchers/types.d.ts.map +1 -1
- package/dist/engine/chart.d.ts +32 -1
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +148 -7
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/chartTypes.d.ts +3 -0
- package/dist/engine/chartTypes.d.ts.map +1 -1
- package/dist/engine/controller/interaction.d.ts +6 -1
- package/dist/engine/controller/interaction.d.ts.map +1 -1
- package/dist/engine/controller/interaction.js +76 -28
- package/dist/engine/controller/interaction.js.map +1 -1
- package/dist/engine/data/chartDataManager.d.ts +39 -14
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +494 -202
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/draw/pixelAlign.d.ts +0 -27
- package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
- package/dist/engine/draw/pixelAlign.js +1 -1
- package/dist/engine/draw/pixelAlign.js.map +1 -1
- package/dist/engine/indicators/calculators.d.ts +0 -104
- package/dist/engine/indicators/calculators.d.ts.map +1 -1
- package/dist/engine/indicators/calculators.js +57 -168
- package/dist/engine/indicators/calculators.js.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.js +3 -2
- package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
- package/dist/engine/indicators/macdState.d.ts +0 -5
- package/dist/engine/indicators/macdState.d.ts.map +1 -1
- package/dist/engine/indicators/macdState.js +1 -1
- package/dist/engine/indicators/macdState.js.map +1 -1
- package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
- package/dist/engine/indicators/registerBuiltins.js +1 -0
- package/dist/engine/indicators/registerBuiltins.js.map +1 -1
- package/dist/engine/indicators/rsiState.d.ts +0 -4
- package/dist/engine/indicators/rsiState.d.ts.map +1 -1
- package/dist/engine/indicators/rsiState.js +1 -1
- package/dist/engine/indicators/rsiState.js.map +1 -1
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +1 -7
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/layout/chartPaneLayout.d.ts +2 -0
- package/dist/engine/layout/chartPaneLayout.d.ts.map +1 -1
- package/dist/engine/layout/chartPaneLayout.js +24 -6
- package/dist/engine/layout/chartPaneLayout.js.map +1 -1
- package/dist/engine/modes/kLineMode.d.ts +37 -0
- package/dist/engine/modes/kLineMode.d.ts.map +1 -0
- package/dist/engine/modes/kLineMode.js +22 -0
- package/dist/engine/modes/kLineMode.js.map +1 -0
- package/dist/engine/modes/timeShareMode.d.ts +37 -0
- package/dist/engine/modes/timeShareMode.d.ts.map +1 -0
- package/dist/engine/modes/timeShareMode.js +59 -0
- package/dist/engine/modes/timeShareMode.js.map +1 -0
- package/dist/engine/modes/types.d.ts +47 -0
- package/dist/engine/modes/types.d.ts.map +1 -0
- package/dist/engine/modes/types.js +2 -0
- package/dist/engine/modes/types.js.map +1 -0
- package/dist/engine/paneRenderer.d.ts +4 -0
- package/dist/engine/paneRenderer.d.ts.map +1 -1
- package/dist/engine/paneRenderer.js +27 -40
- package/dist/engine/paneRenderer.js.map +1 -1
- package/dist/engine/render/chartRenderer.d.ts +4 -23
- package/dist/engine/render/chartRenderer.d.ts.map +1 -1
- package/dist/engine/render/chartRenderer.js +113 -18
- package/dist/engine/render/chartRenderer.js.map +1 -1
- package/dist/engine/renderers/Indicator/atr.d.ts +1 -18
- package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/atr.js +3 -22
- package/dist/engine/renderers/Indicator/atr.js.map +1 -1
- package/dist/engine/renderers/Indicator/boll.d.ts +1 -4
- package/dist/engine/renderers/Indicator/boll.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/boll.js +3 -18
- package/dist/engine/renderers/Indicator/boll.js.map +1 -1
- package/dist/engine/renderers/Indicator/cci.d.ts +1 -22
- package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/cci.js +8 -20
- package/dist/engine/renderers/Indicator/cci.js.map +1 -1
- package/dist/engine/renderers/Indicator/chaikinVol.d.ts +1 -7
- package/dist/engine/renderers/Indicator/chaikinVol.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/chaikinVol.js +3 -16
- package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
- package/dist/engine/renderers/Indicator/cmf.d.ts +1 -7
- package/dist/engine/renderers/Indicator/cmf.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/cmf.js +3 -15
- package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
- package/dist/engine/renderers/Indicator/dema.d.ts +1 -7
- package/dist/engine/renderers/Indicator/dema.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/dema.js +3 -17
- package/dist/engine/renderers/Indicator/dema.js.map +1 -1
- package/dist/engine/renderers/Indicator/donchian.d.ts +1 -8
- package/dist/engine/renderers/Indicator/donchian.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/donchian.js +2 -2
- package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
- package/dist/engine/renderers/Indicator/ene.d.ts +1 -12
- package/dist/engine/renderers/Indicator/ene.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ene.js +3 -18
- package/dist/engine/renderers/Indicator/ene.js.map +1 -1
- package/dist/engine/renderers/Indicator/expma.d.ts +1 -4
- package/dist/engine/renderers/Indicator/expma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/expma.js +2 -2
- package/dist/engine/renderers/Indicator/expma.js.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.d.ts +1 -22
- package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.js +11 -64
- package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
- package/dist/engine/renderers/Indicator/fib.d.ts +1 -6
- package/dist/engine/renderers/Indicator/fib.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/fib.js +2 -2
- package/dist/engine/renderers/Indicator/fib.js.map +1 -1
- package/dist/engine/renderers/Indicator/hma.d.ts +1 -7
- package/dist/engine/renderers/Indicator/hma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/hma.js +3 -17
- package/dist/engine/renderers/Indicator/hma.js.map +1 -1
- package/dist/engine/renderers/Indicator/hv.d.ts +1 -7
- package/dist/engine/renderers/Indicator/hv.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/hv.js +3 -16
- package/dist/engine/renderers/Indicator/hv.js.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.d.ts +1 -8
- package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.js +2 -2
- package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
- package/dist/engine/renderers/Indicator/kama.d.ts +1 -7
- package/dist/engine/renderers/Indicator/kama.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kama.js +3 -17
- package/dist/engine/renderers/Indicator/kama.js.map +1 -1
- package/dist/engine/renderers/Indicator/keltner.d.ts +1 -8
- package/dist/engine/renderers/Indicator/keltner.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/keltner.js +2 -2
- package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
- package/dist/engine/renderers/Indicator/kst.d.ts +1 -22
- package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kst.js +2 -2
- package/dist/engine/renderers/Indicator/kst.js.map +1 -1
- package/dist/engine/renderers/Indicator/ma.d.ts +1 -4
- package/dist/engine/renderers/Indicator/ma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ma.js +1 -1
- package/dist/engine/renderers/Indicator/ma.js.map +1 -1
- package/dist/engine/renderers/Indicator/macd.d.ts +1 -49
- package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/macd.js +2 -12
- package/dist/engine/renderers/Indicator/macd.js.map +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +114 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
- package/dist/engine/renderers/Indicator/mfi.d.ts +1 -7
- package/dist/engine/renderers/Indicator/mfi.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mfi.js +3 -15
- package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
- package/dist/engine/renderers/Indicator/mom.d.ts +1 -22
- package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mom.js +8 -23
- package/dist/engine/renderers/Indicator/mom.js.map +1 -1
- package/dist/engine/renderers/Indicator/obv.d.ts +1 -7
- package/dist/engine/renderers/Indicator/obv.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/obv.js +3 -14
- package/dist/engine/renderers/Indicator/obv.js.map +1 -1
- package/dist/engine/renderers/Indicator/parkinson.d.ts +1 -7
- package/dist/engine/renderers/Indicator/parkinson.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/parkinson.js +3 -16
- package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
- package/dist/engine/renderers/Indicator/pivot.d.ts +1 -6
- package/dist/engine/renderers/Indicator/pivot.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/pivot.js +2 -2
- package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
- package/dist/engine/renderers/Indicator/pvt.d.ts +1 -7
- package/dist/engine/renderers/Indicator/pvt.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/pvt.js +3 -14
- package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
- package/dist/engine/renderers/Indicator/roc.d.ts +1 -8
- package/dist/engine/renderers/Indicator/roc.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/roc.js +3 -15
- package/dist/engine/renderers/Indicator/roc.js.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.d.ts +0 -32
- package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.js +3 -3
- package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
- package/dist/engine/renderers/Indicator/sar.d.ts +1 -8
- package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/sar.js +2 -2
- package/dist/engine/renderers/Indicator/sar.js.map +1 -1
- package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +2 -0
- package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/scale/indicator_scale.js +10 -6
- package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
- package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts +4 -0
- package/dist/engine/renderers/Indicator/shared/dashedLines.d.ts.map +1 -0
- package/dist/engine/renderers/Indicator/shared/dashedLines.js +50 -0
- package/dist/engine/renderers/Indicator/shared/dashedLines.js.map +1 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts +14 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.d.ts.map +1 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.js +25 -0
- package/dist/engine/renderers/Indicator/shared/titleInfo.js.map +1 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.d.ts +5 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.d.ts.map +1 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.js +17 -0
- package/dist/engine/renderers/Indicator/shared/webglBand.js.map +1 -0
- package/dist/engine/renderers/Indicator/stoch.d.ts +1 -22
- package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/stoch.js +5 -46
- package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
- package/dist/engine/renderers/Indicator/structure.d.ts +1 -7
- package/dist/engine/renderers/Indicator/structure.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/structure.js +2 -2
- package/dist/engine/renderers/Indicator/structure.js.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.d.ts +1 -8
- package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.js +2 -2
- package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
- package/dist/engine/renderers/Indicator/tema.d.ts +1 -7
- package/dist/engine/renderers/Indicator/tema.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/tema.js +3 -17
- package/dist/engine/renderers/Indicator/tema.js.map +1 -1
- package/dist/engine/renderers/Indicator/trix.d.ts +1 -8
- package/dist/engine/renderers/Indicator/trix.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/trix.js +2 -2
- package/dist/engine/renderers/Indicator/trix.js.map +1 -1
- package/dist/engine/renderers/Indicator/vma.d.ts +1 -7
- package/dist/engine/renderers/Indicator/vma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/vma.js +3 -15
- package/dist/engine/renderers/Indicator/vma.js.map +1 -1
- package/dist/engine/renderers/Indicator/volumeProfile.d.ts +1 -7
- package/dist/engine/renderers/Indicator/volumeProfile.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/volumeProfile.js +2 -2
- package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
- package/dist/engine/renderers/Indicator/vwap.d.ts +1 -7
- package/dist/engine/renderers/Indicator/vwap.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/vwap.js +3 -14
- package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
- package/dist/engine/renderers/Indicator/wma.d.ts +1 -7
- package/dist/engine/renderers/Indicator/wma.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/wma.js +3 -17
- package/dist/engine/renderers/Indicator/wma.js.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -22
- package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.js +8 -23
- package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
- package/dist/engine/renderers/Indicator/zones.d.ts +1 -6
- package/dist/engine/renderers/Indicator/zones.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/zones.js +2 -2
- package/dist/engine/renderers/Indicator/zones.js.map +1 -1
- package/dist/engine/renderers/candle.d.ts +0 -16
- package/dist/engine/renderers/candle.d.ts.map +1 -1
- package/dist/engine/renderers/candle.js +1 -1
- package/dist/engine/renderers/candle.js.map +1 -1
- package/dist/engine/renderers/comparisonLine.d.ts.map +1 -1
- package/dist/engine/renderers/comparisonLine.js +2 -0
- package/dist/engine/renderers/comparisonLine.js.map +1 -1
- package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
- package/dist/engine/renderers/extremaMarkers.js +2 -0
- package/dist/engine/renderers/extremaMarkers.js.map +1 -1
- package/dist/engine/renderers/gridLines.d.ts.map +1 -1
- package/dist/engine/renderers/gridLines.js +7 -35
- package/dist/engine/renderers/gridLines.js.map +1 -1
- package/dist/engine/renderers/lastPrice.d.ts.map +1 -1
- package/dist/engine/renderers/lastPrice.js +7 -2
- package/dist/engine/renderers/lastPrice.js.map +1 -1
- package/dist/engine/renderers/leftYAxis.d.ts +11 -0
- package/dist/engine/renderers/leftYAxis.d.ts.map +1 -0
- package/dist/engine/renderers/leftYAxis.js +79 -0
- package/dist/engine/renderers/leftYAxis.js.map +1 -0
- package/dist/engine/renderers/subVolume.d.ts +1 -13
- package/dist/engine/renderers/subVolume.d.ts.map +1 -1
- package/dist/engine/renderers/subVolume.js +1 -1
- package/dist/engine/renderers/subVolume.js.map +1 -1
- package/dist/engine/renderers/timeAxis.d.ts +0 -2
- package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
- package/dist/engine/renderers/timeAxis.js +4 -1
- package/dist/engine/renderers/timeAxis.js.map +1 -1
- package/dist/engine/renderers/timeShare.d.ts +3 -0
- package/dist/engine/renderers/timeShare.d.ts.map +1 -0
- package/dist/engine/renderers/timeShare.js +260 -0
- package/dist/engine/renderers/timeShare.js.map +1 -0
- package/dist/engine/renderers/yAxis.d.ts.map +1 -1
- package/dist/engine/renderers/yAxis.js +25 -23
- package/dist/engine/renderers/yAxis.js.map +1 -1
- package/dist/engine/scale/price.d.ts +0 -7
- package/dist/engine/scale/price.d.ts.map +1 -1
- package/dist/engine/scale/price.js +3 -2
- package/dist/engine/scale/price.js.map +1 -1
- package/dist/engine/theme/fonts.d.ts +0 -2
- package/dist/engine/theme/fonts.d.ts.map +1 -1
- package/dist/engine/theme/fonts.js +1 -1
- package/dist/engine/theme/fonts.js.map +1 -1
- package/dist/engine/utils/klineConfig.d.ts.map +1 -1
- package/dist/engine/utils/klineConfig.js +1 -5
- package/dist/engine/utils/klineConfig.js.map +1 -1
- package/dist/engine/utils/tickPosition.d.ts +12 -0
- package/dist/engine/utils/tickPosition.d.ts.map +1 -1
- package/dist/engine/utils/tickPosition.js +15 -0
- package/dist/engine/utils/tickPosition.js.map +1 -1
- package/dist/engine/viewport/chartViewportManager.d.ts +0 -4
- package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
- package/dist/engine/viewport/chartViewportManager.js +10 -13
- package/dist/engine/viewport/chartViewportManager.js.map +1 -1
- package/dist/plugin/types.d.ts +10 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/types.js.map +1 -1
- package/dist/semantic/types.d.ts +1 -1
- package/dist/semantic/types.d.ts.map +1 -1
- package/dist/tokens/theme-base.d.ts +5 -0
- package/dist/tokens/theme-base.d.ts.map +1 -0
- package/dist/tokens/theme-base.js +31 -0
- package/dist/tokens/theme-base.js.map +1 -0
- package/dist/tokens/theme-china.d.ts.map +1 -1
- package/dist/tokens/theme-china.js +3 -0
- package/dist/tokens/theme-china.js.map +1 -1
- package/dist/tokens/theme-dark.d.ts.map +1 -1
- package/dist/tokens/theme-dark.js +11 -30
- package/dist/tokens/theme-dark.js.map +1 -1
- package/dist/tokens/theme-light.d.ts.map +1 -1
- package/dist/tokens/theme-light.js +11 -30
- package/dist/tokens/theme-light.js.map +1 -1
- package/dist/tokens/types.d.ts +7 -0
- package/dist/tokens/types.d.ts.map +1 -1
- package/dist/types/price.d.ts +8 -0
- package/dist/types/price.d.ts.map +1 -1
- package/dist/types/price.js +4 -0
- package/dist/types/price.js.map +1 -1
- package/dist/utils/dateFormat.d.ts +5 -42
- package/dist/utils/dateFormat.d.ts.map +1 -1
- package/dist/utils/dateFormat.js +24 -4
- package/dist/utils/dateFormat.js.map +1 -1
- package/dist/utils/kLineDraw/axis.d.ts +9 -28
- package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
- package/dist/utils/kLineDraw/axis.js +33 -58
- package/dist/utils/kLineDraw/axis.js.map +1 -1
- package/dist/utils/volumePrice.d.ts +0 -40
- package/dist/utils/volumePrice.d.ts.map +1 -1
- package/dist/utils/volumePrice.js +2 -2
- package/dist/utils/volumePrice.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/config/chartSettings.ts +8 -1
- package/src/controllers/createChartController.ts +59 -2
- package/src/controllers/types.ts +38 -17
- package/src/data-fetchers/__tests__/dataBuffer.test.ts +39 -5
- package/src/data-fetchers/baostock.ts +1 -1
- package/src/data-fetchers/dataBuffer.ts +48 -11
- package/src/data-fetchers/dataBufferTypes.ts +11 -0
- package/src/data-fetchers/fetcherDefinitionRegistry.ts +14 -4
- package/src/data-fetchers/gotdx/gotdx.ts +6 -0
- package/src/data-fetchers/gotdx.ts +45 -7
- package/src/data-fetchers/hundred-mock.ts +1 -1
- package/src/data-fetchers/index.ts +10 -20
- package/src/data-fetchers/router.ts +12 -1
- package/src/data-fetchers/thousand-mock.ts +1 -1
- package/src/data-fetchers/timeShareBuffer.ts +92 -0
- package/src/data-fetchers/tradingview.ts +2 -2
- package/src/data-fetchers/types.ts +15 -2
- package/src/engine/__tests__/chart.dpr.test.ts +1 -0
- package/src/engine/chart.ts +167 -9
- package/src/engine/chartTypes.ts +3 -0
- package/src/engine/controller/__tests__/interaction.dpr.test.ts +2 -0
- package/src/engine/controller/interaction.ts +80 -28
- package/src/engine/data/chartDataManager.ts +560 -229
- package/src/engine/draw/pixelAlign.ts +1 -1
- package/src/engine/indicators/__tests__/_propertyAssertions.ts +2 -2
- package/src/engine/indicators/__tests__/registerBuiltins.test.ts +1 -1
- package/src/engine/indicators/calculators.ts +83 -233
- package/src/engine/indicators/chartIndicatorManager.ts +3 -2
- package/src/engine/indicators/macdState.ts +1 -1
- package/src/engine/indicators/registerBuiltins.ts +1 -0
- package/src/engine/indicators/rsiState.ts +1 -1
- package/src/engine/indicators/scheduler.ts +1 -7
- package/src/engine/layout/chartPaneLayout.ts +26 -6
- package/src/engine/modes/kLineMode.ts +57 -0
- package/src/engine/modes/timeShareMode.ts +95 -0
- package/src/engine/modes/types.ts +63 -0
- package/src/engine/paneRenderer.ts +37 -46
- package/src/engine/render/chartRenderer.ts +120 -22
- package/src/engine/renderers/Indicator/atr.ts +4 -29
- package/src/engine/renderers/Indicator/boll.ts +3 -24
- package/src/engine/renderers/Indicator/cci.ts +9 -27
- package/src/engine/renderers/Indicator/chaikinVol.ts +3 -23
- package/src/engine/renderers/Indicator/cmf.ts +3 -22
- package/src/engine/renderers/Indicator/dema.ts +5 -26
- package/src/engine/renderers/Indicator/donchian.ts +3 -3
- package/src/engine/renderers/Indicator/ene.ts +3 -24
- package/src/engine/renderers/Indicator/expma.ts +2 -2
- package/src/engine/renderers/Indicator/fastk.ts +12 -95
- package/src/engine/renderers/Indicator/fib.ts +2 -2
- package/src/engine/renderers/Indicator/hma.ts +5 -26
- package/src/engine/renderers/Indicator/hv.ts +3 -23
- package/src/engine/renderers/Indicator/ichimoku.ts +3 -3
- package/src/engine/renderers/Indicator/kama.ts +5 -26
- package/src/engine/renderers/Indicator/keltner.ts +3 -3
- package/src/engine/renderers/Indicator/kst.ts +3 -3
- package/src/engine/renderers/Indicator/ma.ts +1 -1
- package/src/engine/renderers/Indicator/macd.ts +4 -21
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +127 -2
- package/src/engine/renderers/Indicator/mfi.ts +3 -22
- package/src/engine/renderers/Indicator/mom.ts +9 -30
- package/src/engine/renderers/Indicator/obv.ts +3 -21
- package/src/engine/renderers/Indicator/parkinson.ts +3 -23
- package/src/engine/renderers/Indicator/pivot.ts +2 -2
- package/src/engine/renderers/Indicator/pvt.ts +3 -21
- package/src/engine/renderers/Indicator/roc.ts +4 -23
- package/src/engine/renderers/Indicator/rsi.ts +4 -4
- package/src/engine/renderers/Indicator/sar.ts +3 -3
- package/src/engine/renderers/Indicator/scale/indicator_scale.ts +11 -4
- package/src/engine/renderers/Indicator/shared/dashedLines.ts +81 -0
- package/src/engine/renderers/Indicator/shared/titleInfo.ts +52 -0
- package/src/engine/renderers/Indicator/shared/webglBand.ts +23 -0
- package/src/engine/renderers/Indicator/stoch.ts +6 -71
- package/src/engine/renderers/Indicator/structure.ts +2 -2
- package/src/engine/renderers/Indicator/supertrend.ts +3 -3
- package/src/engine/renderers/Indicator/tema.ts +5 -26
- package/src/engine/renderers/Indicator/trix.ts +3 -3
- package/src/engine/renderers/Indicator/vma.ts +3 -22
- package/src/engine/renderers/Indicator/volumeProfile.ts +2 -2
- package/src/engine/renderers/Indicator/vwap.ts +3 -21
- package/src/engine/renderers/Indicator/wma.ts +5 -26
- package/src/engine/renderers/Indicator/wmsr.ts +9 -30
- package/src/engine/renderers/Indicator/zones.ts +2 -2
- package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +30 -26
- package/src/engine/renderers/candle.ts +1 -1
- package/src/engine/renderers/comparisonLine.ts +1 -0
- package/src/engine/renderers/extremaMarkers.ts +1 -0
- package/src/engine/renderers/gridLines.ts +7 -36
- package/src/engine/renderers/lastPrice.ts +5 -2
- package/src/engine/renderers/leftYAxis.ts +93 -0
- package/src/engine/renderers/subVolume.ts +3 -3
- package/src/engine/renderers/timeAxis.ts +16 -13
- package/src/engine/renderers/timeShare.ts +271 -0
- package/src/engine/renderers/yAxis.ts +28 -24
- package/src/engine/scale/price.ts +2 -2
- package/src/engine/theme/fonts.ts +1 -1
- package/src/engine/utils/klineConfig.ts +1 -5
- package/src/engine/utils/tickPosition.ts +34 -0
- package/src/engine/viewport/chartViewportManager.ts +11 -15
- package/src/plugin/types.ts +11 -0
- package/src/semantic/types.ts +1 -1
- package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +14 -0
- package/src/tokens/theme-base.ts +36 -0
- package/src/tokens/theme-china.ts +4 -0
- package/src/tokens/theme-dark.ts +12 -32
- package/src/tokens/theme-light.ts +13 -33
- package/src/tokens/types.ts +9 -0
- package/src/types/price.ts +13 -0
- package/src/utils/dateFormat.ts +27 -4
- package/src/utils/kLineDraw/axis.ts +40 -107
- package/src/utils/volumePrice.ts +2 -2
- package/src/version.ts +1 -1
|
@@ -29,6 +29,7 @@ import type {
|
|
|
29
29
|
PaneSpec,
|
|
30
30
|
SymbolSpec,
|
|
31
31
|
DataFetcher,
|
|
32
|
+
CustomDataSource,
|
|
32
33
|
} from './types'
|
|
33
34
|
import type { CustomMarkerEntity } from '../engine/marker/registry'
|
|
34
35
|
import { Chart, type InteractionSnapshot as LegacyInteractionSnapshot } from '../engine/chart'
|
|
@@ -60,6 +61,7 @@ const DEFAULT_OPTS = {
|
|
|
60
61
|
minKWidth: 1,
|
|
61
62
|
maxKWidth: 50,
|
|
62
63
|
rightAxisWidth: 0,
|
|
64
|
+
leftAxisWidth: 0,
|
|
63
65
|
bottomAxisHeight: 24,
|
|
64
66
|
priceLabelWidth: 60,
|
|
65
67
|
zoomLevels: 20,
|
|
@@ -119,6 +121,7 @@ interface MountedDom {
|
|
|
119
121
|
scrollContent?: HTMLDivElement
|
|
120
122
|
canvasLayer: HTMLDivElement
|
|
121
123
|
rightAxisLayer: HTMLDivElement
|
|
124
|
+
leftAxisLayer?: HTMLDivElement
|
|
122
125
|
xAxisCanvas: HTMLCanvasElement
|
|
123
126
|
cleanup: () => void
|
|
124
127
|
}
|
|
@@ -264,10 +267,18 @@ function buildDom(container: HTMLElement): MountedDom {
|
|
|
264
267
|
rightAxisLayer.style.right = '0'
|
|
265
268
|
chartContainer.appendChild(rightAxisLayer)
|
|
266
269
|
|
|
270
|
+
const leftAxisLayer = ownerDoc.createElement('div')
|
|
271
|
+
leftAxisLayer.className = 'klc-left-axis-host'
|
|
272
|
+
leftAxisLayer.style.position = 'absolute'
|
|
273
|
+
leftAxisLayer.style.top = '0'
|
|
274
|
+
leftAxisLayer.style.left = '0'
|
|
275
|
+
chartContainer.appendChild(leftAxisLayer)
|
|
276
|
+
|
|
267
277
|
const cleanup = (): void => {
|
|
268
278
|
try {
|
|
269
279
|
scrollContent.remove()
|
|
270
280
|
rightAxisLayer.remove()
|
|
281
|
+
leftAxisLayer.remove()
|
|
271
282
|
if (containerCreatedByUs) {
|
|
272
283
|
chartContainer.remove()
|
|
273
284
|
}
|
|
@@ -276,7 +287,7 @@ function buildDom(container: HTMLElement): MountedDom {
|
|
|
276
287
|
}
|
|
277
288
|
}
|
|
278
289
|
|
|
279
|
-
return { container: chartContainer, scrollContent, canvasLayer, rightAxisLayer, xAxisCanvas, cleanup }
|
|
290
|
+
return { container: chartContainer, scrollContent, canvasLayer, rightAxisLayer, leftAxisLayer, xAxisCanvas, cleanup }
|
|
280
291
|
}
|
|
281
292
|
|
|
282
293
|
// ---------------------------------------------------------------------------
|
|
@@ -297,8 +308,10 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
297
308
|
const mounted = hasExistingDom
|
|
298
309
|
? {
|
|
299
310
|
container: opts.container as HTMLDivElement,
|
|
311
|
+
scrollContent: (opts.container as HTMLDivElement).querySelector<HTMLDivElement>('.scroll-content') ?? undefined,
|
|
300
312
|
canvasLayer: opts.canvasLayer as HTMLDivElement,
|
|
301
313
|
rightAxisLayer: opts.rightAxisLayer as HTMLDivElement,
|
|
314
|
+
leftAxisLayer: opts.leftAxisLayer as HTMLDivElement | undefined,
|
|
302
315
|
xAxisCanvas: opts.xAxisCanvas!,
|
|
303
316
|
cleanup: () => { /* DOM owned by caller */ },
|
|
304
317
|
}
|
|
@@ -310,6 +323,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
310
323
|
const chartOptions: ChartOptions = {
|
|
311
324
|
yPaddingPx: opts.yPaddingPx ?? DEFAULT_OPTS.yPaddingPx,
|
|
312
325
|
rightAxisWidth: opts.rightAxisWidth ?? DEFAULT_OPTS.rightAxisWidth,
|
|
326
|
+
leftAxisWidth: opts.leftAxisWidth ?? DEFAULT_OPTS.leftAxisWidth,
|
|
313
327
|
bottomAxisHeight: opts.bottomAxisHeight ?? DEFAULT_OPTS.bottomAxisHeight,
|
|
314
328
|
minKWidth: opts.minKWidth ?? DEFAULT_OPTS.minKWidth,
|
|
315
329
|
maxKWidth: opts.maxKWidth ?? DEFAULT_OPTS.maxKWidth,
|
|
@@ -326,6 +340,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
326
340
|
scrollContent: mounted.scrollContent,
|
|
327
341
|
canvasLayer: mounted.canvasLayer,
|
|
328
342
|
rightAxisLayer: mounted.rightAxisLayer,
|
|
343
|
+
leftAxisLayer: mounted.leftAxisLayer,
|
|
329
344
|
xAxisCanvas: mounted.xAxisCanvas,
|
|
330
345
|
},
|
|
331
346
|
chartOptions,
|
|
@@ -428,7 +443,7 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
428
443
|
|
|
429
444
|
// dataLoading
|
|
430
445
|
unsubs.push(
|
|
431
|
-
chart.
|
|
446
|
+
chart.loading.subscribe(() => dataLoading.set(chart.loading.peek())),
|
|
432
447
|
)
|
|
433
448
|
|
|
434
449
|
// theme
|
|
@@ -530,6 +545,31 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
530
545
|
chart.removeComparisonSymbol(symbol)
|
|
531
546
|
}
|
|
532
547
|
|
|
548
|
+
function setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void {
|
|
549
|
+
if (disposed) return
|
|
550
|
+
chart.setComparisonData(symbol, [...data])
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
function setCurrentSymbol(symbol: string): void {
|
|
554
|
+
if (disposed) return
|
|
555
|
+
chart.setCurrentSymbol(symbol)
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
function setCurrentPeriod(period: string): void {
|
|
559
|
+
if (disposed) return
|
|
560
|
+
chart.setCurrentPeriod(period)
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
function switchToTimeShareForDate(dateYYYYMMDD: number): void {
|
|
564
|
+
if (disposed) return
|
|
565
|
+
chart.switchToTimeShareForDate(dateYYYYMMDD)
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
function applyCustomData(source: CustomDataSource): void {
|
|
569
|
+
if (disposed) return
|
|
570
|
+
chart.applyCustomData(source)
|
|
571
|
+
}
|
|
572
|
+
|
|
533
573
|
function setDataFetcher(fetcher: DataFetcher | null): void {
|
|
534
574
|
if (disposed) return
|
|
535
575
|
chart.setDataFetcher(fetcher)
|
|
@@ -645,6 +685,11 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
645
685
|
return chart.getContentWidth()
|
|
646
686
|
}
|
|
647
687
|
|
|
688
|
+
function getLeftLoadBufferWidth(): number {
|
|
689
|
+
if (disposed) return 0
|
|
690
|
+
return chart.getLeftLoadBufferWidth()
|
|
691
|
+
}
|
|
692
|
+
|
|
648
693
|
function scrollToRight(): void {
|
|
649
694
|
if (disposed) return
|
|
650
695
|
chart.scrollToRight()
|
|
@@ -679,6 +724,11 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
679
724
|
chart.setDrawings(drawings)
|
|
680
725
|
}
|
|
681
726
|
|
|
727
|
+
function getFullDrawings(): any[] {
|
|
728
|
+
if (disposed) return []
|
|
729
|
+
return chart.drawings() as any[]
|
|
730
|
+
}
|
|
731
|
+
|
|
682
732
|
function setSelectedDrawingId(id: string | null): void {
|
|
683
733
|
if (disposed) return
|
|
684
734
|
chart.setSelectedDrawingId(id)
|
|
@@ -859,6 +909,11 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
859
909
|
setSymbols,
|
|
860
910
|
addComparisonSymbol,
|
|
861
911
|
removeComparisonSymbol,
|
|
912
|
+
setComparisonData,
|
|
913
|
+
setCurrentSymbol,
|
|
914
|
+
setCurrentPeriod,
|
|
915
|
+
switchToTimeShareForDate,
|
|
916
|
+
applyCustomData,
|
|
862
917
|
setDataFetcher,
|
|
863
918
|
ensureDataRange,
|
|
864
919
|
setData,
|
|
@@ -882,11 +937,13 @@ export async function createChartController(opts: ChartMountOptions): Promise<Ch
|
|
|
882
937
|
setTooltipAnchorPositioning,
|
|
883
938
|
getIndicatorTitle,
|
|
884
939
|
getContentWidth,
|
|
940
|
+
getLeftLoadBufferWidth,
|
|
885
941
|
scrollToRight,
|
|
886
942
|
setDrawingTool,
|
|
887
943
|
clearDrawings,
|
|
888
944
|
removeDrawing,
|
|
889
945
|
setDrawings,
|
|
946
|
+
getFullDrawings,
|
|
890
947
|
setSelectedDrawingId,
|
|
891
948
|
getViewport,
|
|
892
949
|
getKWidthKGap,
|
package/src/controllers/types.ts
CHANGED
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type { Signal } from '../reactivity'
|
|
12
|
-
import type { CustomMarkerEntity
|
|
12
|
+
import type { CustomMarkerEntity } from '../engine/marker/registry'
|
|
13
13
|
import type { PaneSpec } from '../engine/chartTypes'
|
|
14
|
+
import type { InteractionSnapshot } from '../engine/chart'
|
|
14
15
|
|
|
15
16
|
// Controller-owned public surface. Legacy engine types may mirror these
|
|
16
17
|
// shapes internally, but adapters depend only on core-defined contracts.
|
|
@@ -74,6 +75,14 @@ export interface KLineData {
|
|
|
74
75
|
date?: string
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
export interface TimeShareData {
|
|
79
|
+
timestamp: number
|
|
80
|
+
price: number
|
|
81
|
+
average: number
|
|
82
|
+
volume: number
|
|
83
|
+
amount: number
|
|
84
|
+
}
|
|
85
|
+
|
|
77
86
|
export type { PaneSpec }
|
|
78
87
|
|
|
79
88
|
// ---------------------------------------------------------------------------
|
|
@@ -102,6 +111,17 @@ export type DataFetcher = (
|
|
|
102
111
|
},
|
|
103
112
|
) => Promise<ReadonlyArray<KLineData>>
|
|
104
113
|
|
|
114
|
+
/** User-provided K-line data bundle — bypasses the fetcher pipeline entirely */
|
|
115
|
+
export interface CustomDataSource {
|
|
116
|
+
symbol?: string
|
|
117
|
+
period?: string
|
|
118
|
+
adjust?: string
|
|
119
|
+
/** Main chart K-line data (required) */
|
|
120
|
+
data: ReadonlyArray<KLineData>
|
|
121
|
+
/** Comparison products keyed by symbol */
|
|
122
|
+
comparisons?: Record<string, ReadonlyArray<KLineData>>
|
|
123
|
+
}
|
|
124
|
+
|
|
105
125
|
// ---------------------------------------------------------------------------
|
|
106
126
|
// Indicator metadata
|
|
107
127
|
// ---------------------------------------------------------------------------
|
|
@@ -130,22 +150,7 @@ export interface IndicatorDefinition {
|
|
|
130
150
|
// Interaction state
|
|
131
151
|
// ---------------------------------------------------------------------------
|
|
132
152
|
|
|
133
|
-
export
|
|
134
|
-
crosshairPos: { x: number; y: number } | null
|
|
135
|
-
crosshairIndex: number | null
|
|
136
|
-
crosshairPrice: number | null
|
|
137
|
-
hoveredIndex: number | null
|
|
138
|
-
activePaneId: string | null
|
|
139
|
-
tooltipPos: { x: number; y: number }
|
|
140
|
-
tooltipAnchorPlacement: 'right-bottom' | 'left-bottom'
|
|
141
|
-
hoveredMarkerData: MarkerEntity | null
|
|
142
|
-
hoveredCustomMarker: CustomMarkerEntity | null
|
|
143
|
-
isDragging: boolean
|
|
144
|
-
isResizingPaneBoundary: boolean
|
|
145
|
-
isHoveringPaneBoundary: boolean
|
|
146
|
-
hoveredPaneBoundaryId: string | null
|
|
147
|
-
isHoveringRightAxis: boolean
|
|
148
|
-
}
|
|
153
|
+
export type { InteractionSnapshot }
|
|
149
154
|
|
|
150
155
|
// ---------------------------------------------------------------------------
|
|
151
156
|
// Pane info (read-only pane metadata for DrawingChartAdapter)
|
|
@@ -170,6 +175,8 @@ export interface DrawingChartViewport {
|
|
|
170
175
|
export interface DrawingChartAdapter {
|
|
171
176
|
/** persist full drawing list to the chart engine */
|
|
172
177
|
setDrawings(drawings: any[]): void
|
|
178
|
+
/** read the full drawing list (plugin-level DrawingObject) */
|
|
179
|
+
getFullDrawings(): any[]
|
|
173
180
|
/** highlight a drawing by ID */
|
|
174
181
|
setSelectedDrawingId(id: string | null): void
|
|
175
182
|
/** current viewport (nullable if chart not ready) */
|
|
@@ -218,11 +225,13 @@ export interface ChartMountOptions {
|
|
|
218
225
|
// Pre-existing DOM elements (skip buildDom when provided)
|
|
219
226
|
canvasLayer?: HTMLElement
|
|
220
227
|
rightAxisLayer?: HTMLElement
|
|
228
|
+
leftAxisLayer?: HTMLElement
|
|
221
229
|
xAxisCanvas?: HTMLCanvasElement
|
|
222
230
|
|
|
223
231
|
// Chart options overrides
|
|
224
232
|
yPaddingPx?: number
|
|
225
233
|
rightAxisWidth?: number
|
|
234
|
+
leftAxisWidth?: number
|
|
226
235
|
bottomAxisHeight?: number
|
|
227
236
|
priceLabelWidth?: number
|
|
228
237
|
minKWidth?: number
|
|
@@ -262,6 +271,16 @@ export interface ChartController extends DrawingChartAdapter {
|
|
|
262
271
|
setSymbols(next: ReadonlyArray<SymbolSpec>): void
|
|
263
272
|
addComparisonSymbol(spec: SymbolSpec): void
|
|
264
273
|
removeComparisonSymbol(symbol: string): void
|
|
274
|
+
/** Inject comparison product data directly (bypasses fetcher) */
|
|
275
|
+
setComparisonData(symbol: string, data: ReadonlyArray<KLineData>): void
|
|
276
|
+
/** Update the main symbol code without triggering a fetch */
|
|
277
|
+
setCurrentSymbol(symbol: string): void
|
|
278
|
+
/** Update the K-line period without triggering a fetch */
|
|
279
|
+
setCurrentPeriod(period: string): void
|
|
280
|
+
/** Switch to time-share view for a specific date (YYYYMMDD), e.g. after double-clicking a daily bar */
|
|
281
|
+
switchToTimeShareForDate(dateYYYYMMDD: number): void
|
|
282
|
+
/** Inject a complete custom data bundle (bypasses fetcher pipeline) */
|
|
283
|
+
applyCustomData(source: CustomDataSource): void
|
|
265
284
|
setDataFetcher(fetcher: DataFetcher | null): void
|
|
266
285
|
setData(next: ReadonlyArray<KLineData>): void
|
|
267
286
|
appendData(next: ReadonlyArray<KLineData>): void
|
|
@@ -319,6 +338,8 @@ export interface ChartController extends DrawingChartAdapter {
|
|
|
319
338
|
getIndicatorTitle(instanceId: string): string | undefined
|
|
320
339
|
/** total scrollable content width (replaces direct computeContentWidth imports) */
|
|
321
340
|
getContentWidth(): number
|
|
341
|
+
/** left buffer width (viewport width) for pixel offset calculations */
|
|
342
|
+
getLeftLoadBufferWidth(): number
|
|
322
343
|
/** scroll to the rightmost position (latest data) */
|
|
323
344
|
scrollToRight(): void
|
|
324
345
|
|
|
@@ -199,6 +199,38 @@ describe('DataBuffer', () => {
|
|
|
199
199
|
expect(fetchCount).toBeGreaterThanOrEqual(2)
|
|
200
200
|
})
|
|
201
201
|
|
|
202
|
+
it('deduplicates same-boundary ensureRange calls while request is pending', async () => {
|
|
203
|
+
const now = Date.now()
|
|
204
|
+
const oneYearAgo = now - 365 * MS_PER_DAY
|
|
205
|
+
|
|
206
|
+
const initialData = [makeKLine(oneYearAgo), makeKLine(now)]
|
|
207
|
+
let fetchCount = 0
|
|
208
|
+
const fetcher: DataFetcher = async () => {
|
|
209
|
+
fetchCount++
|
|
210
|
+
await new Promise((r) => setTimeout(r, 10))
|
|
211
|
+
if (fetchCount === 1) return initialData
|
|
212
|
+
return [makeKLine(oneYearAgo - 90 * MS_PER_DAY)]
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
buffer.setFetcher(fetcher)
|
|
216
|
+
buffer.setSymbol(defaultSpec)
|
|
217
|
+
|
|
218
|
+
await vi.waitFor(() => {
|
|
219
|
+
expect(buffer.loading()).toBe(false)
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
buffer.ensureRange(oneYearAgo - 30 * MS_PER_DAY, oneYearAgo)
|
|
223
|
+
buffer.ensureRange(oneYearAgo - 60 * MS_PER_DAY, oneYearAgo)
|
|
224
|
+
|
|
225
|
+
expect(fetchCount).toBe(2)
|
|
226
|
+
|
|
227
|
+
await vi.waitFor(() => {
|
|
228
|
+
expect(buffer.loading()).toBe(false)
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
expect(fetchCount).toBe(2)
|
|
232
|
+
})
|
|
233
|
+
|
|
202
234
|
it('dispose prevents further fetches', async () => {
|
|
203
235
|
const fetcher: DataFetcher = async () => {
|
|
204
236
|
return [makeKLine(Date.now())]
|
|
@@ -285,7 +317,7 @@ describe('DataBuffer', () => {
|
|
|
285
317
|
expect(prependCalls).toHaveLength(0)
|
|
286
318
|
})
|
|
287
319
|
|
|
288
|
-
it('ensureRange
|
|
320
|
+
it('ensureRange allows retry when previous fetch did not advance earliestTs', async () => {
|
|
289
321
|
const now = Date.now()
|
|
290
322
|
const oneYearAgo = now - 365 * MS_PER_DAY
|
|
291
323
|
const initialData = [makeKLine(oneYearAgo), makeKLine(now)]
|
|
@@ -295,7 +327,7 @@ describe('DataBuffer', () => {
|
|
|
295
327
|
fetchCount++
|
|
296
328
|
if (fetchCount === 1) return initialData
|
|
297
329
|
// Return data with same timestamps so mergeSortedData deduplicates them,
|
|
298
|
-
// avoiding loadedWindow change
|
|
330
|
+
// avoiding loadedWindow change. The boundary should remain retryable.
|
|
299
331
|
return initialData
|
|
300
332
|
}
|
|
301
333
|
|
|
@@ -316,12 +348,14 @@ describe('DataBuffer', () => {
|
|
|
316
348
|
|
|
317
349
|
expect(fetchCount).toBe(2)
|
|
318
350
|
|
|
319
|
-
//
|
|
351
|
+
// Same boundary but the previous fetch did not prepend data, so retry.
|
|
320
352
|
buffer.ensureRange(oneYearAgo - 60 * MS_PER_DAY, oneYearAgo)
|
|
321
353
|
|
|
322
|
-
await
|
|
354
|
+
await vi.waitFor(() => {
|
|
355
|
+
expect(buffer.loading()).toBe(false)
|
|
356
|
+
})
|
|
323
357
|
|
|
324
|
-
expect(fetchCount).toBe(
|
|
358
|
+
expect(fetchCount).toBe(3)
|
|
325
359
|
})
|
|
326
360
|
|
|
327
361
|
it('ensureRange allows retry when earliestTs moves after successful load', async () => {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createSignal, type Signal } from '../reactivity/signal'
|
|
2
2
|
import type { DataFetcher, KLineData, SymbolSpec } from '../controllers/types'
|
|
3
|
+
import type { DataBufferLike } from './dataBufferTypes'
|
|
3
4
|
|
|
4
5
|
export interface DataWindow {
|
|
5
6
|
earliestTs: number
|
|
@@ -35,7 +36,7 @@ function mergeSortedData(
|
|
|
35
36
|
return merged
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
export class DataBuffer {
|
|
39
|
+
export class DataBuffer implements DataBufferLike {
|
|
39
40
|
private _data: KLineData[] = []
|
|
40
41
|
private _dataSignal: Signal<ReadonlyArray<KLineData>>
|
|
41
42
|
private _loadingSignal: Signal<boolean>
|
|
@@ -54,8 +55,8 @@ export class DataBuffer {
|
|
|
54
55
|
this._loadingSignal = createSignal<boolean>(false)
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
get data(): Signal<ReadonlyArray<
|
|
58
|
-
return this._dataSignal
|
|
58
|
+
get data(): Signal<ReadonlyArray<unknown>> {
|
|
59
|
+
return this._dataSignal as Signal<ReadonlyArray<unknown>>
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
get loading(): Signal<boolean> {
|
|
@@ -70,6 +71,10 @@ export class DataBuffer {
|
|
|
70
71
|
return this._loadedWindow
|
|
71
72
|
}
|
|
72
73
|
|
|
74
|
+
getRawData(): KLineData[] {
|
|
75
|
+
return this._data
|
|
76
|
+
}
|
|
77
|
+
|
|
73
78
|
setFetcher(fetcher: DataFetcher | null): void {
|
|
74
79
|
this._fetcher = fetcher
|
|
75
80
|
}
|
|
@@ -159,17 +164,22 @@ export class DataBuffer {
|
|
|
159
164
|
const oldLength = this._data.length
|
|
160
165
|
const oldEarliestTs = oldLength > 0 ? this._data[0]!.timestamp : null
|
|
161
166
|
const merged = mergeSortedData(this._data, [...incoming])
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
const newEarliestTs = merged[0]?.timestamp ?? null
|
|
168
|
+
const advancedEarliest = oldEarliestTs !== null
|
|
169
|
+
&& newEarliestTs !== null
|
|
170
|
+
&& newEarliestTs < oldEarliestTs
|
|
171
|
+
|
|
172
|
+
if (oldLength > 0 && merged.length > oldLength && advancedEarliest) {
|
|
173
|
+
const prependCount = merged.findIndex((d) => d.timestamp === oldEarliestTs)
|
|
174
|
+
if (prependCount > 0) {
|
|
175
|
+
this.onPrepend?.(prependCount)
|
|
170
176
|
}
|
|
171
177
|
}
|
|
172
178
|
|
|
179
|
+
if (oldLength > 0 && !advancedEarliest) {
|
|
180
|
+
this._attemptedBoundaries.delete(endTs)
|
|
181
|
+
}
|
|
182
|
+
|
|
173
183
|
this._data = merged
|
|
174
184
|
this._dataSignal.set([...merged])
|
|
175
185
|
|
|
@@ -217,6 +227,33 @@ export class DataBuffer {
|
|
|
217
227
|
})
|
|
218
228
|
}
|
|
219
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Put the buffer in inline mode — use the provided data directly
|
|
232
|
+
* instead of fetching. Sets data signal and tracks loadedWindow.
|
|
233
|
+
*/
|
|
234
|
+
setInlineData(data: unknown[]): void {
|
|
235
|
+
if (this._disposed) return
|
|
236
|
+
const kData = data as KLineData[]
|
|
237
|
+
this._data = [...kData]
|
|
238
|
+
this._dataSignal.set([...kData])
|
|
239
|
+
if (data.length > 0) {
|
|
240
|
+
this._loadedWindow = {
|
|
241
|
+
earliestTs: kData[0]!.timestamp,
|
|
242
|
+
latestTs: kData[kData.length - 1]!.timestamp,
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
this._loadedWindow = null
|
|
246
|
+
}
|
|
247
|
+
this._attemptedBoundaries.clear()
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Update just the spec metadata without triggering any fetch.
|
|
252
|
+
*/
|
|
253
|
+
setCurrentSpec(spec: SymbolSpec): void {
|
|
254
|
+
this._currentSpec = spec
|
|
255
|
+
}
|
|
256
|
+
|
|
220
257
|
dispose(): void {
|
|
221
258
|
this._disposed = true
|
|
222
259
|
this._pendingFetch = null
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Signal } from '../reactivity/signal'
|
|
2
|
+
import type { DataWindow } from './dataBuffer'
|
|
3
|
+
|
|
4
|
+
export interface DataBufferLike {
|
|
5
|
+
readonly data: Signal<ReadonlyArray<unknown>>
|
|
6
|
+
readonly loading: Signal<boolean>
|
|
7
|
+
readonly loadedWindow: DataWindow | null
|
|
8
|
+
getRawData(): unknown[]
|
|
9
|
+
setInlineData(data: unknown[]): void
|
|
10
|
+
dispose(): void
|
|
11
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn } from './types'
|
|
1
|
+
import type { DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn, TimeShareFetcherFn } from './types'
|
|
2
2
|
|
|
3
3
|
type DataFetcherClass = {
|
|
4
4
|
new(...args: never[]): unknown
|
|
5
5
|
fetcher: DataFetcherFn
|
|
6
|
+
timeShareFetcher?: TimeShareFetcherFn
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
const definitions = new Map<string, DataFetcherDefinition>()
|
|
@@ -18,6 +19,7 @@ export function DataFetcher(config: DataFetcherDefinitionConfig) {
|
|
|
18
19
|
definitions.set(config.name, {
|
|
19
20
|
...config,
|
|
20
21
|
fetcher: this.fetcher,
|
|
22
|
+
timeShareFetcher: this.timeShareFetcher,
|
|
21
23
|
})
|
|
22
24
|
})
|
|
23
25
|
return value
|
|
@@ -30,11 +32,11 @@ export function getRegisteredFetcher(
|
|
|
30
32
|
return definitions.get(name)
|
|
31
33
|
}
|
|
32
34
|
|
|
33
|
-
|
|
35
|
+
function getRegisteredFetchers(): DataFetcherDefinition[] {
|
|
34
36
|
return Array.from(definitions.values())
|
|
35
37
|
}
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
function fetcherHasCapability(name: string, capability: string): boolean {
|
|
38
40
|
return definitions.get(name)?.capabilities?.includes(capability) ?? false
|
|
39
41
|
}
|
|
40
42
|
|
|
@@ -45,6 +47,14 @@ export function fetcherSupportsPeriod(name: string, period: string): boolean {
|
|
|
45
47
|
return def.capabilities.includes('*') || def.capabilities.includes(period)
|
|
46
48
|
}
|
|
47
49
|
|
|
50
|
+
export function getTimeShareFetcher(name: string): TimeShareFetcherFn | undefined {
|
|
51
|
+
return definitions.get(name)?.timeShareFetcher
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function fetcherSupportsTimeShare(name: string): boolean {
|
|
55
|
+
return typeof definitions.get(name)?.timeShareFetcher === 'function'
|
|
56
|
+
}
|
|
57
|
+
|
|
48
58
|
export function clearRegisteredFetchersForTest(): void {
|
|
49
59
|
definitions.clear()
|
|
50
|
-
}
|
|
60
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { KLineData } from '../controllers/types'
|
|
1
|
+
import type { KLineData, TimeShareData } from '../controllers/types'
|
|
2
2
|
import { DataFetcher } from './fetcherDefinitionRegistry'
|
|
3
|
-
import type { FetchConfig } from './types'
|
|
3
|
+
import type { FetchConfig, TimeShareFetchConfig } from './types'
|
|
4
4
|
|
|
5
5
|
const PERIOD_TO_CATEGORY: Record<string, number> = {
|
|
6
6
|
'1min': 8,
|
|
@@ -31,6 +31,46 @@ const EXCHANGE_EX_CATEGORY: Record<string, number> = {
|
|
|
31
31
|
|
|
32
32
|
const BASE_URL = 'http://127.0.0.1:8080'
|
|
33
33
|
|
|
34
|
+
function getShanghaiDateYYYYMMDD(): number {
|
|
35
|
+
const formatter = new Intl.DateTimeFormat('zh-CN', {
|
|
36
|
+
timeZone: 'Asia/Shanghai',
|
|
37
|
+
year: 'numeric', month: '2-digit', day: '2-digit',
|
|
38
|
+
})
|
|
39
|
+
const parts = formatter.formatToParts(new Date())
|
|
40
|
+
let y = '', m = '', d = ''
|
|
41
|
+
for (const p of parts) {
|
|
42
|
+
if (p.type === 'year') y = p.value
|
|
43
|
+
else if (p.type === 'month') m = p.value
|
|
44
|
+
else if (p.type === 'day') d = p.value
|
|
45
|
+
}
|
|
46
|
+
return +y * 10000 + +m * 100 + +d
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function fetchGotdxHistoryTick(
|
|
50
|
+
_source: string,
|
|
51
|
+
config: TimeShareFetchConfig,
|
|
52
|
+
): Promise<ReadonlyArray<TimeShareData>> {
|
|
53
|
+
const body = {
|
|
54
|
+
date: config.date ?? getShanghaiDateYYYYMMDD(),
|
|
55
|
+
market: config.symbol.startsWith('6') || config.symbol.startsWith('9') ? 1 : 0,
|
|
56
|
+
code: config.symbol,
|
|
57
|
+
}
|
|
58
|
+
const res = await fetch(`${BASE_URL}/api/stock/history-tick`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: { 'Content-Type': 'application/json' },
|
|
61
|
+
body: JSON.stringify(body),
|
|
62
|
+
})
|
|
63
|
+
if (!res.ok) throw new Error(`[gotdx] history-tick failed: ${res.status} ${res.statusText}`)
|
|
64
|
+
const list: Array<{ timestamp: string; Price: number; Avg: number; Vol: number }> = await res.json()
|
|
65
|
+
return list.map((item) => ({
|
|
66
|
+
timestamp: new Date(item.timestamp).getTime(),
|
|
67
|
+
price: item.Price,
|
|
68
|
+
average: item.Avg,
|
|
69
|
+
volume: item.Vol,
|
|
70
|
+
amount: item.Price * item.Vol,
|
|
71
|
+
}))
|
|
72
|
+
}
|
|
73
|
+
|
|
34
74
|
interface SecurityBar {
|
|
35
75
|
Last: number
|
|
36
76
|
Open: number
|
|
@@ -154,9 +194,7 @@ async function fetchGotdx(
|
|
|
154
194
|
'daily', 'weekly', 'monthly', 'quarterly', 'yearly',
|
|
155
195
|
],
|
|
156
196
|
})
|
|
157
|
-
|
|
197
|
+
class GotdxFetcher {
|
|
158
198
|
static fetcher = fetchGotdx
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
/** @deprecated Use `GotdxFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
162
|
-
export const gotdxDataFetcher = fetchGotdx
|
|
199
|
+
static timeShareFetcher = fetchGotdxHistoryTick
|
|
200
|
+
}
|
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export { GotdxFetcher, gotdxDataFetcher } from './gotdx'
|
|
6
|
-
export { routerDataFetcher } from './router'
|
|
1
|
+
export { hundredMockDataFetcher } from './hundred-mock'
|
|
2
|
+
export { thousandMockDataFetcher } from './thousand-mock'
|
|
3
|
+
export { baostockDataFetcher } from './baostock'
|
|
4
|
+
export { routerDataFetcher, routerTimeShareFetcher } from './router'
|
|
7
5
|
export { DataBuffer } from './dataBuffer'
|
|
8
6
|
export type { DataWindow } from './dataBuffer'
|
|
9
|
-
export {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
clearRegisteredFetchersForTest,
|
|
16
|
-
} from './fetcherDefinitionRegistry'
|
|
17
|
-
export type {
|
|
18
|
-
FetchConfig,
|
|
19
|
-
DataFetcherDefinitionConfig,
|
|
20
|
-
DataFetcherDefinition,
|
|
21
|
-
DataFetcherFn,
|
|
22
|
-
} from './types'
|
|
7
|
+
export { TimeShareBuffer } from './timeShareBuffer'
|
|
8
|
+
export type { DataBufferLike } from './dataBufferTypes'
|
|
9
|
+
export { getRegisteredFetcher, getTimeShareFetcher, fetcherSupportsTimeShare } from './fetcherDefinitionRegistry'
|
|
10
|
+
export type { TimeShareFetcherFn, TimeShareFetchConfig } from './types'
|
|
11
|
+
import './gotdx'
|
|
12
|
+
import './tradingview'
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { DataFetcher } from '../controllers/types'
|
|
2
|
-
import {
|
|
2
|
+
import type { TimeShareFetcherFn } from './types'
|
|
3
|
+
import { getRegisteredFetcher, fetcherSupportsPeriod, getTimeShareFetcher } from './fetcherDefinitionRegistry'
|
|
3
4
|
|
|
4
5
|
const FALLBACK_SOURCE = 'baostock'
|
|
5
6
|
|
|
@@ -30,3 +31,13 @@ export const routerDataFetcher: DataFetcher = (source, config) => {
|
|
|
30
31
|
|
|
31
32
|
return def.fetcher(source, config)
|
|
32
33
|
}
|
|
34
|
+
|
|
35
|
+
export const routerTimeShareFetcher: TimeShareFetcherFn = (source, config) => {
|
|
36
|
+
const fetcher = getTimeShareFetcher(source)
|
|
37
|
+
if (!fetcher) {
|
|
38
|
+
return Promise.reject(
|
|
39
|
+
new Error(`[DataFetcher] "${source}" does not support timeshare data fetching`),
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
return fetcher(source, config)
|
|
43
|
+
}
|