@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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chartTypes/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { createHeikinAshi } from './heikinAshi';
2
+ export { createRenko } from './renko';
3
+ export { createPointAndFigure } from './pointAndFigure';
4
+ export { createRangeBars } from './rangeBars';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chartTypes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAoB,MAAM,SAAS,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAA6B,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,eAAe,EAAwB,MAAM,aAAa,CAAA"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Point & Figure (P&F) — classic three-box-reversal column chart.
3
+ *
4
+ * P&F is the oldest non-time chart type still in use (de Villiers documented
5
+ * it in 1933, traders were drawing it on graph paper a century before that).
6
+ * It is a column chart: each column is either rising X's or falling O's, and
7
+ * we move to a new column only when price reverses by `reversal × boxSize`.
8
+ *
9
+ * ## Algorithm (classic 3-box reversal)
10
+ *
11
+ * - State: current column `direction`, current column extent `[low, high]`.
12
+ * - For each new input bar with `[H, L]`:
13
+ *
14
+ * - If column is X (up):
15
+ * * If `H >= high + boxSize`: extend the X column up to the highest box
16
+ * containing `H` (i.e. set `high := floor(H / boxSize) * boxSize`).
17
+ * * Else if `L <= high - reversal * boxSize`: reverse — start a new O
18
+ * column. The new column starts **one box below** the prior X
19
+ * column's high, and goes down to the lowest box `>= L`. The "one
20
+ * box below" rule is the classical de Villiers convention and is
21
+ * what TradingView uses.
22
+ * * Else: bar does nothing.
23
+ *
24
+ * - Symmetric for an O (down) column.
25
+ *
26
+ * - First-ever input bar seeds the chart with an X column anchored on the
27
+ * bar's `low` rounded down to a box boundary, extended up to `H` rounded
28
+ * down to a box boundary. (Some traditions start with the high; we use
29
+ * low-anchored which is more deterministic for a single bar.)
30
+ *
31
+ * ## Why this is lossy by design
32
+ *
33
+ * P&F deletes time entirely. Two bars produced at very different times can
34
+ * land in the same column. We therefore set every output column's
35
+ * `timestamp` to the timestamp of the source bar that **closed** the column
36
+ * (i.e. the last bar that touched it). This gives downstream tooltips a
37
+ * meaningful anchor while honouring the lossy semantics.
38
+ *
39
+ * ## OHLCV mapping for one column
40
+ *
41
+ * - `open` = starting box price (column entry)
42
+ * - `close` = final box price (column exit / current frontier)
43
+ * - `high` = max box price reached in this column
44
+ * - `low` = min box price reached in this column
45
+ * - `volume`= sum of input bar volumes that touched this column
46
+ *
47
+ * For an X column `close === high` and `open === low`. For an O column
48
+ * `close === low` and `open === high`. We populate `meta.direction` so
49
+ * renderers can colour distinctly.
50
+ *
51
+ * ## Reversal vs extension at the exact threshold
52
+ *
53
+ * If a bar simultaneously satisfies both extension and reversal — e.g. an X
54
+ * column where `H >= high + boxSize` AND `L <= high - reversal * boxSize` —
55
+ * **extension wins** (we follow the direction-of-momentum rule). This avoids
56
+ * "chop" in volatile bars but is a deliberate trade-off; some older systems
57
+ * give reversal priority on the basis of "the down move came second". We
58
+ * pick extension because it matches modern interactive P&F implementations
59
+ * including TradingView.
60
+ *
61
+ * ## Emission strategy
62
+ *
63
+ * Each completed column emits exactly **one** TransformedBar — the column's
64
+ * snapshot at the moment it closed. While a column is still "open" (i.e. it
65
+ * is the current column being extended) it does NOT appear in the output.
66
+ * `appendBar` therefore returns `[]` for bars that only extend the current
67
+ * column, and `[completedColumn, ...]` for bars that trigger a reversal.
68
+ *
69
+ * In batch mode `transform()` returns every column INCLUDING the in-progress
70
+ * final column so the user sees the full picture. This is the only place
71
+ * where batch and incremental diverge — and it's intentional, because there
72
+ * is no streaming convention to "tentatively emit" a still-open column.
73
+ * Tests assert that *closed* columns match between modes.
74
+ */
75
+ import type { ChartTypeTransform } from './types';
76
+ export interface PointAndFigureConfig {
77
+ /** Box height in price units. Must be > 0. */
78
+ boxSize: number;
79
+ /** Reversal in number of boxes. Classic value is 3. Must be >= 1. */
80
+ reversal: number;
81
+ }
82
+ export declare function createPointAndFigure(): ChartTypeTransform<PointAndFigureConfig>;
83
+ //# sourceMappingURL=pointAndFigure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointAndFigure.d.ts","sourceRoot":"","sources":["../../src/chartTypes/pointAndFigure.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,SAAS,CAAA;AAExE,MAAM,WAAW,oBAAoB;IACjC,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAA;CACnB;AA8CD,wBAAgB,oBAAoB,IAAI,kBAAkB,CAAC,oBAAoB,CAAC,CAoJ/E"}
@@ -0,0 +1,159 @@
1
+ import { KLineChartError } from '../errors';
2
+ /**
3
+ * Convert an internal column to a `TransformedBar`. We compute `open`, `close`,
4
+ * `high`, `low` from the column's two endpoints (P&F columns are monotonic in
5
+ * one direction so the two endpoints are the extremes).
6
+ */
7
+ const columnToBar = (col) => {
8
+ const open = col.startPrice;
9
+ const close = col.endPrice;
10
+ const high = Math.max(open, close);
11
+ const low = Math.min(open, close);
12
+ return {
13
+ timestamp: col.timestamp,
14
+ open,
15
+ high,
16
+ low,
17
+ close,
18
+ volume: col.volume,
19
+ sourceBarIndexStart: col.sourceStart,
20
+ sourceBarIndexEnd: col.sourceEnd,
21
+ meta: { direction: col.direction },
22
+ };
23
+ };
24
+ export function createPointAndFigure() {
25
+ let state = { column: null, nextIndex: 0, closedColumns: [] };
26
+ let activeConfig = { boxSize: 1, reversal: 3 };
27
+ /** Snap `p` down to the nearest box boundary. */
28
+ const floorToBox = (p, box) => Math.floor(p / box) * box;
29
+ /** Snap `p` up to the nearest box boundary. */
30
+ const ceilToBox = (p, box) => Math.ceil(p / box) * box;
31
+ /**
32
+ * Process one input bar and return any column(s) that **closed** as a
33
+ * result. The in-progress column is held in `state.column` and is NOT
34
+ * returned until it closes (i.e. a reversal pushes it into closedColumns).
35
+ */
36
+ const consumeBar = (bar) => {
37
+ const sourceIndex = state.nextIndex;
38
+ state.nextIndex = sourceIndex + 1;
39
+ const { boxSize, reversal } = activeConfig;
40
+ const closed = [];
41
+ // Seed: no current column. Anchor an X column on the bar's low/high
42
+ // rounded to box boundaries. If high-low rounds to the same box (very
43
+ // narrow bar) we still create a degenerate column of height zero so
44
+ // the chart has a starting point — it will be extended by future bars.
45
+ if (state.column === null) {
46
+ const start = floorToBox(bar.low, boxSize);
47
+ const end = floorToBox(bar.high, boxSize);
48
+ state.column = {
49
+ direction: 'up',
50
+ startPrice: start,
51
+ endPrice: end,
52
+ sourceStart: sourceIndex,
53
+ sourceEnd: sourceIndex,
54
+ volume: bar.volume,
55
+ timestamp: bar.timestamp,
56
+ };
57
+ return closed;
58
+ }
59
+ const col = state.column;
60
+ if (col.direction === 'up') {
61
+ // Try extension first (extension wins ties — see file header).
62
+ const newHigh = floorToBox(bar.high, boxSize);
63
+ if (newHigh >= col.endPrice + boxSize) {
64
+ col.endPrice = newHigh;
65
+ col.sourceEnd = sourceIndex;
66
+ col.volume += bar.volume;
67
+ col.timestamp = bar.timestamp;
68
+ return closed;
69
+ }
70
+ // Then reversal.
71
+ if (bar.low <= col.endPrice - reversal * boxSize) {
72
+ // Close the X column.
73
+ closed.push(columnToBar(col));
74
+ state.closedColumns.push(closed[closed.length - 1]);
75
+ // Start a new O column ONE box below the X column's high.
76
+ const newColumnStart = col.endPrice - boxSize;
77
+ const newColumnEnd = ceilToBox(bar.low, boxSize);
78
+ state.column = {
79
+ direction: 'down',
80
+ startPrice: newColumnStart,
81
+ endPrice: newColumnEnd <= newColumnStart ? newColumnEnd : newColumnStart,
82
+ sourceStart: sourceIndex,
83
+ sourceEnd: sourceIndex,
84
+ volume: bar.volume,
85
+ timestamp: bar.timestamp,
86
+ };
87
+ return closed;
88
+ }
89
+ // Bar does nothing — still attribute volume + advance source range
90
+ // so the column's metadata reflects the bars that touched it.
91
+ col.sourceEnd = sourceIndex;
92
+ col.volume += bar.volume;
93
+ col.timestamp = bar.timestamp;
94
+ return closed;
95
+ }
96
+ // col.direction === 'down'
97
+ const newLow = ceilToBox(bar.low, boxSize);
98
+ if (newLow <= col.endPrice - boxSize) {
99
+ col.endPrice = newLow;
100
+ col.sourceEnd = sourceIndex;
101
+ col.volume += bar.volume;
102
+ col.timestamp = bar.timestamp;
103
+ return closed;
104
+ }
105
+ if (bar.high >= col.endPrice + reversal * boxSize) {
106
+ closed.push(columnToBar(col));
107
+ state.closedColumns.push(closed[closed.length - 1]);
108
+ const newColumnStart = col.endPrice + boxSize;
109
+ const newColumnEnd = floorToBox(bar.high, boxSize);
110
+ state.column = {
111
+ direction: 'up',
112
+ startPrice: newColumnStart,
113
+ endPrice: newColumnEnd >= newColumnStart ? newColumnEnd : newColumnStart,
114
+ sourceStart: sourceIndex,
115
+ sourceEnd: sourceIndex,
116
+ volume: bar.volume,
117
+ timestamp: bar.timestamp,
118
+ };
119
+ return closed;
120
+ }
121
+ col.sourceEnd = sourceIndex;
122
+ col.volume += bar.volume;
123
+ col.timestamp = bar.timestamp;
124
+ return closed;
125
+ };
126
+ const resetState = () => {
127
+ state = { column: null, nextIndex: 0, closedColumns: [] };
128
+ };
129
+ return {
130
+ typeId: 'point-and-figure',
131
+ transform(input, config) {
132
+ if (config.boxSize <= 0) {
133
+ throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createPointAndFigure: boxSize must be > 0');
134
+ }
135
+ if (config.reversal < 1 || !Number.isFinite(config.reversal)) {
136
+ throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createPointAndFigure: reversal must be >= 1');
137
+ }
138
+ activeConfig = config;
139
+ resetState();
140
+ for (const bar of input) {
141
+ consumeBar(bar);
142
+ }
143
+ // Batch mode includes the currently-open column as the last entry —
144
+ // see file header. Incremental mode does not.
145
+ const out = state.closedColumns.slice();
146
+ if (state.column !== null) {
147
+ out.push(columnToBar(state.column));
148
+ }
149
+ return out;
150
+ },
151
+ appendBar(bar) {
152
+ return consumeBar(bar);
153
+ },
154
+ reset() {
155
+ resetState();
156
+ },
157
+ };
158
+ }
159
+ //# sourceMappingURL=pointAndFigure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointAndFigure.js","sourceRoot":"","sources":["../../src/chartTypes/pointAndFigure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Range Bars — fixed-range price bars.
3
+ *
4
+ * Every output bar spans exactly `range` price units (high - low === range at
5
+ * close). When the active bar's range reaches the threshold it is closed and
6
+ * a new bar begins, opening at the trigger price. Time, like Renko and P&F,
7
+ * is collapsed.
8
+ *
9
+ * ## Why range bars over Renko
10
+ *
11
+ * - **Renko** uses only the close; intra-bar wicks are invisible. Good for
12
+ * long-term swing visualisation.
13
+ * - **Range bars** use the entire (high, low) of every input bar. They show
14
+ * intra-bar excursions and tend to be more responsive to spikes.
15
+ *
16
+ * ## Algorithm
17
+ *
18
+ * State carries the in-progress bar `{open, high, low, volume, ...}`. For each
19
+ * input bar:
20
+ *
21
+ * 1. Decide a *direction* for the input bar (`up` if close >= open, else
22
+ * `down`). Range bars need a direction because OHLC bars don't carry the
23
+ * tick-level path between low and high.
24
+ * 2. Merge the input bar into the open bar BUT only along the direction —
25
+ * meaning we honour both high and low, but if the merged span exceeds
26
+ * `range` we *carve* the range bar in the direction of motion.
27
+ * 3. Carving: an "up" input that pushes total span past `range` closes the
28
+ * current bar at `low + range`. The carved excess starts the next bar
29
+ * with `open = low + range`, and any remaining high above the carved
30
+ * ceiling becomes the next bar's high (recursion).
31
+ * 4. Edge case: a single input bar with `high - low > range` walks the bar's
32
+ * range in `range`-sized steps in the input's direction and emits one
33
+ * output bar per full step.
34
+ *
35
+ * ## Direction heuristic for OHLC inputs
36
+ *
37
+ * When closing from a single input contribution, we use `input.close >= input.open`
38
+ * to choose the carve direction. This is the same heuristic TradingView uses
39
+ * with OHLC input — exact tick-by-tick directionality would require trades.
40
+ *
41
+ * ## Volume aggregation
42
+ *
43
+ * Volume is summed across every input bar that contributes any range. For a
44
+ * single input that produces multiple output bars (a split), the input's
45
+ * volume is divided proportionally to the price extent each output bar
46
+ * carves of the input bar's total H-L.
47
+ *
48
+ * ## Emission strategy
49
+ *
50
+ * `transform()` returns every closed bar PLUS the currently-open bar (mirrors
51
+ * a live chart). `appendBar()` returns only the bars that closed on this
52
+ * append — the open bar is held in state. Tests assert the closed prefix
53
+ * matches between modes.
54
+ */
55
+ import type { ChartTypeTransform } from './types';
56
+ export interface RangeBarsConfig {
57
+ /** Range height in price units. Must be > 0. */
58
+ range: number;
59
+ }
60
+ export declare function createRangeBars(): ChartTypeTransform<RangeBarsConfig>;
61
+ //# sourceMappingURL=rangeBars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeBars.d.ts","sourceRoot":"","sources":["../../src/chartTypes/rangeBars.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,SAAS,CAAA;AAExE,MAAM,WAAW,eAAe;IAC5B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;CAChB;AA0CD,wBAAgB,eAAe,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAuMrE"}
@@ -0,0 +1,181 @@
1
+ import { KLineChartError } from '../errors';
2
+ const makeClosed = (open, high, low, close, volume, sourceStart, sourceEnd, timestamp) => {
3
+ const direction = close >= open ? 'up' : 'down';
4
+ return {
5
+ timestamp,
6
+ open,
7
+ high,
8
+ low,
9
+ close,
10
+ volume,
11
+ sourceBarIndexStart: sourceStart,
12
+ sourceBarIndexEnd: sourceEnd,
13
+ meta: { direction },
14
+ };
15
+ };
16
+ export function createRangeBars() {
17
+ let state = { open: null, nextIndex: 0, closed: [] };
18
+ let activeConfig = { range: 1 };
19
+ /**
20
+ * Merge one input bar into the open range bar, carving as many closed
21
+ * range bars as needed. Returns the bars that closed during this merge.
22
+ */
23
+ const consumeBar = (bar) => {
24
+ const sourceIndex = state.nextIndex;
25
+ state.nextIndex = sourceIndex + 1;
26
+ const range = activeConfig.range;
27
+ const closed = [];
28
+ const upward = bar.close >= bar.open;
29
+ const inputExtent = Math.max(bar.high - bar.low, 1e-12);
30
+ // Seed: no in-progress bar yet. Open one at the input's open. The
31
+ // input's full H/L participates immediately.
32
+ if (state.open === null) {
33
+ state.open = {
34
+ open: bar.open,
35
+ high: bar.open,
36
+ low: bar.open,
37
+ volume: 0,
38
+ sourceStart: sourceIndex,
39
+ sourceEnd: sourceIndex,
40
+ timestamp: bar.timestamp,
41
+ };
42
+ }
43
+ // Track how much input volume we've attributed so we can split it
44
+ // proportionally across any carved bars.
45
+ let inputVolUsed = 0;
46
+ // Repeatedly merge the input into the open bar; each iteration either
47
+ // (a) closes a bar and seeds a new open one from the carved-off
48
+ // remainder, or (b) finishes by absorbing the entire input range.
49
+ //
50
+ // We walk the input bar along its direction. `remainingHigh` and
51
+ // `remainingLow` shrink as we carve. We stop when no further range
52
+ // bar can be closed.
53
+ let remainingHigh = bar.high;
54
+ let remainingLow = bar.low;
55
+ let safety = 0;
56
+ while (safety++ < 1_000_000) {
57
+ const opened = state.open;
58
+ // Apply the remaining input extent to the open bar.
59
+ const mergedHigh = Math.max(opened.high, remainingHigh);
60
+ const mergedLow = Math.min(opened.low, remainingLow);
61
+ const span = mergedHigh - mergedLow;
62
+ if (span < range) {
63
+ // Whole remainder fits within range — absorb and stop.
64
+ opened.high = mergedHigh;
65
+ opened.low = mergedLow;
66
+ opened.sourceEnd = sourceIndex;
67
+ opened.timestamp = bar.timestamp;
68
+ // All remaining input volume goes here.
69
+ opened.volume += bar.volume - inputVolUsed;
70
+ inputVolUsed = bar.volume;
71
+ break;
72
+ }
73
+ // Span >= range. Carve a range bar in the direction of motion.
74
+ // For an up bar: close at low + range (we move up first).
75
+ // For a down bar: close at high - range.
76
+ let closePrice;
77
+ let closedHigh;
78
+ let closedLow;
79
+ if (upward) {
80
+ closedLow = mergedLow;
81
+ closedHigh = mergedLow + range;
82
+ closePrice = closedHigh;
83
+ }
84
+ else {
85
+ closedHigh = mergedHigh;
86
+ closedLow = mergedHigh - range;
87
+ closePrice = closedLow;
88
+ }
89
+ // Volume attributed to this carved bar: proportional to the
90
+ // input extent it covers, plus any volume already accumulated on
91
+ // the open bar from prior input bars.
92
+ const carvedExtent = Math.min(range, span);
93
+ const inputShare = (carvedExtent / inputExtent) * bar.volume;
94
+ const attribInput = Math.min(inputShare, bar.volume - inputVolUsed);
95
+ inputVolUsed += attribInput;
96
+ const closedVolume = opened.volume + attribInput;
97
+ closed.push(makeClosed(opened.open, closedHigh, closedLow, closePrice, closedVolume, opened.sourceStart, sourceIndex, bar.timestamp));
98
+ state.closed.push(closed[closed.length - 1]);
99
+ // Seed the next open bar at the carve boundary. The remaining
100
+ // input extent above (for up) or below (for down) the carve
101
+ // continues into the new bar.
102
+ if (upward) {
103
+ remainingLow = closePrice;
104
+ state.open = {
105
+ open: closePrice,
106
+ high: closePrice,
107
+ low: closePrice,
108
+ volume: 0,
109
+ sourceStart: sourceIndex,
110
+ sourceEnd: sourceIndex,
111
+ timestamp: bar.timestamp,
112
+ };
113
+ // If the input bar's high is no greater than the carve
114
+ // ceiling, nothing more from this input remains for further
115
+ // carving.
116
+ if (remainingHigh <= closePrice) {
117
+ // The new open bar already has open=closePrice; the
118
+ // remaining high contributes nothing further. Stop.
119
+ state.open.high = closePrice;
120
+ state.open.low = closePrice;
121
+ // Attribute leftover input volume to the now-current open.
122
+ state.open.volume = bar.volume - inputVolUsed;
123
+ inputVolUsed = bar.volume;
124
+ break;
125
+ }
126
+ }
127
+ else {
128
+ remainingHigh = closePrice;
129
+ state.open = {
130
+ open: closePrice,
131
+ high: closePrice,
132
+ low: closePrice,
133
+ volume: 0,
134
+ sourceStart: sourceIndex,
135
+ sourceEnd: sourceIndex,
136
+ timestamp: bar.timestamp,
137
+ };
138
+ if (remainingLow >= closePrice) {
139
+ state.open.high = closePrice;
140
+ state.open.low = closePrice;
141
+ state.open.volume = bar.volume - inputVolUsed;
142
+ inputVolUsed = bar.volume;
143
+ break;
144
+ }
145
+ }
146
+ }
147
+ return closed;
148
+ };
149
+ const resetState = () => {
150
+ state = { open: null, nextIndex: 0, closed: [] };
151
+ };
152
+ return {
153
+ typeId: 'range-bars',
154
+ transform(input, config) {
155
+ if (config.range <= 0 || !Number.isFinite(config.range)) {
156
+ throw new KLineChartError('CHART_TYPE_CONFIG_INVALID', 'createRangeBars: range must be > 0');
157
+ }
158
+ activeConfig = config;
159
+ resetState();
160
+ for (const bar of input)
161
+ consumeBar(bar);
162
+ const out = state.closed.slice();
163
+ if (state.open !== null) {
164
+ // The trailing in-progress bar's "close" is its frontier — the
165
+ // direction of last accumulation. We pick high for "up" if
166
+ // close>=open, else low, matching candle semantics.
167
+ const o = state.open;
168
+ const close = o.high - o.open >= o.open - o.low ? o.high : o.low;
169
+ out.push(makeClosed(o.open, o.high, o.low, close, o.volume, o.sourceStart, o.sourceEnd, o.timestamp));
170
+ }
171
+ return out;
172
+ },
173
+ appendBar(bar) {
174
+ return consumeBar(bar);
175
+ },
176
+ reset() {
177
+ resetState();
178
+ },
179
+ };
180
+ }
181
+ //# sourceMappingURL=rangeBars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeBars.js","sourceRoot":"","sources":["../../src/chartTypes/rangeBars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AA+E3C,MAAM,UAAU,GAAG,CACf,IAAY,EACZ,IAAY,EACZ,GAAW,EACX,KAAa,EACb,MAAc,EACd,WAAmB,EACnB,SAAiB,EACjB,SAAiB,EACH,EAAE;IAChB,MAAM,SAAS,GAAkB,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IAC9D,OAAO;QACH,SAAS;QACT,IAAI;QACJ,IAAI;QACJ,GAAG;QACH,KAAK;QACL,MAAM;QACN,mBAAmB,EAAE,WAAW;QAChC,iBAAiB,EAAE,SAAS;QAC5B,IAAI,EAAE,EAAE,SAAS,EAAE;KACtB,CAAA;AACL,CAAC,CAAA;AAED,MAAM,UAAU,eAAe;IAC3B,IAAI,KAAK,GAAe,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IAChE,IAAI,YAAY,GAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAEhD;;;OAGG;IACH,MAAM,UAAU,GAAG,CAAC,GAAU,EAAoB,EAAE;QAChD,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAA;QACnC,KAAK,CAAC,SAAS,GAAG,WAAW,GAAG,CAAC,CAAA;QACjC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAA;QAChC,MAAM,MAAM,GAAqB,EAAE,CAAA;QAEnC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,CAAA;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAEvD,kEAAkE;QAClE,6CAA6C;QAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,GAAG;gBACT,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,GAAG,CAAC,IAAI;gBACb,MAAM,EAAE,CAAC;gBACT,WAAW,EAAE,WAAW;gBACxB,SAAS,EAAE,WAAW;gBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;aAC3B,CAAA;QACL,CAAC;QAED,kEAAkE;QAClE,yCAAyC;QACzC,IAAI,YAAY,GAAG,CAAC,CAAA;QAEpB,sEAAsE;QACtE,gEAAgE;QAChE,kEAAkE;QAClE,EAAE;QACF,iEAAiE;QACjE,mEAAmE;QACnE,qBAAqB;QACrB,IAAI,aAAa,GAAG,GAAG,CAAC,IAAI,CAAA;QAC5B,IAAI,YAAY,GAAG,GAAG,CAAC,GAAG,CAAA;QAE1B,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,OAAO,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAK,CAAA;YAC1B,oDAAoD;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;YACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,UAAU,GAAG,SAAS,CAAA;YACnC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBACf,uDAAuD;gBACvD,MAAM,CAAC,IAAI,GAAG,UAAU,CAAA;gBACxB,MAAM,CAAC,GAAG,GAAG,SAAS,CAAA;gBACtB,MAAM,CAAC,SAAS,GAAG,WAAW,CAAA;gBAC9B,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAA;gBAChC,wCAAwC;gBACxC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,YAAY,CAAA;gBAC1C,YAAY,GAAG,GAAG,CAAC,MAAM,CAAA;gBACzB,MAAK;YACT,CAAC;YAED,+DAA+D;YAC/D,0DAA0D;YAC1D,yCAAyC;YACzC,IAAI,UAAkB,CAAA;YACtB,IAAI,UAAkB,CAAA;YACtB,IAAI,SAAiB,CAAA;YACrB,IAAI,MAAM,EAAE,CAAC;gBACT,SAAS,GAAG,SAAS,CAAA;gBACrB,UAAU,GAAG,SAAS,GAAG,KAAK,CAAA;gBAC9B,UAAU,GAAG,UAAU,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACJ,UAAU,GAAG,UAAU,CAAA;gBACvB,SAAS,GAAG,UAAU,GAAG,KAAK,CAAA;gBAC9B,UAAU,GAAG,SAAS,CAAA;YAC1B,CAAC;YAED,4DAA4D;YAC5D,iEAAiE;YACjE,sCAAsC;YACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAC1C,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,MAAM,CAAA;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC,CAAA;YACnE,YAAY,IAAI,WAAW,CAAA;YAE3B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,WAAW,CAAA;YAChD,MAAM,CAAC,IAAI,CACP,UAAU,CACN,MAAM,CAAC,IAAI,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,MAAM,CAAC,WAAW,EAClB,WAAW,EACX,GAAG,CAAC,SAAS,CAChB,CACJ,CAAA;YACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAmB,CAAC,CAAA;YAE9D,8DAA8D;YAC9D,4DAA4D;YAC5D,8BAA8B;YAC9B,IAAI,MAAM,EAAE,CAAC;gBACT,YAAY,GAAG,UAAU,CAAA;gBACzB,KAAK,CAAC,IAAI,GAAG;oBACT,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,UAAU;oBACf,MAAM,EAAE,CAAC;oBACT,WAAW,EAAE,WAAW;oBACxB,SAAS,EAAE,WAAW;oBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;iBAC3B,CAAA;gBACD,uDAAuD;gBACvD,4DAA4D;gBAC5D,WAAW;gBACX,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;oBAC9B,oDAAoD;oBACpD,oDAAoD;oBACpD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;oBAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAA;oBAC3B,2DAA2D;oBAC3D,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,CAAA;oBAC7C,YAAY,GAAG,GAAG,CAAC,MAAM,CAAA;oBACzB,MAAK;gBACT,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,aAAa,GAAG,UAAU,CAAA;gBAC1B,KAAK,CAAC,IAAI,GAAG;oBACT,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,GAAG,EAAE,UAAU;oBACf,MAAM,EAAE,CAAC;oBACT,WAAW,EAAE,WAAW;oBACxB,SAAS,EAAE,WAAW;oBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;iBAC3B,CAAA;gBACD,IAAI,YAAY,IAAI,UAAU,EAAE,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;oBAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAA;oBAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,CAAA;oBAC7C,YAAY,GAAG,GAAG,CAAC,MAAM,CAAA;oBACzB,MAAK;gBACT,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAA;IACjB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,GAAS,EAAE;QAC1B,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACpD,CAAC,CAAA;IAED,OAAO;QACH,MAAM,EAAE,YAAY;QAEpB,SAAS,CAAC,KAA2B,EAAE,MAAuB;YAC1D,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE,oCAAoC,CAAC,CAAA;YAChG,CAAC;YACD,YAAY,GAAG,MAAM,CAAA;YACrB,UAAU,EAAE,CAAA;YACZ,KAAK,MAAM,GAAG,IAAI,KAAK;gBAAE,UAAU,CAAC,GAAG,CAAC,CAAA;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;YAChC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACtB,+DAA+D;gBAC/D,2DAA2D;gBAC3D,oDAAoD;gBACpD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAA;gBACpB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;gBAChE,GAAG,CAAC,IAAI,CACJ,UAAU,CACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,GAAG,EACL,KAAK,EACL,CAAC,CAAC,MAAM,EACR,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,SAAS,EACX,CAAC,CAAC,SAAS,CACd,CACJ,CAAA;YACL,CAAC;YACD,OAAO,GAAG,CAAA;QACd,CAAC;QAED,SAAS,CAAC,GAAU;YAChB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QAED,KAAK;YACD,UAAU,EAAE,CAAA;QAChB,CAAC;KACJ,CAAA;AACL,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Renko bricks — price-based bars that ignore time.
3
+ *
4
+ * A Renko chart drops a fixed-size "brick" every time price advances by one
5
+ * brick-size from the previous brick's close. Time is collapsed: a quiet hour
6
+ * may produce zero bricks, a volatile minute may produce ten.
7
+ *
8
+ * ## Modes
9
+ *
10
+ * - **Fixed brick size** (`{ brickSize }`): the classic chart. Brick height
11
+ * is constant across the entire series.
12
+ * - **ATR-adaptive brick size** (`{ useATR: { period } }`): brick size is the
13
+ * rolling ATR(period) over the *input* OHLCV series. We compute the full
14
+ * ATR series upfront and then use, for each candidate brick, the **trailing
15
+ * ATR at the source bar that triggered it**. This means brick height varies
16
+ * along the chart — wider in volatile regimes, tighter in quiet ones —
17
+ * which is the whole point of ATR mode.
18
+ *
19
+ * Trade-off (documented because it's a real one): ATR bricks are NOT
20
+ * uniform-height, so the chart loses the "every step is the same size"
21
+ * visual property that classical Renko has. In return, the brick rhythm
22
+ * adapts to volatility — a feature TradingView only offers in a separate
23
+ * chart-type ("ATR Renko") and which requires the user to reload the
24
+ * series to change. Our implementation supports flipping `useATR` on a
25
+ * live transform incrementally — see §"Enhancements over TradingView".
26
+ *
27
+ * ## Classic reversal rule (the 2× brick-size requirement)
28
+ *
29
+ * Once a column of up-bricks has been emitted, a single brick-size reverse
30
+ * move is NOT enough to start a down-column — it must travel **2 × brickSize**
31
+ * in the opposite direction from the last brick's close. This is the
32
+ * "classic" Nison/Steve Nison rule. Without the 2× requirement the chart
33
+ * "flutters" — every wiggle near the brick-size threshold flips direction.
34
+ *
35
+ * In code:
36
+ * - Continuation (same direction as last brick): need ≥ 1 × brickSize.
37
+ * - Reversal (opposite direction): need ≥ 2 × brickSize.
38
+ *
39
+ * The very first brick has no "previous direction", so it uses the 1× rule.
40
+ *
41
+ * ## Brick shape
42
+ *
43
+ * Each brick is OHLCV-shaped to fit the candle renderer:
44
+ *
45
+ * up-brick: open = lastBrickClose
46
+ * close = lastBrickClose + brickSize
47
+ * high = close, low = open
48
+ *
49
+ * down-brick: open = lastBrickClose
50
+ * close = lastBrickClose - brickSize
51
+ * high = open, low = close
52
+ *
53
+ * `volume` is the sum of input-bar volumes assigned to this brick. We use a
54
+ * simple rule: each input bar contributes all of its volume to **the first
55
+ * brick** it triggers in that bar. When one bar triggers N bricks (a gap),
56
+ * the bar's full volume goes on the first brick and the rest carry zero. This
57
+ * matches TradingView; the alternative (split evenly) creates phantom volume
58
+ * spikes when ATR mode changes brick sizes between bricks.
59
+ *
60
+ * ## Meta
61
+ *
62
+ * `meta.direction` is `'up'` or `'down'` for downstream colour selection.
63
+ * `meta.brickSize` is the brick height at the time of emission (especially
64
+ * meaningful in ATR mode).
65
+ */
66
+ import type { ChartTypeTransform } from './types';
67
+ /**
68
+ * Renko configuration.
69
+ *
70
+ * Exactly one of `brickSize` or `useATR` must be supplied. If both are present
71
+ * `useATR` wins (so callers can store both and toggle a flag).
72
+ */
73
+ export interface RenkoConfig {
74
+ /** Fixed brick height in price units. Must be > 0. */
75
+ brickSize?: number;
76
+ /** ATR-adaptive mode. `period` is the ATR lookback. */
77
+ useATR?: {
78
+ period: number;
79
+ };
80
+ }
81
+ /**
82
+ * Build a Renko transform.
83
+ *
84
+ * The transform supports both `transform(input, config)` and `appendBar(bar)`.
85
+ * The config passed to `transform` is also captured for subsequent
86
+ * `appendBar` calls — so the typical flow is:
87
+ *
88
+ * const r = createRenko()
89
+ * const history = r.transform(historicalBars, { brickSize: 10 })
90
+ * // ...later, as ticks arrive:
91
+ * const newBricks = r.appendBar(liveBar)
92
+ */
93
+ export declare function createRenko(): ChartTypeTransform<RenkoConfig>;
94
+ //# sourceMappingURL=renko.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renko.d.ts","sourceRoot":"","sources":["../../src/chartTypes/renko.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,SAAS,CAAA;AAExE;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IACxB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9B;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAgM7D"}