@363045841yyt/klinechart-core 0.7.3 → 0.7.5
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/README.md +201 -201
- package/README.zh-CN.md +201 -201
- package/dist/controllers/index.d.ts +1 -0
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +1 -0
- package/dist/controllers/index.js.map +1 -1
- package/dist/engine/chart.d.ts +11 -19
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +92 -109
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/renderers/Indicator/indicatorData.d.ts +1 -0
- package/dist/engine/renderers/Indicator/indicatorData.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/indicatorData.js +1 -1
- package/dist/engine/renderers/Indicator/indicatorData.js.map +1 -1
- package/dist/engine/renderers/webgl/candleSurface.js +47 -47
- package/dist/engine/subPaneManager.d.ts +4 -0
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +13 -0
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -2
- package/dist/version.js.map +1 -1
- package/package.json +129 -122
- package/src/__tests__/signal.test.ts +124 -124
- package/src/config/chartSettings.ts +66 -66
- package/src/controllers/__tests__/drawing.test.ts +214 -214
- package/src/controllers/__tests__/indicatorSelector.test.ts +481 -481
- package/src/controllers/__tests__/toolbar.test.ts +225 -225
- package/src/controllers/createChartController.ts +665 -665
- package/src/controllers/createDrawingController.ts +96 -96
- package/src/controllers/createIndicatorSelectorController.ts +307 -307
- package/src/controllers/createToolbarController.ts +146 -146
- package/src/controllers/index.ts +20 -19
- package/src/controllers/types.ts +284 -284
- package/src/engine/__tests__/chart.dpr.test.ts +401 -401
- package/src/engine/__tests__/paneRenderer.resize.test.ts +92 -92
- package/src/engine/chart-store.ts +121 -121
- package/src/engine/chart.d.ts +617 -617
- package/src/engine/chart.ts +2803 -2815
- package/src/engine/controller/__tests__/interaction.dpr.test.ts +259 -259
- package/src/engine/controller/interaction.ts +722 -722
- package/src/engine/controller/markerInteraction.ts +130 -130
- package/src/engine/controller/pinchTracker.ts +82 -82
- package/src/engine/controller/tooltipPosition.ts +48 -48
- package/src/engine/draw/__tests__/pixelAlign.spec.ts +176 -176
- package/src/engine/draw/pixelAlign.ts +259 -259
- package/src/engine/drawing/index.ts +655 -655
- package/src/engine/drawing/interaction.ts +842 -842
- package/src/engine/drawing/plugin.ts +343 -343
- package/src/engine/indicators/__tests__/__fixtures__/golden/atr.json +38 -38
- package/src/engine/indicators/__tests__/__fixtures__/golden/dema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/hma.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +55 -55
- package/src/engine/indicators/__tests__/__fixtures__/golden/kama.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/tema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/wma.json +40 -40
- package/src/engine/indicators/__tests__/__fixtures__/synthetic.ts +65 -65
- package/src/engine/indicators/__tests__/_propertyAssertions.ts +76 -76
- package/src/engine/indicators/__tests__/atr.test.ts +153 -153
- package/src/engine/indicators/__tests__/calculators.test.ts +614 -614
- package/src/engine/indicators/__tests__/cmf-mfi.test.ts +100 -100
- package/src/engine/indicators/__tests__/dema.test.ts +73 -73
- package/src/engine/indicators/__tests__/donchian.test.ts +70 -70
- package/src/engine/indicators/__tests__/hma.test.ts +73 -73
- package/src/engine/indicators/__tests__/ichimoku.test.ts +105 -105
- package/src/engine/indicators/__tests__/kama.test.ts +80 -80
- package/src/engine/indicators/__tests__/keltner.test.ts +65 -65
- package/src/engine/indicators/__tests__/pivot-fib.test.ts +110 -110
- package/src/engine/indicators/__tests__/roc.test.ts +68 -68
- package/src/engine/indicators/__tests__/sar.test.ts +86 -86
- package/src/engine/indicators/__tests__/scheduler.test.ts +831 -831
- package/src/engine/indicators/__tests__/soa.test.ts +533 -533
- package/src/engine/indicators/__tests__/structure.test.ts +110 -110
- package/src/engine/indicators/__tests__/supertrend.test.ts +65 -65
- package/src/engine/indicators/__tests__/tema.test.ts +68 -68
- package/src/engine/indicators/__tests__/trix.test.ts +70 -70
- package/src/engine/indicators/__tests__/volatility.test.ts +117 -117
- package/src/engine/indicators/__tests__/volume.test.ts +115 -115
- package/src/engine/indicators/__tests__/volumeProfile.test.ts +74 -74
- package/src/engine/indicators/__tests__/vwap.test.ts +69 -69
- package/src/engine/indicators/__tests__/wma.test.ts +112 -112
- package/src/engine/indicators/__tests__/zones.test.ts +95 -95
- package/src/engine/indicators/atrState.ts +27 -27
- package/src/engine/indicators/bollState.ts +51 -51
- package/src/engine/indicators/calculators.ts +2593 -2593
- package/src/engine/indicators/cciState.ts +25 -25
- package/src/engine/indicators/chaikinVolState.ts +32 -32
- package/src/engine/indicators/cmfState.ts +27 -27
- package/src/engine/indicators/demaState.ts +27 -27
- package/src/engine/indicators/donchianState.ts +43 -43
- package/src/engine/indicators/eneState.ts +43 -43
- package/src/engine/indicators/expmaState.ts +43 -43
- package/src/engine/indicators/fastkState.ts +25 -25
- package/src/engine/indicators/fibState.ts +41 -41
- package/src/engine/indicators/hmaState.ts +27 -27
- package/src/engine/indicators/hvState.ts +28 -28
- package/src/engine/indicators/ichimokuState.ts +70 -70
- package/src/engine/indicators/indicator.worker.ts +169 -169
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +62 -62
- package/src/engine/indicators/indicatorMetadata.ts +110 -110
- package/src/engine/indicators/indicatorRegistry.ts +106 -106
- package/src/engine/indicators/indicatorRuntime.ts +1548 -1548
- package/src/engine/indicators/kamaState.ts +34 -34
- package/src/engine/indicators/keltnerState.ts +49 -49
- package/src/engine/indicators/kstState.ts +42 -42
- package/src/engine/indicators/maState.ts +36 -36
- package/src/engine/indicators/macdState.ts +76 -76
- package/src/engine/indicators/mfiState.ts +27 -27
- package/src/engine/indicators/momState.ts +25 -25
- package/src/engine/indicators/obvState.ts +25 -25
- package/src/engine/indicators/parkinsonState.ts +28 -28
- package/src/engine/indicators/pivotState.ts +51 -51
- package/src/engine/indicators/pvtState.ts +25 -25
- package/src/engine/indicators/rocState.ts +27 -27
- package/src/engine/indicators/rsiState.ts +65 -65
- package/src/engine/indicators/sarState.ts +41 -41
- package/src/engine/indicators/scheduler.ts +1205 -1205
- package/src/engine/indicators/soa.ts +352 -352
- package/src/engine/indicators/stateComposer.ts +1262 -1262
- package/src/engine/indicators/stochState.ts +26 -26
- package/src/engine/indicators/structureState.ts +69 -69
- package/src/engine/indicators/supertrendState.ts +37 -37
- package/src/engine/indicators/temaState.ts +27 -27
- package/src/engine/indicators/trixState.ts +35 -35
- package/src/engine/indicators/vmaState.ts +27 -27
- package/src/engine/indicators/volumeProfileState.ts +63 -63
- package/src/engine/indicators/vwapState.ts +29 -29
- package/src/engine/indicators/wmaState.ts +27 -27
- package/src/engine/indicators/wmsrState.ts +25 -25
- package/src/engine/indicators/workerProtocol.ts +613 -613
- package/src/engine/indicators/zonesState.ts +47 -47
- package/src/engine/layout/pane.ts +161 -161
- package/src/engine/marker/registry.ts +265 -265
- package/src/engine/paneRenderer.ts +169 -169
- package/src/engine/renderers/Indicator/atr.ts +237 -237
- package/src/engine/renderers/Indicator/boll.ts +317 -317
- package/src/engine/renderers/Indicator/cci.ts +275 -275
- package/src/engine/renderers/Indicator/chaikinVol.ts +138 -138
- package/src/engine/renderers/Indicator/cmf.ts +137 -137
- package/src/engine/renderers/Indicator/dema.ts +136 -136
- package/src/engine/renderers/Indicator/donchian.ts +137 -137
- package/src/engine/renderers/Indicator/ene.ts +271 -271
- package/src/engine/renderers/Indicator/expma.ts +197 -197
- package/src/engine/renderers/Indicator/fastk.ts +316 -316
- package/src/engine/renderers/Indicator/fib.ts +141 -141
- package/src/engine/renderers/Indicator/hma.ts +136 -136
- package/src/engine/renderers/Indicator/hv.ts +124 -124
- package/src/engine/renderers/Indicator/ichimoku.ts +181 -181
- package/src/engine/renderers/Indicator/index.ts +241 -241
- package/src/engine/renderers/Indicator/indicatorData.ts +650 -650
- package/src/engine/renderers/Indicator/kama.ts +136 -136
- package/src/engine/renderers/Indicator/keltner.ts +137 -137
- package/src/engine/renderers/Indicator/kst.ts +302 -302
- package/src/engine/renderers/Indicator/ma.ts +200 -200
- package/src/engine/renderers/Indicator/macd.ts +477 -477
- package/src/engine/renderers/Indicator/macdLegend.ts +141 -141
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +272 -272
- package/src/engine/renderers/Indicator/mfi.ts +142 -142
- package/src/engine/renderers/Indicator/mom.ts +311 -311
- package/src/engine/renderers/Indicator/obv.ts +123 -123
- package/src/engine/renderers/Indicator/parkinson.ts +124 -124
- package/src/engine/renderers/Indicator/pivot.ts +131 -131
- package/src/engine/renderers/Indicator/pvt.ts +123 -123
- package/src/engine/renderers/Indicator/roc.ts +143 -143
- package/src/engine/renderers/Indicator/rsi.ts +390 -390
- package/src/engine/renderers/Indicator/sar.ts +113 -113
- package/src/engine/renderers/Indicator/scale/atr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/cci_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/fastk_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/indicator_scale.ts +204 -204
- package/src/engine/renderers/Indicator/scale/kst_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/macd_scale.ts +22 -22
- package/src/engine/renderers/Indicator/scale/mom_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/rsi_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/stoch_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/volume_scale.ts +26 -26
- package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/stoch.ts +359 -359
- package/src/engine/renderers/Indicator/structure.ts +126 -126
- package/src/engine/renderers/Indicator/subPaneConfig.ts +265 -265
- package/src/engine/renderers/Indicator/supertrend.ts +115 -115
- package/src/engine/renderers/Indicator/tema.ts +136 -136
- package/src/engine/renderers/Indicator/trix.ts +158 -158
- package/src/engine/renderers/Indicator/vma.ts +124 -124
- package/src/engine/renderers/Indicator/volumeProfile.ts +125 -125
- package/src/engine/renderers/Indicator/vwap.ts +123 -123
- package/src/engine/renderers/Indicator/wma.ts +136 -136
- package/src/engine/renderers/Indicator/wmsr.ts +328 -328
- package/src/engine/renderers/Indicator/zones.ts +104 -104
- package/src/engine/renderers/__tests__/boll.renderer.test.ts +314 -314
- package/src/engine/renderers/__tests__/ene.renderer.test.ts +305 -305
- package/src/engine/renderers/__tests__/expma.renderer.test.ts +279 -279
- package/src/engine/renderers/__tests__/ma.renderer.test.ts +426 -426
- package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +502 -502
- package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +173 -173
- package/src/engine/renderers/candle.ts +459 -459
- package/src/engine/renderers/crosshair.ts +69 -69
- package/src/engine/renderers/customMarkers.ts +162 -162
- package/src/engine/renderers/extremaMarkers.ts +246 -246
- package/src/engine/renderers/gridLines.ts +90 -90
- package/src/engine/renderers/lastPrice.ts +97 -97
- package/src/engine/renderers/paneTitle.ts +136 -136
- package/src/engine/renderers/subVolume.ts +236 -236
- package/src/engine/renderers/timeAxis.ts +121 -121
- package/src/engine/renderers/webgl/candleSurface.ts +955 -955
- package/src/engine/renderers/webgl/sharedWebGLSurface.ts +146 -146
- package/src/engine/renderers/yAxis.ts +105 -105
- package/src/engine/scale/__tests__/logFormula.spec.ts +148 -148
- package/src/engine/scale/logFormula.ts +130 -130
- package/src/engine/scale/price.ts +39 -39
- package/src/engine/scale/priceScale.ts +264 -264
- package/src/engine/subPaneManager.ts +442 -427
- package/src/engine/theme/colors.ts +642 -642
- package/src/engine/theme/fonts.ts +20 -20
- package/src/engine/utils/klineConfig.ts +49 -49
- package/src/engine/utils/tickCount.ts +11 -11
- package/src/engine/utils/tickPosition.ts +214 -214
- package/src/engine/utils/zoom.ts +83 -83
- package/src/engine/viewport/viewport.ts +67 -67
- package/src/index.ts +3 -3
- package/src/plugin/ConfigManager.ts +93 -93
- package/src/plugin/EventBus.ts +77 -77
- package/src/plugin/HookSystem.ts +106 -106
- package/src/plugin/PluginHost.ts +243 -243
- package/src/plugin/PluginRegistry.ts +92 -92
- package/src/plugin/StateStore.ts +73 -73
- package/src/plugin/index.ts +19 -19
- package/src/plugin/rendererPluginManager.ts +368 -368
- package/src/plugin/stateKeys.ts +8 -8
- package/src/plugin/types.ts +526 -526
- package/src/reactivity/index.ts +2 -2
- package/src/reactivity/signal.ts +119 -119
- package/src/semantic/controller.ts +251 -251
- package/src/semantic/drawShape.ts +260 -260
- package/src/semantic/index.ts +28 -28
- package/src/semantic/schema.json +256 -256
- package/src/semantic/types.ts +251 -251
- package/src/semantic/validator.ts +349 -349
- package/src/types/kLine.ts +13 -13
- package/src/types/price.ts +56 -56
- package/src/types/volumePrice.ts +33 -33
- package/src/utils/dateFormat.ts +208 -208
- package/src/utils/kLineDraw/axis.ts +562 -562
- package/src/utils/priceToY.ts +34 -34
- package/src/utils/volumePrice.ts +202 -202
- package/src/version.ts +1 -1
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "Wilder ATR golden values. Period=14. null = warm-up (undefined).",
|
|
3
|
-
"$source": "Hand-derived from Wilder definition: TR(t)=max(H-L, |H-PrevC|, |L-PrevC|); TR(0)=H-L; ATR(period-1)=mean(TR[0..period-1]); ATR(t)=((period-1)*ATR(t-1)+TR(t))/period for t>=period. Cross-verified by manual computation through index 19; subsequent values are the deterministic float64 continuation of the same recurrence.",
|
|
4
|
-
"$tolerance": 1e-9,
|
|
5
|
-
"$note": "Follow-up: replace with pandas-ta / TA-Lib generated fixtures once `scripts/gen-golden.py` lands.",
|
|
6
|
-
"constantPrice": {
|
|
7
|
-
"period": 14,
|
|
8
|
-
"series": [
|
|
9
|
-
null, null, null, null, null, null, null, null, null, null, null, null, null,
|
|
10
|
-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
11
|
-
]
|
|
12
|
-
},
|
|
13
|
-
"pureUptrend": {
|
|
14
|
-
"period": 14,
|
|
15
|
-
"series": [
|
|
16
|
-
null, null, null, null, null, null, null, null, null, null, null, null, null,
|
|
17
|
-
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
|
|
18
|
-
]
|
|
19
|
-
},
|
|
20
|
-
"spikeAtBar19": {
|
|
21
|
-
"period": 14,
|
|
22
|
-
"series": [
|
|
23
|
-
null, null, null, null, null, null, null, null, null, null, null, null, null,
|
|
24
|
-
2,
|
|
25
|
-
2,
|
|
26
|
-
2,
|
|
27
|
-
2,
|
|
28
|
-
2,
|
|
29
|
-
2,
|
|
30
|
-
2.9285714285714284,
|
|
31
|
-
2.862244897959184,
|
|
32
|
-
2.800655976676385,
|
|
33
|
-
2.7434662640566362,
|
|
34
|
-
2.690361530909734,
|
|
35
|
-
2.6410499929876154
|
|
36
|
-
]
|
|
37
|
-
}
|
|
38
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "Wilder ATR golden values. Period=14. null = warm-up (undefined).",
|
|
3
|
+
"$source": "Hand-derived from Wilder definition: TR(t)=max(H-L, |H-PrevC|, |L-PrevC|); TR(0)=H-L; ATR(period-1)=mean(TR[0..period-1]); ATR(t)=((period-1)*ATR(t-1)+TR(t))/period for t>=period. Cross-verified by manual computation through index 19; subsequent values are the deterministic float64 continuation of the same recurrence.",
|
|
4
|
+
"$tolerance": 1e-9,
|
|
5
|
+
"$note": "Follow-up: replace with pandas-ta / TA-Lib generated fixtures once `scripts/gen-golden.py` lands.",
|
|
6
|
+
"constantPrice": {
|
|
7
|
+
"period": 14,
|
|
8
|
+
"series": [
|
|
9
|
+
null, null, null, null, null, null, null, null, null, null, null, null, null,
|
|
10
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
"pureUptrend": {
|
|
14
|
+
"period": 14,
|
|
15
|
+
"series": [
|
|
16
|
+
null, null, null, null, null, null, null, null, null, null, null, null, null,
|
|
17
|
+
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"spikeAtBar19": {
|
|
21
|
+
"period": 14,
|
|
22
|
+
"series": [
|
|
23
|
+
null, null, null, null, null, null, null, null, null, null, null, null, null,
|
|
24
|
+
2,
|
|
25
|
+
2,
|
|
26
|
+
2,
|
|
27
|
+
2,
|
|
28
|
+
2,
|
|
29
|
+
2,
|
|
30
|
+
2.9285714285714284,
|
|
31
|
+
2.862244897959184,
|
|
32
|
+
2.800655976676385,
|
|
33
|
+
2.7434662640566362,
|
|
34
|
+
2.690361530909734,
|
|
35
|
+
2.6410499929876154
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "DEMA (Double Exponential MA) golden values. period=20.",
|
|
3
|
-
"$source": "Hand-derived for constantPrice only — EMA seeded with first close, so EMA = constant immediately; DEMA = 2*c - c = c throughout.",
|
|
4
|
-
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property/edge tests cover the rest.",
|
|
5
|
-
"$tolerance": 1e-9,
|
|
6
|
-
"constantPrice": {
|
|
7
|
-
"period": 20,
|
|
8
|
-
"series": [
|
|
9
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
10
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
-
]
|
|
13
|
-
}
|
|
14
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "DEMA (Double Exponential MA) golden values. period=20.",
|
|
3
|
+
"$source": "Hand-derived for constantPrice only — EMA seeded with first close, so EMA = constant immediately; DEMA = 2*c - c = c throughout.",
|
|
4
|
+
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property/edge tests cover the rest.",
|
|
5
|
+
"$tolerance": 1e-9,
|
|
6
|
+
"constantPrice": {
|
|
7
|
+
"period": 20,
|
|
8
|
+
"series": [
|
|
9
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
10
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "HMA (Hull Moving Average) golden values. period=9.",
|
|
3
|
-
"$source": "Hand-derived for constantPrice — WMA on constant input yields constant at every stage; 2*WMA(c, n/2) - WMA(c, n) = 2c - c = c; final WMA(c, sqrt(n)) = c.",
|
|
4
|
-
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property/edge tests cover the rest. Warm-up = period-1 + round(sqrt(period))-1 = 8+2 = 10 for period=9.",
|
|
5
|
-
"$tolerance": 1e-9,
|
|
6
|
-
"constantPrice": {
|
|
7
|
-
"period": 9,
|
|
8
|
-
"series": [
|
|
9
|
-
null, null, null, null, null, null, null, null, null, null,
|
|
10
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
-
]
|
|
13
|
-
}
|
|
14
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "HMA (Hull Moving Average) golden values. period=9.",
|
|
3
|
+
"$source": "Hand-derived for constantPrice — WMA on constant input yields constant at every stage; 2*WMA(c, n/2) - WMA(c, n) = 2c - c = c; final WMA(c, sqrt(n)) = c.",
|
|
4
|
+
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property/edge tests cover the rest. Warm-up = period-1 + round(sqrt(period))-1 = 8+2 = 10 for period=9.",
|
|
5
|
+
"$tolerance": 1e-9,
|
|
6
|
+
"constantPrice": {
|
|
7
|
+
"period": 9,
|
|
8
|
+
"series": [
|
|
9
|
+
null, null, null, null, null, null, null, null, null, null,
|
|
10
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import atrGolden from './atr.json'
|
|
2
|
-
import wmaGolden from './wma.json'
|
|
3
|
-
import demaGolden from './dema.json'
|
|
4
|
-
import temaGolden from './tema.json'
|
|
5
|
-
import hmaGolden from './hma.json'
|
|
6
|
-
import kamaGolden from './kama.json'
|
|
7
|
-
|
|
8
|
-
export interface GoldenSeries {
|
|
9
|
-
period: number
|
|
10
|
-
series: (number | null)[]
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type GoldenFixture = Record<string, GoldenSeries>
|
|
14
|
-
|
|
15
|
-
export const ATR_GOLDEN: GoldenFixture = filterMeta(atrGolden as Record<string, unknown>)
|
|
16
|
-
export const WMA_GOLDEN: GoldenFixture = filterMeta(wmaGolden as Record<string, unknown>)
|
|
17
|
-
export const DEMA_GOLDEN: GoldenFixture = filterMeta(demaGolden as Record<string, unknown>)
|
|
18
|
-
export const TEMA_GOLDEN: GoldenFixture = filterMeta(temaGolden as Record<string, unknown>)
|
|
19
|
-
export const HMA_GOLDEN: GoldenFixture = filterMeta(hmaGolden as Record<string, unknown>)
|
|
20
|
-
export const KAMA_GOLDEN: GoldenFixture = filterMeta(kamaGolden as Record<string, unknown>)
|
|
21
|
-
|
|
22
|
-
function filterMeta(raw: Record<string, unknown>): GoldenFixture {
|
|
23
|
-
const out: GoldenFixture = {}
|
|
24
|
-
for (const [key, value] of Object.entries(raw)) {
|
|
25
|
-
if (key.startsWith('$')) continue
|
|
26
|
-
out[key] = value as GoldenSeries
|
|
27
|
-
}
|
|
28
|
-
return out
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function assertSeriesClose(
|
|
32
|
-
actual: readonly (number | undefined)[],
|
|
33
|
-
expected: readonly (number | null)[],
|
|
34
|
-
tolerance = 1e-9,
|
|
35
|
-
): void {
|
|
36
|
-
if (actual.length !== expected.length) {
|
|
37
|
-
throw new Error(`series length mismatch: actual=${actual.length} expected=${expected.length}`)
|
|
38
|
-
}
|
|
39
|
-
for (let i = 0; i < expected.length; i++) {
|
|
40
|
-
const a = actual[i]
|
|
41
|
-
const e = expected[i]
|
|
42
|
-
if (e === null) {
|
|
43
|
-
if (a !== undefined) {
|
|
44
|
-
throw new Error(`at index ${i}: expected undefined (warm-up), got ${a}`)
|
|
45
|
-
}
|
|
46
|
-
continue
|
|
47
|
-
}
|
|
48
|
-
if (a === undefined) {
|
|
49
|
-
throw new Error(`at index ${i}: expected ${e}, got undefined`)
|
|
50
|
-
}
|
|
51
|
-
if (Math.abs(a - e) > tolerance) {
|
|
52
|
-
throw new Error(`at index ${i}: expected ${e}, got ${a} (Δ=${Math.abs(a - e)})`)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
1
|
+
import atrGolden from './atr.json'
|
|
2
|
+
import wmaGolden from './wma.json'
|
|
3
|
+
import demaGolden from './dema.json'
|
|
4
|
+
import temaGolden from './tema.json'
|
|
5
|
+
import hmaGolden from './hma.json'
|
|
6
|
+
import kamaGolden from './kama.json'
|
|
7
|
+
|
|
8
|
+
export interface GoldenSeries {
|
|
9
|
+
period: number
|
|
10
|
+
series: (number | null)[]
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type GoldenFixture = Record<string, GoldenSeries>
|
|
14
|
+
|
|
15
|
+
export const ATR_GOLDEN: GoldenFixture = filterMeta(atrGolden as Record<string, unknown>)
|
|
16
|
+
export const WMA_GOLDEN: GoldenFixture = filterMeta(wmaGolden as Record<string, unknown>)
|
|
17
|
+
export const DEMA_GOLDEN: GoldenFixture = filterMeta(demaGolden as Record<string, unknown>)
|
|
18
|
+
export const TEMA_GOLDEN: GoldenFixture = filterMeta(temaGolden as Record<string, unknown>)
|
|
19
|
+
export const HMA_GOLDEN: GoldenFixture = filterMeta(hmaGolden as Record<string, unknown>)
|
|
20
|
+
export const KAMA_GOLDEN: GoldenFixture = filterMeta(kamaGolden as Record<string, unknown>)
|
|
21
|
+
|
|
22
|
+
function filterMeta(raw: Record<string, unknown>): GoldenFixture {
|
|
23
|
+
const out: GoldenFixture = {}
|
|
24
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
25
|
+
if (key.startsWith('$')) continue
|
|
26
|
+
out[key] = value as GoldenSeries
|
|
27
|
+
}
|
|
28
|
+
return out
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function assertSeriesClose(
|
|
32
|
+
actual: readonly (number | undefined)[],
|
|
33
|
+
expected: readonly (number | null)[],
|
|
34
|
+
tolerance = 1e-9,
|
|
35
|
+
): void {
|
|
36
|
+
if (actual.length !== expected.length) {
|
|
37
|
+
throw new Error(`series length mismatch: actual=${actual.length} expected=${expected.length}`)
|
|
38
|
+
}
|
|
39
|
+
for (let i = 0; i < expected.length; i++) {
|
|
40
|
+
const a = actual[i]
|
|
41
|
+
const e = expected[i]
|
|
42
|
+
if (e === null) {
|
|
43
|
+
if (a !== undefined) {
|
|
44
|
+
throw new Error(`at index ${i}: expected undefined (warm-up), got ${a}`)
|
|
45
|
+
}
|
|
46
|
+
continue
|
|
47
|
+
}
|
|
48
|
+
if (a === undefined) {
|
|
49
|
+
throw new Error(`at index ${i}: expected ${e}, got undefined`)
|
|
50
|
+
}
|
|
51
|
+
if (Math.abs(a - e) > tolerance) {
|
|
52
|
+
throw new Error(`at index ${i}: expected ${e}, got ${a} (Δ=${Math.abs(a - e)})`)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "KAMA (Kaufman Adaptive MA) golden values. period=10, fast=2, slow=30.",
|
|
3
|
-
"$source": "Hand-derived for constantPrice — ER = 0/0 → 0 → SC = slowSC^2; but seed is close[period-1]=100, then KAMA(t) = 100 + SC*(100-100) = 100 ∀ t≥period-1.",
|
|
4
|
-
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property tests cover the rest.",
|
|
5
|
-
"$tolerance": 1e-9,
|
|
6
|
-
"constantPrice": {
|
|
7
|
-
"period": 10,
|
|
8
|
-
"series": [
|
|
9
|
-
null, null, null, null, null, null, null, null, null,
|
|
10
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
-
]
|
|
13
|
-
}
|
|
14
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "KAMA (Kaufman Adaptive MA) golden values. period=10, fast=2, slow=30.",
|
|
3
|
+
"$source": "Hand-derived for constantPrice — ER = 0/0 → 0 → SC = slowSC^2; but seed is close[period-1]=100, then KAMA(t) = 100 + SC*(100-100) = 100 ∀ t≥period-1.",
|
|
4
|
+
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property tests cover the rest.",
|
|
5
|
+
"$tolerance": 1e-9,
|
|
6
|
+
"constantPrice": {
|
|
7
|
+
"period": 10,
|
|
8
|
+
"series": [
|
|
9
|
+
null, null, null, null, null, null, null, null, null,
|
|
10
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "TEMA (Triple Exponential MA) golden values. period=20.",
|
|
3
|
-
"$source": "Hand-derived for constantPrice — EMA chain on a constant input yields constant output at every stage; TEMA = 3*c - 3*c + c = c.",
|
|
4
|
-
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property/edge tests cover the rest.",
|
|
5
|
-
"$tolerance": 1e-9,
|
|
6
|
-
"constantPrice": {
|
|
7
|
-
"period": 20,
|
|
8
|
-
"series": [
|
|
9
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
10
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
-
]
|
|
13
|
-
}
|
|
14
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "TEMA (Triple Exponential MA) golden values. period=20.",
|
|
3
|
+
"$source": "Hand-derived for constantPrice — EMA chain on a constant input yields constant output at every stage; TEMA = 3*c - 3*c + c = c.",
|
|
4
|
+
"$note": "pureUptrend/spike golden deferred to pandas-ta gen-golden.py; property/edge tests cover the rest.",
|
|
5
|
+
"$tolerance": 1e-9,
|
|
6
|
+
"constantPrice": {
|
|
7
|
+
"period": 20,
|
|
8
|
+
"series": [
|
|
9
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
10
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
|
|
11
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "WMA (Weighted Moving Average) golden values. period=9. null = warm-up.",
|
|
3
|
-
"$source": "Hand-derived: WMA(t) = sum_{k=0..n-1} (k+1)*values[t-n+1+k] / (n*(n+1)/2). For pureUptrend with close=100+i, sum increments by exactly denom=45 per step → series goes 4740/45, 4785/45, ... = 105.333, 106.333, ...",
|
|
4
|
-
"$tolerance": 1e-9,
|
|
5
|
-
"constantPrice": {
|
|
6
|
-
"period": 9,
|
|
7
|
-
"series": [
|
|
8
|
-
null, null, null, null, null, null, null, null,
|
|
9
|
-
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
10
|
-
]
|
|
11
|
-
},
|
|
12
|
-
"pureUptrend": {
|
|
13
|
-
"period": 9,
|
|
14
|
-
"series": [
|
|
15
|
-
null, null, null, null, null, null, null, null,
|
|
16
|
-
105.33333333333333,
|
|
17
|
-
106.33333333333333,
|
|
18
|
-
107.33333333333333,
|
|
19
|
-
108.33333333333333,
|
|
20
|
-
109.33333333333333,
|
|
21
|
-
110.33333333333333,
|
|
22
|
-
111.33333333333333,
|
|
23
|
-
112.33333333333333,
|
|
24
|
-
113.33333333333333,
|
|
25
|
-
114.33333333333333,
|
|
26
|
-
115.33333333333333,
|
|
27
|
-
116.33333333333333,
|
|
28
|
-
117.33333333333333,
|
|
29
|
-
118.33333333333333,
|
|
30
|
-
119.33333333333333,
|
|
31
|
-
120.33333333333333,
|
|
32
|
-
121.33333333333333,
|
|
33
|
-
122.33333333333333,
|
|
34
|
-
123.33333333333333,
|
|
35
|
-
124.33333333333333,
|
|
36
|
-
125.33333333333333,
|
|
37
|
-
126.33333333333333
|
|
38
|
-
]
|
|
39
|
-
}
|
|
40
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "WMA (Weighted Moving Average) golden values. period=9. null = warm-up.",
|
|
3
|
+
"$source": "Hand-derived: WMA(t) = sum_{k=0..n-1} (k+1)*values[t-n+1+k] / (n*(n+1)/2). For pureUptrend with close=100+i, sum increments by exactly denom=45 per step → series goes 4740/45, 4785/45, ... = 105.333, 106.333, ...",
|
|
4
|
+
"$tolerance": 1e-9,
|
|
5
|
+
"constantPrice": {
|
|
6
|
+
"period": 9,
|
|
7
|
+
"series": [
|
|
8
|
+
null, null, null, null, null, null, null, null,
|
|
9
|
+
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"pureUptrend": {
|
|
13
|
+
"period": 9,
|
|
14
|
+
"series": [
|
|
15
|
+
null, null, null, null, null, null, null, null,
|
|
16
|
+
105.33333333333333,
|
|
17
|
+
106.33333333333333,
|
|
18
|
+
107.33333333333333,
|
|
19
|
+
108.33333333333333,
|
|
20
|
+
109.33333333333333,
|
|
21
|
+
110.33333333333333,
|
|
22
|
+
111.33333333333333,
|
|
23
|
+
112.33333333333333,
|
|
24
|
+
113.33333333333333,
|
|
25
|
+
114.33333333333333,
|
|
26
|
+
115.33333333333333,
|
|
27
|
+
116.33333333333333,
|
|
28
|
+
117.33333333333333,
|
|
29
|
+
118.33333333333333,
|
|
30
|
+
119.33333333333333,
|
|
31
|
+
120.33333333333333,
|
|
32
|
+
121.33333333333333,
|
|
33
|
+
122.33333333333333,
|
|
34
|
+
123.33333333333333,
|
|
35
|
+
124.33333333333333,
|
|
36
|
+
125.33333333333333,
|
|
37
|
+
126.33333333333333
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
import type { KLineData } from '@/types/price'
|
|
2
|
-
|
|
3
|
-
const T0 = 1_700_000_000_000
|
|
4
|
-
const MINUTE = 60_000
|
|
5
|
-
|
|
6
|
-
function bar(i: number, open: number, high: number, low: number, close: number, volume = 1000): KLineData {
|
|
7
|
-
return { timestamp: T0 + i * MINUTE, open, high, low, close, volume }
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export const empty: KLineData[] = []
|
|
11
|
-
|
|
12
|
-
export const singleBar: KLineData[] = [bar(0, 100, 101, 99, 100)]
|
|
13
|
-
|
|
14
|
-
export const shortSequence: KLineData[] = [
|
|
15
|
-
bar(0, 100, 101, 99, 100),
|
|
16
|
-
bar(1, 100, 102, 99, 101),
|
|
17
|
-
bar(2, 101, 103, 100, 102),
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
export const constantPrice: KLineData[] = Array.from({ length: 30 }, (_, i) =>
|
|
21
|
-
bar(i, 100, 100, 100, 100),
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
export const pureUptrend: KLineData[] = Array.from({ length: 30 }, (_, i) =>
|
|
25
|
-
bar(i, 100 + i, 101 + i, 99 + i, 100 + i),
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
export const pureDowntrend: KLineData[] = Array.from({ length: 30 }, (_, i) =>
|
|
29
|
-
bar(i, 200 - i, 201 - i, 199 - i, 200 - i),
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
export const sideways: KLineData[] = Array.from({ length: 30 }, (_, i) => {
|
|
33
|
-
const phase = (i % 4) - 1.5
|
|
34
|
-
const close = 100 + phase
|
|
35
|
-
return bar(i, 100, 100 + Math.abs(phase) + 0.5, 100 - Math.abs(phase) - 0.5, close)
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
export const spikeAtBar19: KLineData[] = (() => {
|
|
39
|
-
const out: KLineData[] = []
|
|
40
|
-
for (let i = 0; i < 19; i++) out.push(bar(i, 100, 101, 99, 100))
|
|
41
|
-
out.push(bar(19, 100, 110, 95, 105))
|
|
42
|
-
for (let i = 20; i < 25; i++) out.push(bar(i, 105, 106, 104, 105))
|
|
43
|
-
return out
|
|
44
|
-
})()
|
|
45
|
-
|
|
46
|
-
export const gapUp: KLineData[] = (() => {
|
|
47
|
-
const out: KLineData[] = []
|
|
48
|
-
for (let i = 0; i < 10; i++) out.push(bar(i, 100, 101, 99, 100))
|
|
49
|
-
for (let i = 10; i < 20; i++) out.push(bar(i, 110, 111, 109, 110))
|
|
50
|
-
return out
|
|
51
|
-
})()
|
|
52
|
-
|
|
53
|
-
export const FIXTURES = {
|
|
54
|
-
empty,
|
|
55
|
-
singleBar,
|
|
56
|
-
shortSequence,
|
|
57
|
-
constantPrice,
|
|
58
|
-
pureUptrend,
|
|
59
|
-
pureDowntrend,
|
|
60
|
-
sideways,
|
|
61
|
-
spikeAtBar19,
|
|
62
|
-
gapUp,
|
|
63
|
-
} as const
|
|
64
|
-
|
|
65
|
-
export type FixtureName = keyof typeof FIXTURES
|
|
1
|
+
import type { KLineData } from '@/types/price'
|
|
2
|
+
|
|
3
|
+
const T0 = 1_700_000_000_000
|
|
4
|
+
const MINUTE = 60_000
|
|
5
|
+
|
|
6
|
+
function bar(i: number, open: number, high: number, low: number, close: number, volume = 1000): KLineData {
|
|
7
|
+
return { timestamp: T0 + i * MINUTE, open, high, low, close, volume }
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const empty: KLineData[] = []
|
|
11
|
+
|
|
12
|
+
export const singleBar: KLineData[] = [bar(0, 100, 101, 99, 100)]
|
|
13
|
+
|
|
14
|
+
export const shortSequence: KLineData[] = [
|
|
15
|
+
bar(0, 100, 101, 99, 100),
|
|
16
|
+
bar(1, 100, 102, 99, 101),
|
|
17
|
+
bar(2, 101, 103, 100, 102),
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
export const constantPrice: KLineData[] = Array.from({ length: 30 }, (_, i) =>
|
|
21
|
+
bar(i, 100, 100, 100, 100),
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
export const pureUptrend: KLineData[] = Array.from({ length: 30 }, (_, i) =>
|
|
25
|
+
bar(i, 100 + i, 101 + i, 99 + i, 100 + i),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
export const pureDowntrend: KLineData[] = Array.from({ length: 30 }, (_, i) =>
|
|
29
|
+
bar(i, 200 - i, 201 - i, 199 - i, 200 - i),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
export const sideways: KLineData[] = Array.from({ length: 30 }, (_, i) => {
|
|
33
|
+
const phase = (i % 4) - 1.5
|
|
34
|
+
const close = 100 + phase
|
|
35
|
+
return bar(i, 100, 100 + Math.abs(phase) + 0.5, 100 - Math.abs(phase) - 0.5, close)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
export const spikeAtBar19: KLineData[] = (() => {
|
|
39
|
+
const out: KLineData[] = []
|
|
40
|
+
for (let i = 0; i < 19; i++) out.push(bar(i, 100, 101, 99, 100))
|
|
41
|
+
out.push(bar(19, 100, 110, 95, 105))
|
|
42
|
+
for (let i = 20; i < 25; i++) out.push(bar(i, 105, 106, 104, 105))
|
|
43
|
+
return out
|
|
44
|
+
})()
|
|
45
|
+
|
|
46
|
+
export const gapUp: KLineData[] = (() => {
|
|
47
|
+
const out: KLineData[] = []
|
|
48
|
+
for (let i = 0; i < 10; i++) out.push(bar(i, 100, 101, 99, 100))
|
|
49
|
+
for (let i = 10; i < 20; i++) out.push(bar(i, 110, 111, 109, 110))
|
|
50
|
+
return out
|
|
51
|
+
})()
|
|
52
|
+
|
|
53
|
+
export const FIXTURES = {
|
|
54
|
+
empty,
|
|
55
|
+
singleBar,
|
|
56
|
+
shortSequence,
|
|
57
|
+
constantPrice,
|
|
58
|
+
pureUptrend,
|
|
59
|
+
pureDowntrend,
|
|
60
|
+
sideways,
|
|
61
|
+
spikeAtBar19,
|
|
62
|
+
gapUp,
|
|
63
|
+
} as const
|
|
64
|
+
|
|
65
|
+
export type FixtureName = keyof typeof FIXTURES
|