@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.
Files changed (578) hide show
  1. package/dist/alerts/createAlertController.d.ts +30 -0
  2. package/dist/alerts/createAlertController.d.ts.map +1 -0
  3. package/dist/alerts/createAlertController.js +261 -0
  4. package/dist/alerts/createAlertController.js.map +1 -0
  5. package/dist/alerts/index.d.ts +5 -0
  6. package/dist/alerts/index.d.ts.map +1 -0
  7. package/dist/alerts/index.js +4 -0
  8. package/dist/alerts/index.js.map +1 -0
  9. package/dist/alerts/predicates.d.ts +28 -0
  10. package/dist/alerts/predicates.d.ts.map +1 -0
  11. package/dist/alerts/predicates.js +211 -0
  12. package/dist/alerts/predicates.js.map +1 -0
  13. package/dist/alerts/rollingVolume.d.ts +15 -0
  14. package/dist/alerts/rollingVolume.d.ts.map +1 -0
  15. package/dist/alerts/rollingVolume.js +42 -0
  16. package/dist/alerts/rollingVolume.js.map +1 -0
  17. package/dist/alerts/ruleSchema.d.ts +42 -0
  18. package/dist/alerts/ruleSchema.d.ts.map +1 -0
  19. package/dist/alerts/ruleSchema.js +240 -0
  20. package/dist/alerts/ruleSchema.js.map +1 -0
  21. package/dist/alerts/types.d.ts +169 -0
  22. package/dist/alerts/types.d.ts.map +1 -0
  23. package/dist/alerts/types.js +24 -0
  24. package/dist/alerts/types.js.map +1 -0
  25. package/dist/chartTypes/heikinAshi.d.ts +49 -0
  26. package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
  27. package/dist/chartTypes/heikinAshi.js +94 -0
  28. package/dist/chartTypes/heikinAshi.js.map +1 -0
  29. package/dist/chartTypes/index.d.ts +6 -0
  30. package/dist/chartTypes/index.d.ts.map +1 -0
  31. package/dist/chartTypes/index.js +5 -0
  32. package/dist/chartTypes/index.js.map +1 -0
  33. package/dist/chartTypes/pointAndFigure.d.ts +83 -0
  34. package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
  35. package/dist/chartTypes/pointAndFigure.js +159 -0
  36. package/dist/chartTypes/pointAndFigure.js.map +1 -0
  37. package/dist/chartTypes/rangeBars.d.ts +61 -0
  38. package/dist/chartTypes/rangeBars.d.ts.map +1 -0
  39. package/dist/chartTypes/rangeBars.js +181 -0
  40. package/dist/chartTypes/rangeBars.js.map +1 -0
  41. package/dist/chartTypes/renko.d.ts +94 -0
  42. package/dist/chartTypes/renko.d.ts.map +1 -0
  43. package/dist/chartTypes/renko.js +207 -0
  44. package/dist/chartTypes/renko.js.map +1 -0
  45. package/dist/chartTypes/types.d.ts +97 -0
  46. package/dist/chartTypes/types.d.ts.map +1 -0
  47. package/dist/chartTypes/types.js +39 -0
  48. package/dist/chartTypes/types.js.map +1 -0
  49. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
  50. package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
  51. package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
  52. package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
  53. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
  54. package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
  55. package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
  56. package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
  57. package/dist/components/anchoredVwap/index.d.ts +11 -0
  58. package/dist/components/anchoredVwap/index.d.ts.map +1 -0
  59. package/dist/components/anchoredVwap/index.js +10 -0
  60. package/dist/components/anchoredVwap/index.js.map +1 -0
  61. package/dist/components/anchoredVwap/types.d.ts +171 -0
  62. package/dist/components/anchoredVwap/types.d.ts.map +1 -0
  63. package/dist/components/anchoredVwap/types.js +25 -0
  64. package/dist/components/anchoredVwap/types.js.map +1 -0
  65. package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
  66. package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
  67. package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
  68. package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
  69. package/dist/components/crosshairSync/index.d.ts +2 -0
  70. package/dist/components/crosshairSync/index.d.ts.map +1 -0
  71. package/dist/components/crosshairSync/index.js +2 -0
  72. package/dist/components/crosshairSync/index.js.map +1 -0
  73. package/dist/components/footprint/aggressor.d.ts +89 -0
  74. package/dist/components/footprint/aggressor.d.ts.map +1 -0
  75. package/dist/components/footprint/aggressor.js +106 -0
  76. package/dist/components/footprint/aggressor.js.map +1 -0
  77. package/dist/components/footprint/createFootprintController.d.ts +29 -0
  78. package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
  79. package/dist/components/footprint/createFootprintController.js +264 -0
  80. package/dist/components/footprint/createFootprintController.js.map +1 -0
  81. package/dist/components/footprint/index.d.ts +7 -0
  82. package/dist/components/footprint/index.d.ts.map +1 -0
  83. package/dist/components/footprint/index.js +4 -0
  84. package/dist/components/footprint/index.js.map +1 -0
  85. package/dist/components/footprint/perBarStats.d.ts +63 -0
  86. package/dist/components/footprint/perBarStats.d.ts.map +1 -0
  87. package/dist/components/footprint/perBarStats.js +123 -0
  88. package/dist/components/footprint/perBarStats.js.map +1 -0
  89. package/dist/components/footprint/types.d.ts +197 -0
  90. package/dist/components/footprint/types.d.ts.map +1 -0
  91. package/dist/components/footprint/types.js +23 -0
  92. package/dist/components/footprint/types.js.map +1 -0
  93. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
  94. package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
  95. package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
  96. package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
  97. package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
  98. package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
  99. package/dist/components/mtfOverlay/createMtfController.js +134 -0
  100. package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
  101. package/dist/components/mtfOverlay/index.d.ts +19 -0
  102. package/dist/components/mtfOverlay/index.d.ts.map +1 -0
  103. package/dist/components/mtfOverlay/index.js +18 -0
  104. package/dist/components/mtfOverlay/index.js.map +1 -0
  105. package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
  106. package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
  107. package/dist/components/mtfOverlay/resampleBars.js +93 -0
  108. package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
  109. package/dist/components/mtfOverlay/types.d.ts +132 -0
  110. package/dist/components/mtfOverlay/types.d.ts.map +1 -0
  111. package/dist/components/mtfOverlay/types.js +22 -0
  112. package/dist/components/mtfOverlay/types.js.map +1 -0
  113. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
  114. package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
  115. package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
  116. package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
  117. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
  118. package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
  119. package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
  120. package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
  121. package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
  122. package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
  123. package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
  124. package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
  125. package/dist/components/orderBookHeatmap/index.d.ts +13 -0
  126. package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
  127. package/dist/components/orderBookHeatmap/index.js +12 -0
  128. package/dist/components/orderBookHeatmap/index.js.map +1 -0
  129. package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
  130. package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
  131. package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
  132. package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
  133. package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
  134. package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
  135. package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
  136. package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
  137. package/dist/components/orderBookHeatmap/types.d.ts +128 -0
  138. package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
  139. package/dist/components/orderBookHeatmap/types.js +16 -0
  140. package/dist/components/orderBookHeatmap/types.js.map +1 -0
  141. package/dist/components/volumeProfile/binning.d.ts +54 -0
  142. package/dist/components/volumeProfile/binning.d.ts.map +1 -0
  143. package/dist/components/volumeProfile/binning.js +123 -0
  144. package/dist/components/volumeProfile/binning.js.map +1 -0
  145. package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
  146. package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
  147. package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
  148. package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
  149. package/dist/components/volumeProfile/index.d.ts +6 -0
  150. package/dist/components/volumeProfile/index.d.ts.map +1 -0
  151. package/dist/components/volumeProfile/index.js +5 -0
  152. package/dist/components/volumeProfile/index.js.map +1 -0
  153. package/dist/components/volumeProfile/poc.d.ts +35 -0
  154. package/dist/components/volumeProfile/poc.d.ts.map +1 -0
  155. package/dist/components/volumeProfile/poc.js +51 -0
  156. package/dist/components/volumeProfile/poc.js.map +1 -0
  157. package/dist/components/volumeProfile/types.d.ts +138 -0
  158. package/dist/components/volumeProfile/types.d.ts.map +1 -0
  159. package/dist/components/volumeProfile/types.js +19 -0
  160. package/dist/components/volumeProfile/types.js.map +1 -0
  161. package/dist/components/volumeProfile/valueArea.d.ts +58 -0
  162. package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
  163. package/dist/components/volumeProfile/valueArea.js +172 -0
  164. package/dist/components/volumeProfile/valueArea.js.map +1 -0
  165. package/dist/controllers/createChartController.d.ts.map +1 -1
  166. package/dist/controllers/createChartController.js +22 -11
  167. package/dist/controllers/createChartController.js.map +1 -1
  168. package/dist/controllers/types.d.ts +3 -1
  169. package/dist/controllers/types.d.ts.map +1 -1
  170. package/dist/data-fetchers/baostock.d.ts.map +1 -1
  171. package/dist/data-fetchers/baostock.js +2 -1
  172. package/dist/data-fetchers/baostock.js.map +1 -1
  173. package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
  174. package/dist/data-fetchers/dataBuffer.effects.js +2 -1
  175. package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
  176. package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
  177. package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
  178. package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
  179. package/dist/data-fetchers/gotdx.js +4 -3
  180. package/dist/data-fetchers/gotdx.js.map +1 -1
  181. package/dist/data-fetchers/router.d.ts.map +1 -1
  182. package/dist/data-fetchers/router.js +4 -3
  183. package/dist/data-fetchers/router.js.map +1 -1
  184. package/dist/data-fetchers/tradingview.js +3 -2
  185. package/dist/data-fetchers/tradingview.js.map +1 -1
  186. package/dist/engine/chart.d.ts +13 -0
  187. package/dist/engine/chart.d.ts.map +1 -1
  188. package/dist/engine/chart.js +109 -0
  189. package/dist/engine/chart.js.map +1 -1
  190. package/dist/engine/data/chartDataManager.d.ts +1 -0
  191. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  192. package/dist/engine/data/chartDataManager.js +27 -4
  193. package/dist/engine/data/chartDataManager.js.map +1 -1
  194. package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
  195. package/dist/engine/drawing/toolConfig.js +2 -1
  196. package/dist/engine/drawing/toolConfig.js.map +1 -1
  197. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  198. package/dist/engine/indicators/chartIndicatorManager.js +2 -1
  199. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  200. package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
  201. package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
  202. package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
  203. package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
  204. package/dist/engine/indicators/indicatorMetadata.js +2 -1
  205. package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
  206. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  207. package/dist/engine/indicators/indicatorRegistry.js +6 -5
  208. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  209. package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
  210. package/dist/engine/indicators/registerBuiltins.js +2 -1
  211. package/dist/engine/indicators/registerBuiltins.js.map +1 -1
  212. package/dist/engine/indicators/scheduler.d.ts +6 -0
  213. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  214. package/dist/engine/indicators/scheduler.js +12 -0
  215. package/dist/engine/indicators/scheduler.js.map +1 -1
  216. package/dist/engine/indicators/soa.d.ts.map +1 -1
  217. package/dist/engine/indicators/soa.js +2 -1
  218. package/dist/engine/indicators/soa.js.map +1 -1
  219. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  220. package/dist/engine/indicators/stateComposer.js +2 -1
  221. package/dist/engine/indicators/stateComposer.js.map +1 -1
  222. package/dist/engine/subPaneManager.d.ts.map +1 -1
  223. package/dist/engine/subPaneManager.js +2 -1
  224. package/dist/engine/subPaneManager.js.map +1 -1
  225. package/dist/engine/utils/chartZoomController.d.ts +2 -0
  226. package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
  227. package/dist/engine/utils/chartZoomController.js +5 -1
  228. package/dist/engine/utils/chartZoomController.js.map +1 -1
  229. package/dist/errors-help.d.ts +72 -0
  230. package/dist/errors-help.d.ts.map +1 -0
  231. package/dist/errors-help.js +149 -0
  232. package/dist/errors-help.js.map +1 -0
  233. package/dist/errors.d.ts +64 -0
  234. package/dist/errors.d.ts.map +1 -0
  235. package/dist/errors.js +61 -0
  236. package/dist/errors.js.map +1 -0
  237. package/dist/index.d.ts +18 -0
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +22 -0
  240. package/dist/index.js.map +1 -1
  241. package/dist/indicators/alma.d.ts +27 -0
  242. package/dist/indicators/alma.d.ts.map +1 -0
  243. package/dist/indicators/alma.js +36 -0
  244. package/dist/indicators/alma.js.map +1 -0
  245. package/dist/indicators/awesomeOscillator.d.ts +19 -0
  246. package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
  247. package/dist/indicators/awesomeOscillator.js +36 -0
  248. package/dist/indicators/awesomeOscillator.js.map +1 -0
  249. package/dist/indicators/dpo.d.ts +17 -0
  250. package/dist/indicators/dpo.d.ts.map +1 -0
  251. package/dist/indicators/dpo.js +24 -0
  252. package/dist/indicators/dpo.js.map +1 -0
  253. package/dist/indicators/fisherTransform.d.ts +26 -0
  254. package/dist/indicators/fisherTransform.d.ts.map +1 -0
  255. package/dist/indicators/fisherTransform.js +44 -0
  256. package/dist/indicators/fisherTransform.js.map +1 -0
  257. package/dist/indicators/frama.d.ts +25 -0
  258. package/dist/indicators/frama.d.ts.map +1 -0
  259. package/dist/indicators/frama.js +61 -0
  260. package/dist/indicators/frama.js.map +1 -0
  261. package/dist/indicators/index.d.ts +24 -0
  262. package/dist/indicators/index.d.ts.map +1 -0
  263. package/dist/indicators/index.js +26 -0
  264. package/dist/indicators/index.js.map +1 -0
  265. package/dist/indicators/lsma.d.ts +21 -0
  266. package/dist/indicators/lsma.d.ts.map +1 -0
  267. package/dist/indicators/lsma.js +37 -0
  268. package/dist/indicators/lsma.js.map +1 -0
  269. package/dist/indicators/schaffTrendCycle.d.ts +24 -0
  270. package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
  271. package/dist/indicators/schaffTrendCycle.js +70 -0
  272. package/dist/indicators/schaffTrendCycle.js.map +1 -0
  273. package/dist/indicators/stochRSI.d.ts +24 -0
  274. package/dist/indicators/stochRSI.d.ts.map +1 -0
  275. package/dist/indicators/stochRSI.js +86 -0
  276. package/dist/indicators/stochRSI.js.map +1 -0
  277. package/dist/indicators/t3.d.ts +31 -0
  278. package/dist/indicators/t3.d.ts.map +1 -0
  279. package/dist/indicators/t3.js +63 -0
  280. package/dist/indicators/t3.js.map +1 -0
  281. package/dist/indicators/ultimateOscillator.d.ts +26 -0
  282. package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
  283. package/dist/indicators/ultimateOscillator.js +59 -0
  284. package/dist/indicators/ultimateOscillator.js.map +1 -0
  285. package/dist/indicators/vidya.d.ts +24 -0
  286. package/dist/indicators/vidya.d.ts.map +1 -0
  287. package/dist/indicators/vidya.js +54 -0
  288. package/dist/indicators/vidya.js.map +1 -0
  289. package/dist/indicators/zlema.d.ts +16 -0
  290. package/dist/indicators/zlema.d.ts.map +1 -0
  291. package/dist/indicators/zlema.js +26 -0
  292. package/dist/indicators/zlema.js.map +1 -0
  293. package/dist/input/gesture.d.ts +125 -0
  294. package/dist/input/gesture.d.ts.map +1 -0
  295. package/dist/input/gesture.js +249 -0
  296. package/dist/input/gesture.js.map +1 -0
  297. package/dist/input/index.d.ts +9 -0
  298. package/dist/input/index.d.ts.map +1 -0
  299. package/dist/input/index.js +9 -0
  300. package/dist/input/index.js.map +1 -0
  301. package/dist/input/keyboard.d.ts +140 -0
  302. package/dist/input/keyboard.d.ts.map +1 -0
  303. package/dist/input/keyboard.js +260 -0
  304. package/dist/input/keyboard.js.map +1 -0
  305. package/dist/mcp/chartBridge.d.ts +2 -2
  306. package/dist/mcp/chartBridge.d.ts.map +1 -1
  307. package/dist/mcp/chartBridge.js +27 -21
  308. package/dist/mcp/chartBridge.js.map +1 -1
  309. package/dist/plugin/PluginHost.d.ts +0 -3
  310. package/dist/plugin/PluginHost.d.ts.map +1 -1
  311. package/dist/plugin/PluginHost.js +7 -3
  312. package/dist/plugin/PluginHost.js.map +1 -1
  313. package/dist/plugin/PluginRegistry.d.ts +0 -3
  314. package/dist/plugin/PluginRegistry.d.ts.map +1 -1
  315. package/dist/plugin/PluginRegistry.js +5 -1
  316. package/dist/plugin/PluginRegistry.js.map +1 -1
  317. package/dist/render/Renderer.d.ts +116 -0
  318. package/dist/render/Renderer.d.ts.map +1 -0
  319. package/dist/render/Renderer.js +31 -0
  320. package/dist/render/Renderer.js.map +1 -0
  321. package/dist/render/SurfaceBackend.d.ts +83 -0
  322. package/dist/render/SurfaceBackend.d.ts.map +1 -0
  323. package/dist/render/SurfaceBackend.js +27 -0
  324. package/dist/render/SurfaceBackend.js.map +1 -0
  325. package/dist/render/index.d.ts +12 -0
  326. package/dist/render/index.d.ts.map +1 -0
  327. package/dist/render/index.js +11 -0
  328. package/dist/render/index.js.map +1 -0
  329. package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
  330. package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
  331. package/dist/renderer-tier/detectRendererTier.js +143 -0
  332. package/dist/renderer-tier/detectRendererTier.js.map +1 -0
  333. package/dist/renderer-tier/index.d.ts +12 -0
  334. package/dist/renderer-tier/index.d.ts.map +1 -0
  335. package/dist/renderer-tier/index.js +12 -0
  336. package/dist/renderer-tier/index.js.map +1 -0
  337. package/dist/renderer-tier/selectBackend.d.ts +106 -0
  338. package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
  339. package/dist/renderer-tier/selectBackend.js +113 -0
  340. package/dist/renderer-tier/selectBackend.js.map +1 -0
  341. package/dist/renderer-tier/types.d.ts +50 -0
  342. package/dist/renderer-tier/types.d.ts.map +1 -0
  343. package/dist/renderer-tier/types.js +24 -0
  344. package/dist/renderer-tier/types.js.map +1 -0
  345. package/dist/replay/createReplayController.d.ts +3 -0
  346. package/dist/replay/createReplayController.d.ts.map +1 -0
  347. package/dist/replay/createReplayController.js +251 -0
  348. package/dist/replay/createReplayController.js.map +1 -0
  349. package/dist/replay/index.d.ts +5 -0
  350. package/dist/replay/index.d.ts.map +1 -0
  351. package/dist/replay/index.js +3 -0
  352. package/dist/replay/index.js.map +1 -0
  353. package/dist/replay/timeline.d.ts +50 -0
  354. package/dist/replay/timeline.d.ts.map +1 -0
  355. package/dist/replay/timeline.js +104 -0
  356. package/dist/replay/timeline.js.map +1 -0
  357. package/dist/replay/types.d.ts +94 -0
  358. package/dist/replay/types.d.ts.map +1 -0
  359. package/dist/replay/types.js +21 -0
  360. package/dist/replay/types.js.map +1 -0
  361. package/dist/scale/anchoredZoom.d.ts +64 -0
  362. package/dist/scale/anchoredZoom.d.ts.map +1 -0
  363. package/dist/scale/anchoredZoom.js +67 -0
  364. package/dist/scale/anchoredZoom.js.map +1 -0
  365. package/dist/scale/createPriceScale.d.ts +49 -0
  366. package/dist/scale/createPriceScale.d.ts.map +1 -0
  367. package/dist/scale/createPriceScale.js +175 -0
  368. package/dist/scale/createPriceScale.js.map +1 -0
  369. package/dist/scale/createTimeScale.d.ts +27 -0
  370. package/dist/scale/createTimeScale.d.ts.map +1 -0
  371. package/dist/scale/createTimeScale.js +139 -0
  372. package/dist/scale/createTimeScale.js.map +1 -0
  373. package/dist/scale/index.d.ts +6 -0
  374. package/dist/scale/index.d.ts.map +1 -0
  375. package/dist/scale/index.js +5 -0
  376. package/dist/scale/index.js.map +1 -0
  377. package/dist/scale/originShift.d.ts +69 -0
  378. package/dist/scale/originShift.d.ts.map +1 -0
  379. package/dist/scale/originShift.js +41 -0
  380. package/dist/scale/originShift.js.map +1 -0
  381. package/dist/scale/types.d.ts +90 -0
  382. package/dist/scale/types.d.ts.map +1 -0
  383. package/dist/scale/types.js +17 -0
  384. package/dist/scale/types.js.map +1 -0
  385. package/dist/scene/createScene.d.ts +22 -0
  386. package/dist/scene/createScene.d.ts.map +1 -0
  387. package/dist/scene/createScene.js +114 -0
  388. package/dist/scene/createScene.js.map +1 -0
  389. package/dist/scene/index.d.ts +13 -0
  390. package/dist/scene/index.d.ts.map +1 -0
  391. package/dist/scene/index.js +11 -0
  392. package/dist/scene/index.js.map +1 -0
  393. package/dist/scene/layerRegistry.d.ts +83 -0
  394. package/dist/scene/layerRegistry.d.ts.map +1 -0
  395. package/dist/scene/layerRegistry.js +43 -0
  396. package/dist/scene/layerRegistry.js.map +1 -0
  397. package/dist/scene/types.d.ts +128 -0
  398. package/dist/scene/types.d.ts.map +1 -0
  399. package/dist/scene/types.js +21 -0
  400. package/dist/scene/types.js.map +1 -0
  401. package/dist/scheduler/createFrameBudget.d.ts +91 -0
  402. package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
  403. package/dist/scheduler/createFrameBudget.js +232 -0
  404. package/dist/scheduler/createFrameBudget.js.map +1 -0
  405. package/dist/scheduler/index.d.ts +2 -0
  406. package/dist/scheduler/index.d.ts.map +1 -0
  407. package/dist/scheduler/index.js +2 -0
  408. package/dist/scheduler/index.js.map +1 -0
  409. package/dist/tokens/themeToCssVars.d.ts.map +1 -1
  410. package/dist/tokens/themeToCssVars.js +2 -28
  411. package/dist/tokens/themeToCssVars.js.map +1 -1
  412. package/dist/version.d.ts +1 -1
  413. package/dist/version.d.ts.map +1 -1
  414. package/dist/version.js +1 -1
  415. package/dist/version.js.map +1 -1
  416. package/package.json +1 -1
  417. package/src/__bench__/indicators.bench.ts +215 -0
  418. package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
  419. package/src/__bench__/scale.bench.ts +80 -0
  420. package/src/__bench__/signal.bench.ts +41 -0
  421. package/src/__bench__/volumeProfile.bench.ts +66 -0
  422. package/src/__tests__/errors-help.test.ts +184 -0
  423. package/src/__tests__/errors.test.ts +187 -0
  424. package/src/alerts/__tests__/controller.test.ts +231 -0
  425. package/src/alerts/__tests__/predicates.test.ts +374 -0
  426. package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
  427. package/src/alerts/createAlertController.ts +312 -0
  428. package/src/alerts/index.ts +18 -0
  429. package/src/alerts/predicates.ts +231 -0
  430. package/src/alerts/rollingVolume.ts +51 -0
  431. package/src/alerts/ruleSchema.ts +278 -0
  432. package/src/alerts/types.ts +177 -0
  433. package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
  434. package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
  435. package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
  436. package/src/chartTypes/__tests__/renko.test.ts +160 -0
  437. package/src/chartTypes/heikinAshi.ts +116 -0
  438. package/src/chartTypes/index.ts +5 -0
  439. package/src/chartTypes/pointAndFigure.ts +278 -0
  440. package/src/chartTypes/rangeBars.ts +303 -0
  441. package/src/chartTypes/renko.ts +311 -0
  442. package/src/chartTypes/types.ts +99 -0
  443. package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
  444. package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
  445. package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
  446. package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
  447. package/src/components/anchoredVwap/index.ts +17 -0
  448. package/src/components/anchoredVwap/types.ts +187 -0
  449. package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
  450. package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
  451. package/src/components/crosshairSync/index.ts +5 -0
  452. package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
  453. package/src/components/footprint/__tests__/controller.test.ts +130 -0
  454. package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
  455. package/src/components/footprint/aggressor.ts +165 -0
  456. package/src/components/footprint/createFootprintController.ts +338 -0
  457. package/src/components/footprint/index.ts +21 -0
  458. package/src/components/footprint/perBarStats.ts +137 -0
  459. package/src/components/footprint/types.ts +232 -0
  460. package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
  461. package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
  462. package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
  463. package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
  464. package/src/components/mtfOverlay/createMtfController.ts +180 -0
  465. package/src/components/mtfOverlay/index.ts +26 -0
  466. package/src/components/mtfOverlay/resampleBars.ts +134 -0
  467. package/src/components/mtfOverlay/types.ts +148 -0
  468. package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
  469. package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
  470. package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
  471. package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
  472. package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
  473. package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
  474. package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
  475. package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
  476. package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
  477. package/src/components/orderBookHeatmap/index.ts +25 -0
  478. package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
  479. package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
  480. package/src/components/orderBookHeatmap/types.ts +168 -0
  481. package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
  482. package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
  483. package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
  484. package/src/components/volumeProfile/binning.ts +133 -0
  485. package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
  486. package/src/components/volumeProfile/index.ts +12 -0
  487. package/src/components/volumeProfile/poc.ts +53 -0
  488. package/src/components/volumeProfile/types.ts +148 -0
  489. package/src/components/volumeProfile/valueArea.ts +187 -0
  490. package/src/controllers/createChartController.ts +23 -10
  491. package/src/controllers/types.ts +5 -1
  492. package/src/data-fetchers/baostock.ts +2 -1
  493. package/src/data-fetchers/dataBuffer.effects.ts +3 -1
  494. package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
  495. package/src/data-fetchers/gotdx.ts +4 -3
  496. package/src/data-fetchers/router.ts +6 -3
  497. package/src/data-fetchers/tradingview.ts +3 -2
  498. package/src/engine/chart.ts +126 -3
  499. package/src/engine/data/chartDataManager.ts +26 -4
  500. package/src/engine/drawing/toolConfig.ts +2 -1
  501. package/src/engine/indicators/chartIndicatorManager.ts +2 -1
  502. package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
  503. package/src/engine/indicators/indicatorMetadata.ts +2 -1
  504. package/src/engine/indicators/indicatorRegistry.ts +6 -5
  505. package/src/engine/indicators/registerBuiltins.ts +2 -1
  506. package/src/engine/indicators/scheduler.ts +15 -0
  507. package/src/engine/indicators/soa.ts +2 -1
  508. package/src/engine/indicators/stateComposer.ts +2 -1
  509. package/src/engine/subPaneManager.ts +2 -1
  510. package/src/engine/utils/chartZoomController.ts +7 -1
  511. package/src/errors-help.ts +218 -0
  512. package/src/errors.ts +128 -0
  513. package/src/index.ts +37 -0
  514. package/src/indicators/__tests__/maFamily.test.ts +159 -0
  515. package/src/indicators/__tests__/oscillators.test.ts +150 -0
  516. package/src/indicators/alma.ts +61 -0
  517. package/src/indicators/awesomeOscillator.ts +54 -0
  518. package/src/indicators/dpo.ts +37 -0
  519. package/src/indicators/fisherTransform.ts +63 -0
  520. package/src/indicators/frama.ts +87 -0
  521. package/src/indicators/index.ts +39 -0
  522. package/src/indicators/lsma.ts +58 -0
  523. package/src/indicators/schaffTrendCycle.ts +92 -0
  524. package/src/indicators/stochRSI.ts +108 -0
  525. package/src/indicators/t3.ts +96 -0
  526. package/src/indicators/ultimateOscillator.ts +83 -0
  527. package/src/indicators/vidya.ts +80 -0
  528. package/src/indicators/zlema.ts +41 -0
  529. package/src/input/__tests__/gesture.test.ts +271 -0
  530. package/src/input/__tests__/keyboard.test.ts +317 -0
  531. package/src/input/gesture.ts +357 -0
  532. package/src/input/index.ts +26 -0
  533. package/src/input/keyboard.ts +373 -0
  534. package/src/mcp/chartBridge.ts +98 -72
  535. package/src/plugin/PluginHost.ts +4 -3
  536. package/src/plugin/PluginRegistry.ts +2 -1
  537. package/src/render/Renderer.ts +127 -0
  538. package/src/render/SurfaceBackend.ts +94 -0
  539. package/src/render/__tests__/contract.test.ts +176 -0
  540. package/src/render/index.ts +27 -0
  541. package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
  542. package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
  543. package/src/renderer-tier/detectRendererTier.ts +168 -0
  544. package/src/renderer-tier/index.ts +30 -0
  545. package/src/renderer-tier/selectBackend.ts +201 -0
  546. package/src/renderer-tier/types.ts +59 -0
  547. package/src/replay/__tests__/controller.test.ts +309 -0
  548. package/src/replay/__tests__/timeline.test.ts +99 -0
  549. package/src/replay/createReplayController.ts +302 -0
  550. package/src/replay/index.ts +15 -0
  551. package/src/replay/timeline.ts +106 -0
  552. package/src/replay/types.ts +107 -0
  553. package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
  554. package/src/scale/__tests__/originShift.test.ts +97 -0
  555. package/src/scale/__tests__/priceScale.test.ts +219 -0
  556. package/src/scale/__tests__/timeScale.test.ts +119 -0
  557. package/src/scale/anchoredZoom.ts +104 -0
  558. package/src/scale/createPriceScale.ts +226 -0
  559. package/src/scale/createTimeScale.ts +150 -0
  560. package/src/scale/index.ts +9 -0
  561. package/src/scale/originShift.ts +111 -0
  562. package/src/scale/types.ts +100 -0
  563. package/src/scene/__tests__/layerRegistry.test.ts +207 -0
  564. package/src/scene/__tests__/scene.test.ts +411 -0
  565. package/src/scene/createScene.ts +117 -0
  566. package/src/scene/index.ts +29 -0
  567. package/src/scene/layerRegistry.ts +117 -0
  568. package/src/scene/types.ts +143 -0
  569. package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
  570. package/src/scheduler/createFrameBudget.ts +316 -0
  571. package/src/scheduler/index.ts +7 -0
  572. package/src/tokens/themeToCssVars.ts +3 -1
  573. package/src/version.ts +1 -1
  574. package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
  575. package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
  576. package/dist/data-fetchers/gotdx/gotdx.js +0 -7
  577. package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
  578. package/src/data-fetchers/gotdx/gotdx.ts +0 -6
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Oscillator completion pack tests (B-10).
3
+ *
4
+ * Mixed input signatures across the 6:
5
+ * - close-only: StochRSI, DPO, STC
6
+ * - HL bars : AO, Fisher Transform
7
+ * - OHLC bars : UO
8
+ */
9
+
10
+ import { describe, it, expect } from 'vitest'
11
+ import { computeStochRSI } from '../stochRSI'
12
+ import { computeAwesomeOscillator } from '../awesomeOscillator'
13
+ import { computeUltimateOscillator } from '../ultimateOscillator'
14
+ import { computeDPO } from '../dpo'
15
+ import { computeFisherTransform } from '../fisherTransform'
16
+ import { computeSchaffTrendCycle } from '../schaffTrendCycle'
17
+
18
+ function ramp(n: number, start = 1, step = 1): number[] {
19
+ return Array.from({ length: n }, (_, i) => start + step * i)
20
+ }
21
+
22
+ function constantClose(n: number, v: number): number[] {
23
+ return Array.from({ length: n }, () => v)
24
+ }
25
+
26
+ function hlBars(n: number, mid = 100, spread = 1): Array<{ high: number; low: number }> {
27
+ return Array.from({ length: n }, (_, i) => ({
28
+ high: mid + i * 0.1 + spread / 2,
29
+ low: mid + i * 0.1 - spread / 2,
30
+ }))
31
+ }
32
+
33
+ function ohlcRamp(n: number, start = 100, step = 0.5): Array<{ high: number; low: number; close: number }> {
34
+ return Array.from({ length: n }, (_, i) => {
35
+ const c = start + step * i
36
+ return { high: c + 0.5, low: c - 0.5, close: c }
37
+ })
38
+ }
39
+
40
+ describe('computeStochRSI', () => {
41
+ it('output length === input length and produces values in 0..100', () => {
42
+ const { k, d } = computeStochRSI(ramp(60), {
43
+ rsiPeriod: 14,
44
+ stochPeriod: 14,
45
+ })
46
+ expect(k.length).toBe(60)
47
+ expect(d.length).toBe(60)
48
+ for (let i = 30; i < 60; i++) {
49
+ const v = k[i]
50
+ if (!Number.isNaN(v as number)) {
51
+ expect(v).toBeGreaterThanOrEqual(0)
52
+ expect(v).toBeLessThanOrEqual(100)
53
+ }
54
+ }
55
+ })
56
+
57
+ it('throws on invalid period args', () => {
58
+ expect(() => computeStochRSI(ramp(20), { rsiPeriod: 1, stochPeriod: 10 })).toThrow()
59
+ expect(() => computeStochRSI(ramp(20), { rsiPeriod: 14, stochPeriod: 1 })).toThrow()
60
+ })
61
+ })
62
+
63
+ describe('computeAwesomeOscillator', () => {
64
+ it('output length === input length, leading NaN until slow window primed', () => {
65
+ const r = computeAwesomeOscillator(hlBars(60), { fast: 5, slow: 34 })
66
+ expect(r.length).toBe(60)
67
+ for (let i = 0; i < 33; i++) expect(Number.isNaN(r[i] as number)).toBe(true)
68
+ expect(Number.isNaN(r[33] as number)).toBe(false)
69
+ })
70
+
71
+ it('on a steady linear trend, AO is positive once primed (fast > slow)', () => {
72
+ const r = computeAwesomeOscillator(hlBars(60, 100, 1), { fast: 5, slow: 34 })
73
+ for (let i = 34; i < 60; i++) expect(r[i]).toBeGreaterThan(0)
74
+ })
75
+
76
+ it('rejects fast >= slow', () => {
77
+ expect(() => computeAwesomeOscillator(hlBars(60), { fast: 10, slow: 10 })).toThrow()
78
+ })
79
+ })
80
+
81
+ describe('computeUltimateOscillator', () => {
82
+ it('output length === input length and 0..100 once primed', () => {
83
+ const r = computeUltimateOscillator(ohlcRamp(80), { p1: 7, p2: 14, p3: 28 })
84
+ expect(r.length).toBe(80)
85
+ for (let i = 30; i < 80; i++) {
86
+ const v = r[i] as number
87
+ expect(v).toBeGreaterThanOrEqual(0)
88
+ expect(v).toBeLessThanOrEqual(100)
89
+ }
90
+ })
91
+
92
+ it('rejects non-positive periods', () => {
93
+ expect(() => computeUltimateOscillator(ohlcRamp(50), { p1: 0 })).toThrow()
94
+ })
95
+ })
96
+
97
+ describe('computeDPO', () => {
98
+ it('output length === input length and constant input → ~0 once primed', () => {
99
+ const r = computeDPO(constantClose(40, 50), { period: 10 })
100
+ expect(r.length).toBe(40)
101
+ for (let i = 14; i < 40; i++) expect(r[i]!).toBeCloseTo(0, 9)
102
+ })
103
+
104
+ it('rejects period < 2', () => {
105
+ expect(() => computeDPO(ramp(20), { period: 1 })).toThrow()
106
+ })
107
+ })
108
+
109
+ describe('computeFisherTransform', () => {
110
+ it('output length === input length; values primed after period', () => {
111
+ const r = computeFisherTransform(hlBars(50), { period: 10 })
112
+ expect(r.fisher.length).toBe(50)
113
+ expect(r.trigger.length).toBe(50)
114
+ for (let i = 0; i < 9; i++) expect(Number.isNaN(r.fisher[i] as number)).toBe(true)
115
+ expect(Number.isNaN(r.fisher[10] as number)).toBe(false)
116
+ })
117
+
118
+ it('trigger == fisher shifted one bar', () => {
119
+ const r = computeFisherTransform(hlBars(50), { period: 10 })
120
+ for (let i = 12; i < 49; i++) {
121
+ // trigger[i] is set to previous fisher value before the new fisher is committed.
122
+ // We can confirm via the relationship inside the producer loop.
123
+ const t = r.trigger[i + 1]
124
+ const f = r.fisher[i]
125
+ if (!Number.isNaN(t as number) && !Number.isNaN(f as number)) {
126
+ expect(t).toBeCloseTo(f as number, 12)
127
+ }
128
+ }
129
+ })
130
+ })
131
+
132
+ describe('computeSchaffTrendCycle', () => {
133
+ it('output length === input length and values in [0, 100]', () => {
134
+ const r = computeSchaffTrendCycle(ramp(100), { fast: 23, slow: 50, cycle: 10, factor: 0.5 })
135
+ expect(r.length).toBe(100)
136
+ for (let i = 70; i < 100; i++) {
137
+ const v = r[i] as number
138
+ if (!Number.isNaN(v)) {
139
+ expect(v).toBeGreaterThanOrEqual(0)
140
+ expect(v).toBeLessThanOrEqual(100)
141
+ }
142
+ }
143
+ })
144
+
145
+ it('rejects bad args', () => {
146
+ expect(() => computeSchaffTrendCycle(ramp(30), { fast: 50, slow: 23 })).toThrow()
147
+ expect(() => computeSchaffTrendCycle(ramp(30), { cycle: 1 })).toThrow()
148
+ expect(() => computeSchaffTrendCycle(ramp(30), { factor: 0 })).toThrow()
149
+ })
150
+ })
@@ -0,0 +1,61 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * ALMA — Arnaud Legoux Moving Average.
4
+ *
5
+ * Public reference: Legoux & Beneduce, "ALMA Indicator Description" (2009).
6
+ *
7
+ * Weighted MA where weights are a Gaussian centred at `offset * (period-1)`
8
+ * (default 0.85 = near the right edge), spread parameter `sigma` (default 6).
9
+ *
10
+ * m = offset * (period - 1)
11
+ * s = period / sigma
12
+ * w[k] = exp(-(k - m)^2 / (2 * s^2)) for k in 0..period-1
13
+ * alma[i] = sum(w[k] * price[i - k]) / sum(w[k])
14
+ *
15
+ * `offset` near 1 follows price tightly (short lag); near 0 smooths heavily.
16
+ * `sigma` controls the bell width — lower = sharper centre.
17
+ *
18
+ * Output length === input length. Indices < period - 1 are NaN.
19
+ */
20
+
21
+ export interface AlmaOptions {
22
+ period: number
23
+ /** Default 0.85 — fractional position of the Gaussian centre, in [0, 1]. */
24
+ offset?: number
25
+ /** Default 6 — bell width parameter. Must be > 0. */
26
+ sigma?: number
27
+ }
28
+
29
+ export function computeALMA(prices: ReadonlyArray<number>, opts: AlmaOptions): Float64Array {
30
+ const { period } = opts
31
+ const offset = opts.offset ?? 0.85
32
+ const sigma = opts.sigma ?? 6
33
+ if (period < 1 || !Number.isFinite(period)) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeALMA: period must be >= 1')
34
+ if (sigma <= 0 || !Number.isFinite(sigma)) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeALMA: sigma must be > 0')
35
+ if (offset < 0 || offset > 1) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeALMA: offset must be in [0, 1]')
36
+
37
+ const out = new Float64Array(prices.length)
38
+ const m = offset * (period - 1)
39
+ const s = period / sigma
40
+ const denom = 2 * s * s
41
+ const weights = new Float64Array(period)
42
+ let wsum = 0
43
+ for (let k = 0; k < period; k++) {
44
+ const w = Math.exp(-((k - m) * (k - m)) / denom)
45
+ weights[k] = w
46
+ wsum += w
47
+ }
48
+
49
+ for (let i = 0; i < prices.length; i++) {
50
+ if (i < period - 1) {
51
+ out[i] = Number.NaN
52
+ continue
53
+ }
54
+ let acc = 0
55
+ for (let k = 0; k < period; k++) {
56
+ acc += (weights[k] as number) * (prices[i - k] as number)
57
+ }
58
+ out[i] = acc / wsum
59
+ }
60
+ return out
61
+ }
@@ -0,0 +1,54 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * Awesome Oscillator — Bill Williams.
4
+ *
5
+ * median[i] = (high[i] + low[i]) / 2
6
+ * AO[i] = SMA(median, fast) - SMA(median, slow)
7
+ *
8
+ * Defaults: fast=5, slow=34.
9
+ *
10
+ * Output: `Float64Array` of length === input. NaN leading.
11
+ */
12
+
13
+ export interface AwesomeOscillatorOptions {
14
+ fast?: number
15
+ slow?: number
16
+ }
17
+
18
+ export function computeAwesomeOscillator(
19
+ bars: ReadonlyArray<{ high: number; low: number }>,
20
+ opts: AwesomeOscillatorOptions = {},
21
+ ): Float64Array {
22
+ const fast = opts.fast ?? 5
23
+ const slow = opts.slow ?? 34
24
+ if (fast < 1 || slow < 1 || fast >= slow) {
25
+ throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeAwesomeOscillator: require 1 <= fast < slow')
26
+ }
27
+ const n = bars.length
28
+ const med = new Float64Array(n)
29
+ for (let i = 0; i < n; i++) {
30
+ const b = bars[i] as { high: number; low: number }
31
+ med[i] = (b.high + b.low) / 2
32
+ }
33
+ const sf = simpleSMA(med, fast)
34
+ const ss = simpleSMA(med, slow)
35
+ const out = new Float64Array(n)
36
+ for (let i = 0; i < n; i++) {
37
+ const a = sf[i] as number
38
+ const b = ss[i] as number
39
+ out[i] = Number.isNaN(a) || Number.isNaN(b) ? Number.NaN : a - b
40
+ }
41
+ return out
42
+ }
43
+
44
+ function simpleSMA(input: Float64Array, period: number): Float64Array {
45
+ const n = input.length
46
+ const out = new Float64Array(n)
47
+ let acc = 0
48
+ for (let i = 0; i < n; i++) {
49
+ acc += input[i] as number
50
+ if (i >= period) acc -= input[i - period] as number
51
+ out[i] = i < period - 1 ? Number.NaN : acc / period
52
+ }
53
+ return out
54
+ }
@@ -0,0 +1,37 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * DPO — Detrended Price Oscillator.
4
+ *
5
+ * shift = floor(period / 2) + 1
6
+ * sma = SMA(close, period)
7
+ * DPO[i] = close[i - shift] - sma[i]
8
+ *
9
+ * The shift makes DPO a centred oscillator: the trend (SMA) is removed
10
+ * at a centred lag so the result is a cleaner cycle indicator.
11
+ *
12
+ * Output: `Float64Array` length === input. NaN until index >= period + shift.
13
+ */
14
+
15
+ export interface DpoOptions {
16
+ period: number
17
+ }
18
+
19
+ export function computeDPO(prices: ReadonlyArray<number>, opts: DpoOptions): Float64Array {
20
+ const { period } = opts
21
+ if (period < 2 || !Number.isFinite(period)) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeDPO: period must be >= 2')
22
+ const n = prices.length
23
+ const out = new Float64Array(n)
24
+ out.fill(Number.NaN)
25
+ const shift = Math.floor(period / 2) + 1
26
+
27
+ let acc = 0
28
+ for (let i = 0; i < n; i++) {
29
+ acc += prices[i] as number
30
+ if (i >= period) acc -= prices[i - period] as number
31
+ if (i < period - 1) continue
32
+ const sma = acc / period
33
+ const back = i - shift
34
+ if (back >= 0) out[i] = (prices[back] as number) - sma
35
+ }
36
+ return out
37
+ }
@@ -0,0 +1,63 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * Fisher Transform — John Ehlers (2002).
4
+ *
5
+ * Maps price into a near-Gaussian distribution to make turning points sharper:
6
+ *
7
+ * med[i] = (high[i] + low[i]) / 2
8
+ * hi[i] = max(med, period)
9
+ * lo[i] = min(med, period)
10
+ * raw[i] = 0.5 * 2 * ((med - lo) / (hi - lo) - 0.5) (in [-1, 1))
11
+ * v[i] = clip(0.33 * raw + 0.67 * v[i-1], -0.999, 0.999)
12
+ * fish[i] = 0.5 * ln((1 + v) / (1 - v)) + 0.5 * fish[i-1]
13
+ *
14
+ * Output: `{ fisher, trigger }` parallel arrays. `trigger` is `fisher`
15
+ * shifted one bar (a common companion plot).
16
+ */
17
+
18
+ export interface FisherTransformOptions {
19
+ period: number
20
+ }
21
+
22
+ export function computeFisherTransform(
23
+ bars: ReadonlyArray<{ high: number; low: number }>,
24
+ opts: FisherTransformOptions,
25
+ ): { fisher: Float64Array; trigger: Float64Array } {
26
+ const { period } = opts
27
+ if (period < 2 || !Number.isFinite(period)) {
28
+ throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeFisherTransform: period must be >= 2')
29
+ }
30
+ const n = bars.length
31
+ const fisher = new Float64Array(n)
32
+ const trigger = new Float64Array(n)
33
+ fisher.fill(Number.NaN)
34
+ trigger.fill(Number.NaN)
35
+
36
+ let v = 0
37
+ let f = 0
38
+
39
+ for (let i = 0; i < n; i++) {
40
+ if (i < period - 1) continue
41
+ let hi = -Infinity
42
+ let lo = Infinity
43
+ for (let j = i - period + 1; j <= i; j++) {
44
+ const b = bars[j] as { high: number; low: number }
45
+ const med = (b.high + b.low) / 2
46
+ if (med > hi) hi = med
47
+ if (med < lo) lo = med
48
+ }
49
+ const b = bars[i] as { high: number; low: number }
50
+ const medCur = (b.high + b.low) / 2
51
+ const denom = hi - lo
52
+ const norm = denom === 0 ? 0 : (medCur - lo) / denom // [0, 1]
53
+ const raw = 2 * (norm - 0.5) // [-1, 1]
54
+ v = 0.33 * raw + 0.67 * v
55
+ if (v > 0.999) v = 0.999
56
+ if (v < -0.999) v = -0.999
57
+ const fNew = 0.5 * Math.log((1 + v) / (1 - v)) + 0.5 * f
58
+ trigger[i] = f // previous fisher serves as trigger
59
+ f = fNew
60
+ fisher[i] = f
61
+ }
62
+ return { fisher, trigger }
63
+ }
@@ -0,0 +1,87 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * FRAMA — Fractal Adaptive Moving Average (John Ehlers, 2005).
4
+ *
5
+ * Estimates the fractal dimension D of price over the last `period` bars
6
+ * (split into two halves) and uses it to adapt an EMA smoothing constant:
7
+ *
8
+ * N1 = (max(H_first_half) - min(H_first_half)) / (period/2)
9
+ * N2 = (max(H_second_half) - min(H_second_half)) / (period/2)
10
+ * N3 = (max(H_full) - min(H_full)) / period
11
+ * D = (log(N1 + N2) - log(N3)) / log(2)
12
+ * alpha = exp(-4.6 * (D - 1))
13
+ * FRAMA = alpha * price + (1 - alpha) * FRAMA_prev
14
+ *
15
+ * Output length === input length. Indices < period are NaN.
16
+ *
17
+ * Note: Ehlers's original uses H (high) and L (low) separately for each
18
+ * range. With close-only input we use price extrema as a faithful
19
+ * close-input approximation — documented divergence vs the H/L variant.
20
+ */
21
+
22
+ export interface FramaOptions {
23
+ /** Must be EVEN and >= 4. Default 16. */
24
+ period: number
25
+ }
26
+
27
+ function rangeMaxMin(arr: ReadonlyArray<number>, start: number, end: number): {
28
+ max: number
29
+ min: number
30
+ } {
31
+ let max = -Infinity
32
+ let min = Infinity
33
+ for (let i = start; i < end; i++) {
34
+ const v = arr[i] as number
35
+ if (v > max) max = v
36
+ if (v < min) min = v
37
+ }
38
+ return { max, min }
39
+ }
40
+
41
+ export function computeFRAMA(prices: ReadonlyArray<number>, opts: FramaOptions): Float64Array {
42
+ const { period } = opts
43
+ if (period < 4 || period % 2 !== 0 || !Number.isFinite(period)) {
44
+ throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeFRAMA: period must be even and >= 4')
45
+ }
46
+
47
+ const n = prices.length
48
+ const out = new Float64Array(n)
49
+ const half = period >> 1
50
+ let prev = Number.NaN
51
+
52
+ for (let i = 0; i < n; i++) {
53
+ if (i < period - 1) {
54
+ out[i] = Number.NaN
55
+ continue
56
+ }
57
+ const fullStart = i - period + 1
58
+ const midStart = i - half + 1
59
+ const r1 = rangeMaxMin(prices, fullStart, fullStart + half)
60
+ const r2 = rangeMaxMin(prices, midStart, midStart + half)
61
+ const rF = rangeMaxMin(prices, fullStart, fullStart + period)
62
+ const N1 = (r1.max - r1.min) / half
63
+ const N2 = (r2.max - r2.min) / half
64
+ const N3 = (rF.max - rF.min) / period
65
+
66
+ let alpha: number
67
+ if (N1 <= 0 || N2 <= 0 || N3 <= 0) {
68
+ // Degenerate flat window — fall back to a simple EMA constant.
69
+ alpha = 2 / (period + 1)
70
+ } else {
71
+ const D = (Math.log(N1 + N2) - Math.log(N3)) / Math.LN2
72
+ alpha = Math.exp(-4.6 * (D - 1))
73
+ // Numerical safety: clamp to [0.01, 1].
74
+ if (!(alpha > 0)) alpha = 0.01
75
+ if (alpha > 1) alpha = 1
76
+ }
77
+
78
+ const cur = prices[i] as number
79
+ if (Number.isNaN(prev)) {
80
+ prev = cur
81
+ } else {
82
+ prev = alpha * cur + (1 - alpha) * prev
83
+ }
84
+ out[i] = prev
85
+ }
86
+ return out
87
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @klinechart-quant/core/indicators — headless indicator math.
3
+ *
4
+ * Pure functions over price arrays. No DOM, no signals, no controllers —
5
+ * these are the building blocks consumers compose into UI flows or feed
6
+ * to the legacy scheduler in `src/core/indicators/`.
7
+ *
8
+ * Convention: each indicator's output is a `Float64Array` of the same length
9
+ * as the input, with NaN for indices where the indicator hasn't primed yet.
10
+ * This makes alignment with bar arrays trivial in render code.
11
+ */
12
+
13
+ // MA family completion pack (tick 7 b-9)
14
+ export { computeALMA, type AlmaOptions } from './alma'
15
+ export { computeT3, type T3Options } from './t3'
16
+ export { computeZLEMA, type ZlemaOptions } from './zlema'
17
+ export { computeLSMA, type LsmaOptions } from './lsma'
18
+ export { computeVIDYA, type VidyaOptions } from './vidya'
19
+ export { computeFRAMA, type FramaOptions } from './frama'
20
+
21
+ // Oscillator completion pack (tick 8 b-10)
22
+ export { computeStochRSI, type StochRsiOptions } from './stochRSI'
23
+ export {
24
+ computeAwesomeOscillator,
25
+ type AwesomeOscillatorOptions,
26
+ } from './awesomeOscillator'
27
+ export {
28
+ computeUltimateOscillator,
29
+ type UltimateOscillatorOptions,
30
+ } from './ultimateOscillator'
31
+ export { computeDPO, type DpoOptions } from './dpo'
32
+ export {
33
+ computeFisherTransform,
34
+ type FisherTransformOptions,
35
+ } from './fisherTransform'
36
+ export {
37
+ computeSchaffTrendCycle,
38
+ type SchaffTrendCycleOptions,
39
+ } from './schaffTrendCycle'
@@ -0,0 +1,58 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * LSMA — Least-Squares (Linear Regression) Moving Average.
4
+ *
5
+ * At each index i (with at least `period` samples available), fit a
6
+ * line `y = a + b * x` over the last `period` prices via least squares,
7
+ * and emit the value of that line at the right endpoint (`y[period-1]`).
8
+ *
9
+ * Closed-form (mean-centred):
10
+ * x̄ = (period - 1) / 2 (since x = 0..period-1)
11
+ * ȳ = mean(prices over window)
12
+ * b = sum((x - x̄) * (y - ȳ)) / sum((x - x̄)^2)
13
+ * a = ȳ - b * x̄
14
+ * lsma[i] = a + b * (period - 1)
15
+ *
16
+ * Output length === input length. Indices < period - 1 are NaN.
17
+ */
18
+
19
+ export interface LsmaOptions {
20
+ period: number
21
+ }
22
+
23
+ export function computeLSMA(prices: ReadonlyArray<number>, opts: LsmaOptions): Float64Array {
24
+ const { period } = opts
25
+ if (period < 2 || !Number.isFinite(period)) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'computeLSMA: period must be >= 2')
26
+
27
+ const out = new Float64Array(prices.length)
28
+ const xbar = (period - 1) / 2
29
+ // sum((x - x̄)^2) for x = 0..period-1 is a constant; precompute.
30
+ let xxSum = 0
31
+ for (let k = 0; k < period; k++) {
32
+ const d = k - xbar
33
+ xxSum += d * d
34
+ }
35
+
36
+ for (let i = 0; i < prices.length; i++) {
37
+ if (i < period - 1) {
38
+ out[i] = Number.NaN
39
+ continue
40
+ }
41
+ // Window covers indices i - period + 1 .. i, mapped to x = 0..period-1.
42
+ let ysum = 0
43
+ for (let k = 0; k < period; k++) {
44
+ ysum += prices[i - period + 1 + k] as number
45
+ }
46
+ const ybar = ysum / period
47
+ let xy = 0
48
+ for (let k = 0; k < period; k++) {
49
+ const xd = k - xbar
50
+ const yd = (prices[i - period + 1 + k] as number) - ybar
51
+ xy += xd * yd
52
+ }
53
+ const b = xy / xxSum
54
+ const a = ybar - b * xbar
55
+ out[i] = a + b * (period - 1)
56
+ }
57
+ return out
58
+ }
@@ -0,0 +1,92 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * STC — Schaff Trend Cycle (Doug Schaff, 2008).
4
+ *
5
+ * Doubly-stochastic MACD-cycle hybrid:
6
+ *
7
+ * macd = EMA(close, fast) - EMA(close, slow)
8
+ * k1 = stoch(macd, cycle) (raw, 0..100)
9
+ * d1 = EMA(k1, factor) (smoothing)
10
+ * k2 = stoch(d1, cycle)
11
+ * STC = EMA(k2, factor)
12
+ *
13
+ * Defaults: fast=23, slow=50, cycle=10, factor=0.5 (smoothing constant,
14
+ * applied as `d = factor*new + (1-factor)*d_prev`).
15
+ *
16
+ * Output: `Float64Array` length === input. NaN until index >= slow + 2*cycle.
17
+ */
18
+
19
+ export interface SchaffTrendCycleOptions {
20
+ fast?: number
21
+ slow?: number
22
+ cycle?: number
23
+ factor?: number
24
+ }
25
+
26
+ export function computeSchaffTrendCycle(
27
+ prices: ReadonlyArray<number>,
28
+ opts: SchaffTrendCycleOptions = {},
29
+ ): Float64Array {
30
+ const fast = opts.fast ?? 23
31
+ const slow = opts.slow ?? 50
32
+ const cycle = opts.cycle ?? 10
33
+ const factor = opts.factor ?? 0.5
34
+ if (fast < 2 || slow <= fast) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'STC: require 2 <= fast < slow')
35
+ if (cycle < 2) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'STC: cycle must be >= 2')
36
+ if (!(factor > 0 && factor <= 1)) throw new KLineChartError('INDICATOR_INVALID_PARAM', 'STC: factor must be in (0, 1]')
37
+
38
+ const n = prices.length
39
+ const macd = new Float64Array(n)
40
+ const kFast = 2 / (fast + 1)
41
+ const kSlow = 2 / (slow + 1)
42
+ let emaF = Number.NaN
43
+ let emaS = Number.NaN
44
+ for (let i = 0; i < n; i++) {
45
+ const p = prices[i] as number
46
+ emaF = Number.isNaN(emaF) ? p : kFast * p + (1 - kFast) * emaF
47
+ emaS = Number.isNaN(emaS) ? p : kSlow * p + (1 - kSlow) * emaS
48
+ macd[i] = emaF - emaS
49
+ }
50
+
51
+ const k1 = stochOver(macd, cycle)
52
+ const d1 = smoothFactor(k1, factor)
53
+ const k2 = stochOver(d1, cycle)
54
+ const stc = smoothFactor(k2, factor)
55
+ return stc
56
+ }
57
+
58
+ function stochOver(input: Float64Array, period: number): Float64Array {
59
+ const n = input.length
60
+ const out = new Float64Array(n)
61
+ out.fill(Number.NaN)
62
+ for (let i = period - 1; i < n; i++) {
63
+ let lo = Infinity
64
+ let hi = -Infinity
65
+ let any = false
66
+ for (let j = i - period + 1; j <= i; j++) {
67
+ const v = input[j] as number
68
+ if (Number.isNaN(v)) continue
69
+ any = true
70
+ if (v < lo) lo = v
71
+ if (v > hi) hi = v
72
+ }
73
+ if (!any) continue
74
+ const denom = hi - lo
75
+ out[i] = denom === 0 ? 50 : (100 * ((input[i] as number) - lo)) / denom
76
+ }
77
+ return out
78
+ }
79
+
80
+ function smoothFactor(input: Float64Array, factor: number): Float64Array {
81
+ const n = input.length
82
+ const out = new Float64Array(n)
83
+ out.fill(Number.NaN)
84
+ let prev = Number.NaN
85
+ for (let i = 0; i < n; i++) {
86
+ const v = input[i] as number
87
+ if (Number.isNaN(v)) continue
88
+ prev = Number.isNaN(prev) ? v : factor * v + (1 - factor) * prev
89
+ out[i] = prev
90
+ }
91
+ return out
92
+ }