@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,331 @@
1
+ /**
2
+ * Tests for `computeAnchoredVwap` — pure math for Anchored VWAP + bands.
3
+ *
4
+ * The math the implementation is being held to:
5
+ *
6
+ * typicalPrice(j) = (H[j] + L[j] + C[j]) / 3
7
+ * sumVwp(i) = Σ_{j=a..i} typicalPrice(j) * V[j]
8
+ * sumVol(i) = Σ_{j=a..i} V[j]
9
+ * AVWAP(i) = sumVwp(i) / sumVol(i)
10
+ * sqDev(j) = (typicalPrice(j) - AVWAP(j))^2 * V[j] ← prevailing
11
+ * variance(i) = Σ_{j=a..i} sqDev(j) / sumVol(i)
12
+ * stdDev(i) = sqrt(variance(i))
13
+ * bands = AVWAP ± k * stdDev, k ∈ {1, 2}
14
+ *
15
+ * The "prevailing AVWAP at j" subtlety is explicitly pinned by the test
16
+ * `bands use prevailing AVWAP at j, not final AVWAP(i)` — that test would
17
+ * fail with a naive implementation that uses the final AVWAP instead.
18
+ */
19
+
20
+ import { describe, it, expect } from 'vitest'
21
+
22
+ import { computeAnchoredVwap } from '../computeAnchoredVwap'
23
+ import { isKLineChartError } from '../../../errors'
24
+ import type { AVWAPBar } from '../types'
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // Fixture helpers
28
+ // ---------------------------------------------------------------------------
29
+
30
+ /** Single-line bar constructor — keeps the fixtures readable. */
31
+ function bar(
32
+ high: number,
33
+ low: number,
34
+ close: number,
35
+ volume: number,
36
+ ): AVWAPBar {
37
+ return { high, low, close, volume }
38
+ }
39
+
40
+ /** typical price = (H + L + C) / 3 — used by the manual-formula tests. */
41
+ function tp(b: AVWAPBar): number {
42
+ return (b.high + b.low + b.close) / 3
43
+ }
44
+
45
+ // ---------------------------------------------------------------------------
46
+ // Edge cases
47
+ // ---------------------------------------------------------------------------
48
+
49
+ describe('computeAnchoredVwap — edge cases', () => {
50
+ it('returns [] when bars is empty', () => {
51
+ // The "no data, no work" convention used by sibling controllers.
52
+ // An out-of-range anchor on an empty array must NOT throw.
53
+ expect(computeAnchoredVwap([], 0, true)).toEqual([])
54
+ expect(computeAnchoredVwap([], -5, false)).toEqual([])
55
+ expect(computeAnchoredVwap([], 999, true)).toEqual([])
56
+ })
57
+
58
+ // Post-BLOCKER-005: out-of-range throws are KLineChartError with code
59
+ // `AVWAP_ANCHOR_OUT_OF_RANGE` (stronger contract than the previous
60
+ // built-in RangeError — instanceof KLineChartError + code narrowing).
61
+ it('throws KLineChartError(AVWAP_ANCHOR_OUT_OF_RANGE) when anchorIndex is negative', () => {
62
+ const bars = [bar(100, 90, 95, 1000)]
63
+ try {
64
+ computeAnchoredVwap(bars, -1, true)
65
+ throw new Error('expected throw')
66
+ } catch (e) {
67
+ expect(isKLineChartError(e, 'AVWAP_ANCHOR_OUT_OF_RANGE')).toBe(true)
68
+ }
69
+ })
70
+
71
+ it('throws KLineChartError(AVWAP_ANCHOR_OUT_OF_RANGE) when anchorIndex >= bars.length', () => {
72
+ const bars = [bar(100, 90, 95, 1000), bar(101, 91, 96, 1100)]
73
+ for (const idx of [2, 10]) {
74
+ try {
75
+ computeAnchoredVwap(bars, idx, idx === 2)
76
+ throw new Error('expected throw')
77
+ } catch (e) {
78
+ expect(isKLineChartError(e, 'AVWAP_ANCHOR_OUT_OF_RANGE')).toBe(true)
79
+ }
80
+ }
81
+ })
82
+ })
83
+
84
+ // ---------------------------------------------------------------------------
85
+ // Core AVWAP math
86
+ // ---------------------------------------------------------------------------
87
+
88
+ describe('computeAnchoredVwap — core AVWAP math', () => {
89
+ it('single-bar anchor: AVWAP equals that bar typical price; stdDev = 0', () => {
90
+ const b0 = bar(100, 90, 95, 1000) // tp = 95
91
+ const series = computeAnchoredVwap([b0], 0, true)
92
+ expect(series).toHaveLength(1)
93
+ const p0 = series[0]!
94
+ expect(p0.barIndex).toBe(0)
95
+ expect(p0.vwap).toBeCloseTo(95, 12)
96
+ // stdDev is zero at the anchor when bands are requested → all four
97
+ // bands equal the AVWAP exactly.
98
+ expect(p0.upper1).toBeCloseTo(95, 12)
99
+ expect(p0.lower1).toBeCloseTo(95, 12)
100
+ expect(p0.upper2).toBeCloseTo(95, 12)
101
+ expect(p0.lower2).toBeCloseTo(95, 12)
102
+ expect(p0.cumulativeVolume).toBe(1000)
103
+ })
104
+
105
+ it('two bars: AVWAP[1] = (tp0*v0 + tp1*v1) / (v0 + v1)', () => {
106
+ // tp0 = (100+90+95)/3 = 95, v0 = 1000 → vwp0 = 95_000
107
+ // tp1 = (110+100+105)/3 = 105, v1 = 2000 → vwp1 = 210_000
108
+ // AVWAP[1] = (95_000 + 210_000) / (1000 + 2000) = 305_000 / 3000
109
+ const b0 = bar(100, 90, 95, 1000)
110
+ const b1 = bar(110, 100, 105, 2000)
111
+ const series = computeAnchoredVwap([b0, b1], 0, false)
112
+
113
+ expect(series).toHaveLength(2)
114
+ expect(series[0]!.vwap).toBeCloseTo(95, 12)
115
+ const expected = (95 * 1000 + 105 * 2000) / (1000 + 2000)
116
+ expect(series[1]!.vwap).toBeCloseTo(expected, 12)
117
+ expect(series[1]!.cumulativeVolume).toBe(3000)
118
+ })
119
+
120
+ it('10-bar slowly trending up: AVWAP is monotonically non-decreasing', () => {
121
+ // typical price rises by 1 per bar; constant volume.
122
+ const bars: AVWAPBar[] = []
123
+ for (let i = 0; i < 10; i++) {
124
+ const t = 100 + i // tp ≈ 100, 101, 102, ...
125
+ bars.push(bar(t + 1, t - 1, t, 100))
126
+ }
127
+ const series = computeAnchoredVwap(bars, 0, false)
128
+ for (let i = 1; i < series.length; i++) {
129
+ expect(series[i]!.vwap).toBeGreaterThanOrEqual(
130
+ series[i - 1]!.vwap,
131
+ )
132
+ }
133
+ // Sanity bound: AVWAP must lie inside the trading range.
134
+ expect(series[9]!.vwap).toBeGreaterThan(100)
135
+ expect(series[9]!.vwap).toBeLessThan(110)
136
+ })
137
+
138
+ it('high-volume bar dominates the AVWAP toward its typical price', () => {
139
+ // A massively oversized v on bar 2 should pull AVWAP toward tp(b2).
140
+ const b0 = bar(101, 99, 100, 10) // tp = 100
141
+ const b1 = bar(101, 99, 100, 10) // tp = 100
142
+ const b2 = bar(201, 199, 200, 1_000_000) // tp = 200, huge V
143
+ const series = computeAnchoredVwap([b0, b1, b2], 0, false)
144
+ // After the whale bar, AVWAP should be >>> 100 and close to 200.
145
+ expect(series[2]!.vwap).toBeGreaterThan(199)
146
+ expect(series[2]!.vwap).toBeLessThan(200)
147
+ })
148
+
149
+ it('anchorIndex > 0 ignores bars before the anchor', () => {
150
+ // Anchor at bar 2 → bars 0 and 1 must NOT contribute.
151
+ const ignored = bar(1000, 1000, 1000, 1_000_000) // massive but ignored
152
+ const b2 = bar(50, 50, 50, 100) // tp = 50
153
+ const b3 = bar(60, 60, 60, 100) // tp = 60
154
+ const series = computeAnchoredVwap([ignored, ignored, b2, b3], 2, false)
155
+ expect(series).toHaveLength(2)
156
+ expect(series[0]!.barIndex).toBe(2)
157
+ expect(series[1]!.barIndex).toBe(3)
158
+ expect(series[0]!.vwap).toBeCloseTo(50, 12)
159
+ // AVWAP at bar 3 = (50*100 + 60*100)/(200) = 55
160
+ expect(series[1]!.vwap).toBeCloseTo(55, 12)
161
+ })
162
+ })
163
+
164
+ // ---------------------------------------------------------------------------
165
+ // Zero-volume handling
166
+ // ---------------------------------------------------------------------------
167
+
168
+ describe('computeAnchoredVwap — zero-volume handling', () => {
169
+ it('zero-volume bar mid-series carries forward the prior AVWAP', () => {
170
+ const b0 = bar(100, 100, 100, 1000) // tp = 100, vwap = 100
171
+ const b1 = bar(150, 150, 150, 0) // v = 0 → carry forward
172
+ const b2 = bar(110, 110, 110, 1000) // tp = 110
173
+ const series = computeAnchoredVwap([b0, b1, b2], 0, false)
174
+
175
+ expect(series).toHaveLength(3)
176
+ // Point 0: vwap = 100.
177
+ expect(series[0]!.vwap).toBeCloseTo(100, 12)
178
+ // Point 1: sumVol unchanged → vwap is still 100 (carry forward).
179
+ expect(series[1]!.vwap).toBeCloseTo(100, 12)
180
+ expect(series[1]!.cumulativeVolume).toBe(1000)
181
+ // Point 2: (100*1000 + 110*1000) / 2000 = 105
182
+ expect(series[2]!.vwap).toBeCloseTo(105, 12)
183
+ expect(series[2]!.cumulativeVolume).toBe(2000)
184
+ })
185
+
186
+ it('zero-volume anchor: first point is NaN, second is its own typical price', () => {
187
+ const b0 = bar(100, 100, 100, 0) // anchor — v = 0
188
+ const b1 = bar(200, 200, 200, 1000) // tp = 200
189
+ const series = computeAnchoredVwap([b0, b1], 0, true)
190
+
191
+ expect(series).toHaveLength(2)
192
+ // Point 0: NaN everywhere; cumulativeVolume is still 0.
193
+ expect(Number.isNaN(series[0]!.vwap)).toBe(true)
194
+ expect(Number.isNaN(series[0]!.upper1)).toBe(true)
195
+ expect(Number.isNaN(series[0]!.lower1)).toBe(true)
196
+ expect(Number.isNaN(series[0]!.upper2)).toBe(true)
197
+ expect(Number.isNaN(series[0]!.lower2)).toBe(true)
198
+ expect(series[0]!.cumulativeVolume).toBe(0)
199
+ // Point 1: sumVol becomes 1000 → vwap = tp(b1) = 200.
200
+ expect(series[1]!.vwap).toBeCloseTo(200, 12)
201
+ expect(series[1]!.cumulativeVolume).toBe(1000)
202
+ })
203
+ })
204
+
205
+ // ---------------------------------------------------------------------------
206
+ // Bands
207
+ // ---------------------------------------------------------------------------
208
+
209
+ describe('computeAnchoredVwap — bands', () => {
210
+ it('includeBands=false: upper1/lower1/upper2/lower2 all equal vwap', () => {
211
+ const b0 = bar(100, 90, 95, 1000)
212
+ const b1 = bar(110, 100, 105, 2000)
213
+ const series = computeAnchoredVwap([b0, b1], 0, false)
214
+ for (const p of series) {
215
+ expect(p.upper1).toBe(p.vwap)
216
+ expect(p.lower1).toBe(p.vwap)
217
+ expect(p.upper2).toBe(p.vwap)
218
+ expect(p.lower2).toBe(p.vwap)
219
+ }
220
+ })
221
+
222
+ it('at the anchor stdDev = 0 → upper/lower bands equal AVWAP exactly', () => {
223
+ const b0 = bar(101, 99, 100, 1000) // tp = 100
224
+ const series = computeAnchoredVwap([b0], 0, true)
225
+ expect(series[0]!.vwap).toBeCloseTo(100, 12)
226
+ // Bands collapse onto the line because there is no deviation yet.
227
+ expect(series[0]!.upper1).toBe(series[0]!.vwap)
228
+ expect(series[0]!.lower1).toBe(series[0]!.vwap)
229
+ expect(series[0]!.upper2).toBe(series[0]!.vwap)
230
+ expect(series[0]!.lower2).toBe(series[0]!.vwap)
231
+ })
232
+
233
+ it('ascending series with constant volume: upper1 > vwap > lower1 monotonically (sanity)', () => {
234
+ // Once dispersion appears (bar 1+), upper1 must strictly exceed
235
+ // vwap and lower1 must strictly trail it.
236
+ const bars: AVWAPBar[] = []
237
+ for (let i = 0; i < 10; i++) {
238
+ const t = 100 + i
239
+ bars.push(bar(t, t, t, 100))
240
+ }
241
+ const series = computeAnchoredVwap(bars, 0, true)
242
+ // Skip i = 0 (stdDev = 0). From i = 1 onward dispersion is positive.
243
+ for (let i = 1; i < series.length; i++) {
244
+ expect(series[i]!.upper1).toBeGreaterThan(series[i]!.vwap)
245
+ expect(series[i]!.lower1).toBeLessThan(series[i]!.vwap)
246
+ // 2σ envelope strictly contains 1σ envelope.
247
+ expect(series[i]!.upper2).toBeGreaterThan(series[i]!.upper1)
248
+ expect(series[i]!.lower2).toBeLessThan(series[i]!.lower1)
249
+ }
250
+ })
251
+
252
+ it('bands use prevailing AVWAP at j, not final AVWAP(i)', () => {
253
+ // Concrete 3-bar fixture engineered so the two formulas disagree
254
+ // by a measurable amount. tp/v chosen to keep the arithmetic
255
+ // verifiable by hand.
256
+ //
257
+ // bar j tp_j v_j AVWAP_j (prevailing)
258
+ // 0 100 1000 100
259
+ // 1 110 1000 105
260
+ // 2 120 1000 110
261
+ //
262
+ // sumVol = 3000
263
+ // sumVwp = 100_000 + 110_000 + 120_000 = 330_000
264
+ // AVWAP_2 = 110 (the "final" mean)
265
+ //
266
+ // CORRECT formula (prevailing AVWAP at j):
267
+ // sqDev(0) = (100 - 100)^2 * 1000 = 0
268
+ // sqDev(1) = (110 - 105)^2 * 1000 = 25_000
269
+ // sqDev(2) = (120 - 110)^2 * 1000 = 100_000
270
+ // sumSqDev = 125_000
271
+ // variance = 125_000 / 3_000 ≈ 41.6667
272
+ // stdDev ≈ 6.4550
273
+ //
274
+ // WRONG formula (final AVWAP for every j):
275
+ // sqDev(0) = (100 - 110)^2 * 1000 = 100_000
276
+ // sqDev(1) = (110 - 110)^2 * 1000 = 0
277
+ // sqDev(2) = (120 - 110)^2 * 1000 = 100_000
278
+ // sumSqDev = 200_000
279
+ // variance = 200_000 / 3_000 ≈ 66.6667
280
+ // stdDev ≈ 8.1650
281
+ //
282
+ // The two stdDevs differ by ~1.7 → upper1 differs by ~1.7. The
283
+ // test pins the CORRECT value; a regression to the wrong formula
284
+ // would fail loudly here.
285
+ const b0 = bar(100, 100, 100, 1000)
286
+ const b1 = bar(110, 110, 110, 1000)
287
+ const b2 = bar(120, 120, 120, 1000)
288
+ const series = computeAnchoredVwap([b0, b1, b2], 0, true)
289
+
290
+ // Final AVWAP is 110 either way.
291
+ expect(series[2]!.vwap).toBeCloseTo(110, 12)
292
+
293
+ // Hand-computed using the prevailing-AVWAP rule.
294
+ const expectedStdDev = Math.sqrt(125_000 / 3000)
295
+ expect(series[2]!.upper1).toBeCloseTo(110 + expectedStdDev, 9)
296
+ expect(series[2]!.lower1).toBeCloseTo(110 - expectedStdDev, 9)
297
+ expect(series[2]!.upper2).toBeCloseTo(110 + 2 * expectedStdDev, 9)
298
+ expect(series[2]!.lower2).toBeCloseTo(110 - 2 * expectedStdDev, 9)
299
+
300
+ // Sanity: the WRONG-formula stdDev would be sqrt(200_000 / 3000).
301
+ // If a regression switched to that formula, the assertion above
302
+ // would fail by ~1.7 — well outside `toBeCloseTo(_, 9)`.
303
+ const wrongStdDev = Math.sqrt(200_000 / 3000)
304
+ expect(Math.abs(expectedStdDev - wrongStdDev)).toBeGreaterThan(1)
305
+ })
306
+
307
+ it('mixed-volume bars: bands match a hand-computed reference', () => {
308
+ // Sanity check that the prevailing formula also handles uneven
309
+ // volumes (the formula is variance-weighted, not equal-weighted).
310
+ const b0 = bar(100, 100, 100, 1000) // tp = 100
311
+ const b1 = bar(120, 120, 120, 3000) // tp = 120
312
+ const series = computeAnchoredVwap([b0, b1], 0, true)
313
+
314
+ // sumVwp = 100*1000 + 120*3000 = 460_000
315
+ // sumVol = 4000
316
+ // AVWAP[1] = 115
317
+ expect(series[1]!.vwap).toBeCloseTo(115, 12)
318
+
319
+ // sqDev(0): (100 - 100)^2 * 1000 = 0 (AVWAP_0 = 100, prevailing)
320
+ // sqDev(1): (120 - 115)^2 * 3000 = 75_000
321
+ // sumSqDev = 75_000
322
+ // variance = 75_000 / 4000 = 18.75
323
+ // stdDev = 4.330127...
324
+ const stdDev = Math.sqrt(75_000 / 4000)
325
+ expect(series[1]!.upper1).toBeCloseTo(115 + stdDev, 9)
326
+ expect(series[1]!.lower1).toBeCloseTo(115 - stdDev, 9)
327
+ // Use the locally-derived tp helper to avoid bit-rot: we want
328
+ // the test to use the same tp formula the implementation does.
329
+ expect(tp(b1)).toBe(120)
330
+ })
331
+ })