@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,311 @@
1
+ import { KLineChartError } from '../errors'
2
+ /**
3
+ * Renko bricks — price-based bars that ignore time.
4
+ *
5
+ * A Renko chart drops a fixed-size "brick" every time price advances by one
6
+ * brick-size from the previous brick's close. Time is collapsed: a quiet hour
7
+ * may produce zero bricks, a volatile minute may produce ten.
8
+ *
9
+ * ## Modes
10
+ *
11
+ * - **Fixed brick size** (`{ brickSize }`): the classic chart. Brick height
12
+ * is constant across the entire series.
13
+ * - **ATR-adaptive brick size** (`{ useATR: { period } }`): brick size is the
14
+ * rolling ATR(period) over the *input* OHLCV series. We compute the full
15
+ * ATR series upfront and then use, for each candidate brick, the **trailing
16
+ * ATR at the source bar that triggered it**. This means brick height varies
17
+ * along the chart — wider in volatile regimes, tighter in quiet ones —
18
+ * which is the whole point of ATR mode.
19
+ *
20
+ * Trade-off (documented because it's a real one): ATR bricks are NOT
21
+ * uniform-height, so the chart loses the "every step is the same size"
22
+ * visual property that classical Renko has. In return, the brick rhythm
23
+ * adapts to volatility — a feature TradingView only offers in a separate
24
+ * chart-type ("ATR Renko") and which requires the user to reload the
25
+ * series to change. Our implementation supports flipping `useATR` on a
26
+ * live transform incrementally — see §"Enhancements over TradingView".
27
+ *
28
+ * ## Classic reversal rule (the 2× brick-size requirement)
29
+ *
30
+ * Once a column of up-bricks has been emitted, a single brick-size reverse
31
+ * move is NOT enough to start a down-column — it must travel **2 × brickSize**
32
+ * in the opposite direction from the last brick's close. This is the
33
+ * "classic" Nison/Steve Nison rule. Without the 2× requirement the chart
34
+ * "flutters" — every wiggle near the brick-size threshold flips direction.
35
+ *
36
+ * In code:
37
+ * - Continuation (same direction as last brick): need ≥ 1 × brickSize.
38
+ * - Reversal (opposite direction): need ≥ 2 × brickSize.
39
+ *
40
+ * The very first brick has no "previous direction", so it uses the 1× rule.
41
+ *
42
+ * ## Brick shape
43
+ *
44
+ * Each brick is OHLCV-shaped to fit the candle renderer:
45
+ *
46
+ * up-brick: open = lastBrickClose
47
+ * close = lastBrickClose + brickSize
48
+ * high = close, low = open
49
+ *
50
+ * down-brick: open = lastBrickClose
51
+ * close = lastBrickClose - brickSize
52
+ * high = open, low = close
53
+ *
54
+ * `volume` is the sum of input-bar volumes assigned to this brick. We use a
55
+ * simple rule: each input bar contributes all of its volume to **the first
56
+ * brick** it triggers in that bar. When one bar triggers N bricks (a gap),
57
+ * the bar's full volume goes on the first brick and the rest carry zero. This
58
+ * matches TradingView; the alternative (split evenly) creates phantom volume
59
+ * spikes when ATR mode changes brick sizes between bricks.
60
+ *
61
+ * ## Meta
62
+ *
63
+ * `meta.direction` is `'up'` or `'down'` for downstream colour selection.
64
+ * `meta.brickSize` is the brick height at the time of emission (especially
65
+ * meaningful in ATR mode).
66
+ */
67
+
68
+ import type { ChartTypeTransform, OHLCV, TransformedBar } from './types'
69
+
70
+ /**
71
+ * Renko configuration.
72
+ *
73
+ * Exactly one of `brickSize` or `useATR` must be supplied. If both are present
74
+ * `useATR` wins (so callers can store both and toggle a flag).
75
+ */
76
+ export interface RenkoConfig {
77
+ /** Fixed brick height in price units. Must be > 0. */
78
+ brickSize?: number
79
+ /** ATR-adaptive mode. `period` is the ATR lookback. */
80
+ useATR?: { period: number }
81
+ }
82
+
83
+ interface RenkoState {
84
+ /** Close of the most recently emitted brick. `null` until the first brick. */
85
+ lastBrickClose: number | null
86
+ /** Direction of the most recently emitted brick. `null` for the first brick. */
87
+ lastDirection: 'up' | 'down' | null
88
+ /** Count of input bars consumed so far (= next source index). */
89
+ nextIndex: number
90
+ /** For ATR mode — the rolling TR window (last `period` true ranges). */
91
+ trWindow: number[]
92
+ /** For ATR mode — previous close, needed to compute TR. */
93
+ prevClose: number | null
94
+ /** Effective brick size at the most recent emission (for inspection / tests). */
95
+ lastBrickSize: number | null
96
+ }
97
+
98
+ /** Compute true range for a bar against the prior close. */
99
+ const trueRange = (bar: OHLCV, prevClose: number | null): number => {
100
+ const hl = bar.high - bar.low
101
+ if (prevClose === null) return hl
102
+ const hc = Math.abs(bar.high - prevClose)
103
+ const lc = Math.abs(bar.low - prevClose)
104
+ return Math.max(hl, hc, lc)
105
+ }
106
+
107
+ /**
108
+ * Build a Renko transform.
109
+ *
110
+ * The transform supports both `transform(input, config)` and `appendBar(bar)`.
111
+ * The config passed to `transform` is also captured for subsequent
112
+ * `appendBar` calls — so the typical flow is:
113
+ *
114
+ * const r = createRenko()
115
+ * const history = r.transform(historicalBars, { brickSize: 10 })
116
+ * // ...later, as ticks arrive:
117
+ * const newBricks = r.appendBar(liveBar)
118
+ */
119
+ export function createRenko(): ChartTypeTransform<RenkoConfig> {
120
+ let state: RenkoState = {
121
+ lastBrickClose: null,
122
+ lastDirection: null,
123
+ nextIndex: 0,
124
+ trWindow: [],
125
+ prevClose: null,
126
+ lastBrickSize: null,
127
+ }
128
+ let activeConfig: RenkoConfig = { brickSize: 1 }
129
+
130
+ /**
131
+ * Return the current effective brick size given the active config and the
132
+ * current ATR window. Returns `null` when ATR mode is enabled but the
133
+ * window hasn't filled yet (no bricks can form until we have a brick
134
+ * size).
135
+ */
136
+ const currentBrickSize = (): number | null => {
137
+ if (activeConfig.useATR) {
138
+ const period = activeConfig.useATR.period
139
+ if (state.trWindow.length < period) return null
140
+ let sum = 0
141
+ // Use only the most recent `period` entries — older history is
142
+ // not part of the rolling ATR (Wilder's smoothing is a separate
143
+ // discussion; we use the simple rolling mean which is the
144
+ // baseline TradingView ATR-Renko shows).
145
+ for (let i = state.trWindow.length - period; i < state.trWindow.length; i++) {
146
+ sum += state.trWindow[i] ?? 0
147
+ }
148
+ return sum / period
149
+ }
150
+ return activeConfig.brickSize ?? null
151
+ }
152
+
153
+ /**
154
+ * Try to emit bricks from a single input bar. The bar's `close` is the
155
+ * trigger; we ignore intra-bar high/low for brick formation because Renko
156
+ * is canonically a *close-only* construction. (Using high/low works on
157
+ * tick data but creates phantom bricks on OHLC bars.)
158
+ */
159
+ const emitBricksFromBar = (bar: OHLCV, sourceIndex: number): TransformedBar[] => {
160
+ const out: TransformedBar[] = []
161
+ const brickSize = currentBrickSize()
162
+ if (brickSize === null || brickSize <= 0) return out
163
+
164
+ // Initialise the "last brick close" lazily on the first bar — we
165
+ // anchor it to the bar's close so the first non-trivial move starts
166
+ // brick formation. (Anchoring to `open` would mean the very first bar
167
+ // could itself form a brick, which differs from the convention.)
168
+ if (state.lastBrickClose === null) {
169
+ state.lastBrickClose = bar.close
170
+ return out
171
+ }
172
+
173
+ const close = bar.close
174
+ let firstBrickInThisBar = true
175
+
176
+ // Keep stepping bricks until the close no longer satisfies the
177
+ // threshold. Each iteration emits one brick and advances state.
178
+ // Loop bound: at most ceil(|close - lastBrickClose| / brickSize) — a
179
+ // hard upper bound prevents pathological infinite loops if brickSize
180
+ // becomes zero mid-iteration.
181
+ let safety = 0
182
+ while (safety++ < 1_000_000) {
183
+ const last: number | null = state.lastBrickClose
184
+ if (last === null) break
185
+ const diff: number = close - last
186
+
187
+ // Continuation needs 1×, reversal needs 2×. First-ever brick uses 1×.
188
+ let upThreshold: number
189
+ let downThreshold: number
190
+ if (state.lastDirection === 'up') {
191
+ upThreshold = brickSize
192
+ downThreshold = -2 * brickSize
193
+ } else if (state.lastDirection === 'down') {
194
+ upThreshold = 2 * brickSize
195
+ downThreshold = -brickSize
196
+ } else {
197
+ upThreshold = brickSize
198
+ downThreshold = -brickSize
199
+ }
200
+
201
+ if (diff >= upThreshold) {
202
+ const newClose: number = last + brickSize
203
+ out.push({
204
+ timestamp: bar.timestamp,
205
+ open: last,
206
+ close: newClose,
207
+ high: newClose,
208
+ low: last,
209
+ volume: firstBrickInThisBar ? bar.volume : 0,
210
+ sourceBarIndexStart: sourceIndex,
211
+ sourceBarIndexEnd: sourceIndex,
212
+ meta: { direction: 'up', brickSize },
213
+ })
214
+ state.lastBrickClose = newClose
215
+ state.lastDirection = 'up'
216
+ state.lastBrickSize = brickSize
217
+ firstBrickInThisBar = false
218
+ continue
219
+ }
220
+
221
+ if (diff <= downThreshold) {
222
+ const newClose: number = last - brickSize
223
+ out.push({
224
+ timestamp: bar.timestamp,
225
+ open: last,
226
+ close: newClose,
227
+ high: last,
228
+ low: newClose,
229
+ volume: firstBrickInThisBar ? bar.volume : 0,
230
+ sourceBarIndexStart: sourceIndex,
231
+ sourceBarIndexEnd: sourceIndex,
232
+ meta: { direction: 'down', brickSize },
233
+ })
234
+ state.lastBrickClose = newClose
235
+ state.lastDirection = 'down'
236
+ state.lastBrickSize = brickSize
237
+ firstBrickInThisBar = false
238
+ continue
239
+ }
240
+
241
+ break
242
+ }
243
+ return out
244
+ }
245
+
246
+ const consumeBar = (bar: OHLCV): TransformedBar[] => {
247
+ const sourceIndex = state.nextIndex
248
+ // Update TR window BEFORE checking brick formation so the first ATR
249
+ // window's worth of bars participate in brick sizing as soon as
250
+ // possible.
251
+ const tr = trueRange(bar, state.prevClose)
252
+ state.trWindow.push(tr)
253
+ // Cap the window growth to twice the period for memory bound;
254
+ // anything older is never read.
255
+ if (activeConfig.useATR) {
256
+ const period = activeConfig.useATR.period
257
+ if (state.trWindow.length > period * 2) {
258
+ state.trWindow = state.trWindow.slice(state.trWindow.length - period)
259
+ }
260
+ } else if (state.trWindow.length > 2048) {
261
+ // For non-ATR mode we don't need the window at all — clear it.
262
+ state.trWindow = []
263
+ }
264
+ state.prevClose = bar.close
265
+
266
+ const emitted = emitBricksFromBar(bar, sourceIndex)
267
+ state.nextIndex = sourceIndex + 1
268
+ return emitted
269
+ }
270
+
271
+ const resetState = (): void => {
272
+ state = {
273
+ lastBrickClose: null,
274
+ lastDirection: null,
275
+ nextIndex: 0,
276
+ trWindow: [],
277
+ prevClose: null,
278
+ lastBrickSize: null,
279
+ }
280
+ }
281
+
282
+ return {
283
+ typeId: 'renko',
284
+
285
+ transform(input: ReadonlyArray<OHLCV>, config: RenkoConfig): ReadonlyArray<TransformedBar> {
286
+ // Validate: at least one mode must be set with sane values.
287
+ if (!config.useATR && (config.brickSize === undefined || config.brickSize <= 0)) {
288
+ throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: config requires brickSize > 0 or useATR { period }')
289
+ }
290
+ if (config.useATR && config.useATR.period < 1) {
291
+ throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRenko: useATR.period must be >= 1')
292
+ }
293
+ activeConfig = config
294
+ resetState()
295
+ const out: TransformedBar[] = []
296
+ for (const bar of input) {
297
+ const fresh = consumeBar(bar)
298
+ for (const b of fresh) out.push(b)
299
+ }
300
+ return out
301
+ },
302
+
303
+ appendBar(bar: OHLCV): ReadonlyArray<TransformedBar> {
304
+ return consumeBar(bar)
305
+ },
306
+
307
+ reset(): void {
308
+ resetState()
309
+ },
310
+ }
311
+ }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Chart-type transformers — public type contract.
3
+ *
4
+ * A "chart type" in TradingView (Heikin Ashi, Renko, P&F, Range Bars, etc.) is
5
+ * a **data transform**, not a different renderer. Every output is still
6
+ * OHLCV-shaped, so the same candle renderer paints all of them. This package
7
+ * is therefore deliberately headless: rendering belongs to the
8
+ * Renderer/Scene layer (see `docs/ROADMAP.md` §0).
9
+ *
10
+ * Why this matters for the WebGPU path: because the output is OHLCV, the
11
+ * existing instanced-quad K-line vertex pipeline (see `docs/ROADMAP.md` §2.3)
12
+ * draws Heikin Ashi / Renko / P&F / Range Bars at the same throughput as raw
13
+ * candles — no new render path, no new shader.
14
+ *
15
+ * ## Two transforms in one interface — batch vs incremental
16
+ *
17
+ * Every transform here supports two modes:
18
+ *
19
+ * - **Batch** (`transform`): pure function over an OHLCV slice. Re-derives the
20
+ * output from scratch. Use this for chart loads / history scrolls.
21
+ * - **Incremental** (`appendBar`): consume one live bar at a time, emit zero
22
+ * or more output bars, and update internal state. Use this for streaming
23
+ * quotes.
24
+ *
25
+ * Calling `appendBar` repeatedly over the same sequence must produce **bit-for-
26
+ * bit identical** output to a single `transform` over that sequence. The test
27
+ * suite enforces this with a randomised property test on a ≥30-bar input.
28
+ *
29
+ * ## A note on time semantics
30
+ *
31
+ * Renko, P&F and Range Bars all break the "one input bar = one output bar"
32
+ * assumption. We preserve provenance with `sourceBarIndexStart` /
33
+ * `sourceBarIndexEnd` so callers can map back to the source series for
34
+ * tooltips, x-axis labels, and event correlation. The `timestamp` on a
35
+ * derived bar is the timestamp of the source bar that **closed** it (i.e. the
36
+ * trigger).
37
+ */
38
+
39
+ /** Standard OHLCV row. Timestamps are epoch milliseconds. */
40
+ export interface OHLCV {
41
+ timestamp: number
42
+ open: number
43
+ high: number
44
+ low: number
45
+ close: number
46
+ volume: number
47
+ }
48
+
49
+ /**
50
+ * One output bar from a chart-type transform. Extends `OHLCV` so it can flow
51
+ * through the same scale / renderer pipeline as raw candles.
52
+ *
53
+ * `sourceBarIndexStart` / `sourceBarIndexEnd` mark which input rows were
54
+ * aggregated into this output row (inclusive). For 1:1 transforms (Heikin
55
+ * Ashi) they are equal. For aggregating transforms (Renko, P&F, Range Bars)
56
+ * they describe a range of source rows. For "fanning" transforms — one input
57
+ * bar that produces multiple output bars (large-gap Renko, oversized Range
58
+ * bar) — every fanned-out output row shares the same start/end index.
59
+ */
60
+ export interface TransformedBar extends OHLCV {
61
+ /** Lowest source index folded into this output bar (inclusive). */
62
+ sourceBarIndexStart: number
63
+ /** Highest source index folded into this output bar (inclusive). */
64
+ sourceBarIndexEnd: number
65
+ /**
66
+ * Transform-specific metadata. Marked `Readonly` so consumers can rely on
67
+ * structural sharing — a transform must never mutate metadata after
68
+ * emitting it.
69
+ */
70
+ meta?: Readonly<Record<string, unknown>>
71
+ }
72
+
73
+ /**
74
+ * Common shape for all chart-type transformers.
75
+ *
76
+ * `transform` is pure — it does NOT mutate `input` and (for stateful
77
+ * transforms) calling it resets internal state first so the result depends
78
+ * only on `input` + `config`.
79
+ *
80
+ * `appendBar` is incremental — it does mutate internal state. Calling
81
+ * `reset()` returns the transform to its initial state.
82
+ *
83
+ * `typeId` is a stable, human-readable identifier used by the scene/registry.
84
+ */
85
+ export interface ChartTypeTransform<TConfig = unknown> {
86
+ readonly typeId: string
87
+ transform(input: ReadonlyArray<OHLCV>, config: TConfig): ReadonlyArray<TransformedBar>
88
+ /**
89
+ * Append one input bar and emit zero, one, or many output bars.
90
+ *
91
+ * Implementations that do not support incremental mode omit this method.
92
+ * For Heikin Ashi the output is always exactly one bar per call. For
93
+ * Renko / Range Bars / P&F the count can be 0..N depending on whether the
94
+ * new bar triggers brick/box formation.
95
+ */
96
+ appendBar?(input: OHLCV): ReadonlyArray<TransformedBar>
97
+ /** Drop internal state. Idempotent. Safe to call on stateless transforms. */
98
+ reset?(): void
99
+ }