@363045841yyt/klinechart-core 0.8.8 → 0.8.9

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 (571) hide show
  1. package/dist/controllers/index.d.ts +1 -1
  2. package/dist/controllers/index.d.ts.map +1 -1
  3. package/dist/controllers/types.d.ts +2 -2
  4. package/dist/controllers/types.d.ts.map +1 -1
  5. package/dist/data-fetchers/dataBuffer.d.ts +6 -0
  6. package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
  7. package/dist/data-fetchers/dataBuffer.js +50 -3
  8. package/dist/data-fetchers/dataBuffer.js.map +1 -1
  9. package/dist/engine/chart.d.ts +0 -1
  10. package/dist/engine/chart.d.ts.map +1 -1
  11. package/dist/engine/chart.js +0 -42
  12. package/dist/engine/chart.js.map +1 -1
  13. package/dist/engine/controller/interaction.d.ts +62 -0
  14. package/dist/engine/controller/interaction.d.ts.map +1 -1
  15. package/dist/engine/controller/interaction.js +158 -74
  16. package/dist/engine/controller/interaction.js.map +1 -1
  17. package/dist/engine/data/chartDataManager.d.ts +3 -0
  18. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  19. package/dist/engine/data/chartDataManager.js +13 -4
  20. package/dist/engine/data/chartDataManager.js.map +1 -1
  21. package/dist/engine/drawing/index.d.ts +2 -5
  22. package/dist/engine/drawing/index.d.ts.map +1 -1
  23. package/dist/engine/drawing/index.js +2 -33
  24. package/dist/engine/drawing/index.js.map +1 -1
  25. package/dist/engine/drawing/interaction.js +1 -1
  26. package/dist/engine/drawing/interaction.js.map +1 -1
  27. package/dist/engine/drawing/linearRegression.d.ts +6 -0
  28. package/dist/engine/drawing/linearRegression.d.ts.map +1 -0
  29. package/dist/engine/drawing/linearRegression.js +34 -0
  30. package/dist/engine/drawing/linearRegression.js.map +1 -0
  31. package/dist/engine/drawing/plugin.d.ts.map +1 -1
  32. package/dist/engine/drawing/plugin.js +104 -94
  33. package/dist/engine/drawing/plugin.js.map +1 -1
  34. package/dist/engine/indicators/calculators/_shared.d.ts +3 -0
  35. package/dist/engine/indicators/calculators/_shared.d.ts.map +1 -0
  36. package/dist/engine/indicators/calculators/_shared.js +45 -0
  37. package/dist/engine/indicators/calculators/_shared.js.map +1 -0
  38. package/dist/engine/indicators/calculators/bands.d.ts +44 -0
  39. package/dist/engine/indicators/calculators/bands.d.ts.map +1 -0
  40. package/dist/engine/indicators/calculators/bands.js +268 -0
  41. package/dist/engine/indicators/calculators/bands.js.map +1 -0
  42. package/dist/engine/indicators/calculators/index.d.ts +33 -0
  43. package/dist/engine/indicators/calculators/index.d.ts.map +1 -0
  44. package/dist/engine/indicators/calculators/index.js +19 -0
  45. package/dist/engine/indicators/calculators/index.js.map +1 -0
  46. package/dist/engine/indicators/calculators/movingAverages.d.ts +21 -0
  47. package/dist/engine/indicators/calculators/movingAverages.d.ts.map +1 -0
  48. package/dist/engine/indicators/calculators/movingAverages.js +143 -0
  49. package/dist/engine/indicators/calculators/movingAverages.js.map +1 -0
  50. package/dist/engine/indicators/calculators/oscillators.d.ts +29 -0
  51. package/dist/engine/indicators/calculators/oscillators.d.ts.map +1 -0
  52. package/dist/engine/indicators/calculators/oscillators.js +349 -0
  53. package/dist/engine/indicators/calculators/oscillators.js.map +1 -0
  54. package/dist/engine/indicators/calculators/patterns.d.ts +54 -0
  55. package/dist/engine/indicators/calculators/patterns.d.ts.map +1 -0
  56. package/dist/engine/indicators/calculators/patterns.js +214 -0
  57. package/dist/engine/indicators/calculators/patterns.js.map +1 -0
  58. package/dist/engine/indicators/calculators/volatility.d.ts +6 -0
  59. package/dist/engine/indicators/calculators/volatility.d.ts.map +1 -0
  60. package/dist/engine/indicators/calculators/volatility.js +114 -0
  61. package/dist/engine/indicators/calculators/volatility.js.map +1 -0
  62. package/dist/engine/indicators/calculators/volume.d.ts +21 -0
  63. package/dist/engine/indicators/calculators/volume.d.ts.map +1 -0
  64. package/dist/engine/indicators/calculators/volume.js +218 -0
  65. package/dist/engine/indicators/calculators/volume.js.map +1 -0
  66. package/dist/engine/indicators/calculators.d.ts +1 -361
  67. package/dist/engine/indicators/calculators.d.ts.map +1 -1
  68. package/dist/engine/indicators/calculators.js +1 -1787
  69. package/dist/engine/indicators/calculators.js.map +1 -1
  70. package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
  71. package/dist/engine/indicators/chartIndicatorManager.js +3 -44
  72. package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
  73. package/dist/engine/indicators/indicatorRegistry.d.ts +8 -0
  74. package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
  75. package/dist/engine/indicators/indicatorRegistry.js +16 -0
  76. package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
  77. package/dist/engine/indicators/indicatorRuntime.js +2 -2
  78. package/dist/engine/indicators/indicatorRuntime.js.map +1 -1
  79. package/dist/engine/indicators/scheduler.d.ts +2 -2
  80. package/dist/engine/indicators/scheduler.d.ts.map +1 -1
  81. package/dist/engine/indicators/scheduler.js +15 -155
  82. package/dist/engine/indicators/scheduler.js.map +1 -1
  83. package/dist/engine/indicators/{atrState.d.ts → state/atrState.d.ts} +1 -1
  84. package/dist/engine/indicators/state/atrState.d.ts.map +1 -0
  85. package/dist/engine/indicators/{atrState.js → state/atrState.js} +1 -1
  86. package/dist/engine/indicators/state/atrState.js.map +1 -0
  87. package/dist/engine/indicators/{bollState.d.ts → state/bollState.d.ts} +4 -2
  88. package/dist/engine/indicators/state/bollState.d.ts.map +1 -0
  89. package/dist/engine/indicators/{bollState.js → state/bollState.js} +5 -3
  90. package/dist/engine/indicators/state/bollState.js.map +1 -0
  91. package/dist/engine/indicators/{cciState.d.ts → state/cciState.d.ts} +1 -1
  92. package/dist/engine/indicators/state/cciState.d.ts.map +1 -0
  93. package/dist/engine/indicators/{cciState.js → state/cciState.js} +1 -1
  94. package/dist/engine/indicators/state/cciState.js.map +1 -0
  95. package/dist/engine/indicators/{chaikinVolState.d.ts → state/chaikinVolState.d.ts} +1 -1
  96. package/dist/engine/indicators/state/chaikinVolState.d.ts.map +1 -0
  97. package/dist/engine/indicators/{chaikinVolState.js → state/chaikinVolState.js} +1 -1
  98. package/dist/engine/indicators/state/chaikinVolState.js.map +1 -0
  99. package/dist/engine/indicators/{cmfState.d.ts → state/cmfState.d.ts} +1 -1
  100. package/dist/engine/indicators/state/cmfState.d.ts.map +1 -0
  101. package/dist/engine/indicators/{cmfState.js → state/cmfState.js} +1 -1
  102. package/dist/engine/indicators/state/cmfState.js.map +1 -0
  103. package/dist/engine/indicators/{demaState.d.ts → state/demaState.d.ts} +1 -1
  104. package/dist/engine/indicators/state/demaState.d.ts.map +1 -0
  105. package/dist/engine/indicators/{demaState.js → state/demaState.js} +1 -1
  106. package/dist/engine/indicators/state/demaState.js.map +1 -0
  107. package/dist/engine/indicators/{donchianState.d.ts → state/donchianState.d.ts} +1 -1
  108. package/dist/engine/indicators/state/donchianState.d.ts.map +1 -0
  109. package/dist/engine/indicators/{donchianState.js → state/donchianState.js} +1 -1
  110. package/dist/engine/indicators/state/donchianState.js.map +1 -0
  111. package/dist/engine/indicators/{eneState.d.ts → state/eneState.d.ts} +4 -2
  112. package/dist/engine/indicators/state/eneState.d.ts.map +1 -0
  113. package/dist/engine/indicators/{eneState.js → state/eneState.js} +5 -3
  114. package/dist/engine/indicators/state/eneState.js.map +1 -0
  115. package/dist/engine/indicators/{expmaState.d.ts → state/expmaState.d.ts} +4 -2
  116. package/dist/engine/indicators/state/expmaState.d.ts.map +1 -0
  117. package/dist/engine/indicators/{expmaState.js → state/expmaState.js} +5 -3
  118. package/dist/engine/indicators/state/expmaState.js.map +1 -0
  119. package/dist/engine/indicators/{fastkState.d.ts → state/fastkState.d.ts} +1 -1
  120. package/dist/engine/indicators/state/fastkState.d.ts.map +1 -0
  121. package/dist/engine/indicators/{fastkState.js → state/fastkState.js} +1 -1
  122. package/dist/engine/indicators/state/fastkState.js.map +1 -0
  123. package/dist/engine/indicators/{fibState.d.ts → state/fibState.d.ts} +1 -1
  124. package/dist/engine/indicators/state/fibState.d.ts.map +1 -0
  125. package/dist/engine/indicators/{fibState.js → state/fibState.js} +1 -1
  126. package/dist/engine/indicators/state/fibState.js.map +1 -0
  127. package/dist/engine/indicators/{hmaState.d.ts → state/hmaState.d.ts} +1 -1
  128. package/dist/engine/indicators/state/hmaState.d.ts.map +1 -0
  129. package/dist/engine/indicators/{hmaState.js → state/hmaState.js} +1 -1
  130. package/dist/engine/indicators/state/hmaState.js.map +1 -0
  131. package/dist/engine/indicators/{hvState.d.ts → state/hvState.d.ts} +1 -1
  132. package/dist/engine/indicators/state/hvState.d.ts.map +1 -0
  133. package/dist/engine/indicators/{hvState.js → state/hvState.js} +1 -1
  134. package/dist/engine/indicators/state/hvState.js.map +1 -0
  135. package/dist/engine/indicators/{ichimokuState.d.ts → state/ichimokuState.d.ts} +1 -1
  136. package/dist/engine/indicators/state/ichimokuState.d.ts.map +1 -0
  137. package/dist/engine/indicators/{ichimokuState.js → state/ichimokuState.js} +1 -1
  138. package/dist/engine/indicators/state/ichimokuState.js.map +1 -0
  139. package/dist/engine/indicators/{kamaState.d.ts → state/kamaState.d.ts} +1 -1
  140. package/dist/engine/indicators/state/kamaState.d.ts.map +1 -0
  141. package/dist/engine/indicators/{kamaState.js → state/kamaState.js} +1 -1
  142. package/dist/engine/indicators/state/kamaState.js.map +1 -0
  143. package/dist/engine/indicators/{keltnerState.d.ts → state/keltnerState.d.ts} +1 -1
  144. package/dist/engine/indicators/state/keltnerState.d.ts.map +1 -0
  145. package/dist/engine/indicators/{keltnerState.js → state/keltnerState.js} +1 -1
  146. package/dist/engine/indicators/state/keltnerState.js.map +1 -0
  147. package/dist/engine/indicators/{kstState.d.ts → state/kstState.d.ts} +2 -2
  148. package/dist/engine/indicators/state/kstState.d.ts.map +1 -0
  149. package/dist/engine/indicators/{kstState.js → state/kstState.js} +1 -1
  150. package/dist/engine/indicators/state/kstState.js.map +1 -0
  151. package/dist/engine/indicators/{maState.d.ts → state/maState.d.ts} +1 -1
  152. package/dist/engine/indicators/state/maState.d.ts.map +1 -0
  153. package/dist/engine/indicators/{maState.js → state/maState.js} +1 -1
  154. package/dist/engine/indicators/state/maState.js.map +1 -0
  155. package/dist/engine/indicators/{macdState.d.ts → state/macdState.d.ts} +3 -19
  156. package/dist/engine/indicators/state/macdState.d.ts.map +1 -0
  157. package/dist/engine/indicators/state/macdState.js.map +1 -0
  158. package/dist/engine/indicators/{mfiState.d.ts → state/mfiState.d.ts} +1 -1
  159. package/dist/engine/indicators/state/mfiState.d.ts.map +1 -0
  160. package/dist/engine/indicators/{mfiState.js → state/mfiState.js} +1 -1
  161. package/dist/engine/indicators/state/mfiState.js.map +1 -0
  162. package/dist/engine/indicators/{momState.d.ts → state/momState.d.ts} +1 -1
  163. package/dist/engine/indicators/state/momState.d.ts.map +1 -0
  164. package/dist/engine/indicators/{momState.js → state/momState.js} +1 -1
  165. package/dist/engine/indicators/state/momState.js.map +1 -0
  166. package/dist/engine/indicators/{obvState.d.ts → state/obvState.d.ts} +1 -1
  167. package/dist/engine/indicators/state/obvState.d.ts.map +1 -0
  168. package/dist/engine/indicators/{obvState.js → state/obvState.js} +1 -1
  169. package/dist/engine/indicators/state/obvState.js.map +1 -0
  170. package/dist/engine/indicators/{parkinsonState.d.ts → state/parkinsonState.d.ts} +1 -1
  171. package/dist/engine/indicators/state/parkinsonState.d.ts.map +1 -0
  172. package/dist/engine/indicators/{parkinsonState.js → state/parkinsonState.js} +1 -1
  173. package/dist/engine/indicators/state/parkinsonState.js.map +1 -0
  174. package/dist/engine/indicators/{pivotState.d.ts → state/pivotState.d.ts} +1 -1
  175. package/dist/engine/indicators/state/pivotState.d.ts.map +1 -0
  176. package/dist/engine/indicators/{pivotState.js → state/pivotState.js} +1 -1
  177. package/dist/engine/indicators/state/pivotState.js.map +1 -0
  178. package/dist/engine/indicators/{pvtState.d.ts → state/pvtState.d.ts} +1 -1
  179. package/dist/engine/indicators/state/pvtState.d.ts.map +1 -0
  180. package/dist/engine/indicators/{pvtState.js → state/pvtState.js} +1 -1
  181. package/dist/engine/indicators/state/pvtState.js.map +1 -0
  182. package/dist/engine/indicators/{rocState.d.ts → state/rocState.d.ts} +1 -1
  183. package/dist/engine/indicators/state/rocState.d.ts.map +1 -0
  184. package/dist/engine/indicators/{rocState.js → state/rocState.js} +1 -1
  185. package/dist/engine/indicators/state/rocState.js.map +1 -0
  186. package/dist/engine/indicators/{rsiState.d.ts → state/rsiState.d.ts} +4 -1
  187. package/dist/engine/indicators/state/rsiState.d.ts.map +1 -0
  188. package/dist/engine/indicators/{rsiState.js → state/rsiState.js} +7 -4
  189. package/dist/engine/indicators/state/rsiState.js.map +1 -0
  190. package/dist/engine/indicators/{sarState.d.ts → state/sarState.d.ts} +1 -1
  191. package/dist/engine/indicators/state/sarState.d.ts.map +1 -0
  192. package/dist/engine/indicators/{sarState.js → state/sarState.js} +1 -1
  193. package/dist/engine/indicators/state/sarState.js.map +1 -0
  194. package/dist/engine/indicators/{stochState.d.ts → state/stochState.d.ts} +2 -2
  195. package/dist/engine/indicators/state/stochState.d.ts.map +1 -0
  196. package/dist/engine/indicators/{stochState.js → state/stochState.js} +1 -1
  197. package/dist/engine/indicators/state/stochState.js.map +1 -0
  198. package/dist/engine/indicators/{structureState.d.ts → state/structureState.d.ts} +1 -1
  199. package/dist/engine/indicators/state/structureState.d.ts.map +1 -0
  200. package/dist/engine/indicators/{structureState.js → state/structureState.js} +1 -1
  201. package/dist/engine/indicators/state/structureState.js.map +1 -0
  202. package/dist/engine/indicators/{supertrendState.d.ts → state/supertrendState.d.ts} +1 -1
  203. package/dist/engine/indicators/state/supertrendState.d.ts.map +1 -0
  204. package/dist/engine/indicators/{supertrendState.js → state/supertrendState.js} +1 -1
  205. package/dist/engine/indicators/state/supertrendState.js.map +1 -0
  206. package/dist/engine/indicators/{temaState.d.ts → state/temaState.d.ts} +1 -1
  207. package/dist/engine/indicators/state/temaState.d.ts.map +1 -0
  208. package/dist/engine/indicators/{temaState.js → state/temaState.js} +1 -1
  209. package/dist/engine/indicators/state/temaState.js.map +1 -0
  210. package/dist/engine/indicators/{trixState.d.ts → state/trixState.d.ts} +1 -1
  211. package/dist/engine/indicators/state/trixState.d.ts.map +1 -0
  212. package/dist/engine/indicators/{trixState.js → state/trixState.js} +1 -1
  213. package/dist/engine/indicators/state/trixState.js.map +1 -0
  214. package/dist/engine/indicators/{vmaState.d.ts → state/vmaState.d.ts} +1 -1
  215. package/dist/engine/indicators/state/vmaState.d.ts.map +1 -0
  216. package/dist/engine/indicators/{vmaState.js → state/vmaState.js} +1 -1
  217. package/dist/engine/indicators/state/vmaState.js.map +1 -0
  218. package/dist/engine/indicators/{volumeProfileState.d.ts → state/volumeProfileState.d.ts} +1 -1
  219. package/dist/engine/indicators/state/volumeProfileState.d.ts.map +1 -0
  220. package/dist/engine/indicators/{volumeProfileState.js → state/volumeProfileState.js} +1 -1
  221. package/dist/engine/indicators/state/volumeProfileState.js.map +1 -0
  222. package/dist/engine/indicators/{vwapState.d.ts → state/vwapState.d.ts} +1 -1
  223. package/dist/engine/indicators/state/vwapState.d.ts.map +1 -0
  224. package/dist/engine/indicators/{vwapState.js → state/vwapState.js} +1 -1
  225. package/dist/engine/indicators/state/vwapState.js.map +1 -0
  226. package/dist/engine/indicators/{wmaState.d.ts → state/wmaState.d.ts} +1 -1
  227. package/dist/engine/indicators/state/wmaState.d.ts.map +1 -0
  228. package/dist/engine/indicators/{wmaState.js → state/wmaState.js} +1 -1
  229. package/dist/engine/indicators/state/wmaState.js.map +1 -0
  230. package/dist/engine/indicators/{wmsrState.d.ts → state/wmsrState.d.ts} +1 -1
  231. package/dist/engine/indicators/state/wmsrState.d.ts.map +1 -0
  232. package/dist/engine/indicators/{wmsrState.js → state/wmsrState.js} +1 -1
  233. package/dist/engine/indicators/state/wmsrState.js.map +1 -0
  234. package/dist/engine/indicators/{zonesState.d.ts → state/zonesState.d.ts} +1 -1
  235. package/dist/engine/indicators/state/zonesState.d.ts.map +1 -0
  236. package/dist/engine/indicators/{zonesState.js → state/zonesState.js} +1 -1
  237. package/dist/engine/indicators/state/zonesState.js.map +1 -0
  238. package/dist/engine/indicators/stateComposer.d.ts +39 -39
  239. package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
  240. package/dist/engine/indicators/visibleStateComposers.d.ts.map +1 -1
  241. package/dist/engine/indicators/visibleStateComposers.js +192 -31
  242. package/dist/engine/indicators/visibleStateComposers.js.map +1 -1
  243. package/dist/engine/layout/pane.js +2 -2
  244. package/dist/engine/layout/pane.js.map +1 -1
  245. package/dist/engine/paneRenderer.d.ts +2 -6
  246. package/dist/engine/paneRenderer.d.ts.map +1 -1
  247. package/dist/engine/paneRenderer.js.map +1 -1
  248. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  249. package/dist/engine/render/chartRenderer.js +7 -2
  250. package/dist/engine/render/chartRenderer.js.map +1 -1
  251. package/dist/engine/renderers/Indicator/atr.js +2 -2
  252. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  253. package/dist/engine/renderers/Indicator/cci.js +1 -1
  254. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  255. package/dist/engine/renderers/Indicator/chaikinVol.js +1 -1
  256. package/dist/engine/renderers/Indicator/chaikinVol.js.map +1 -1
  257. package/dist/engine/renderers/Indicator/cmf.js +1 -1
  258. package/dist/engine/renderers/Indicator/cmf.js.map +1 -1
  259. package/dist/engine/renderers/Indicator/dema.js +1 -1
  260. package/dist/engine/renderers/Indicator/dema.js.map +1 -1
  261. package/dist/engine/renderers/Indicator/donchian.js +1 -1
  262. package/dist/engine/renderers/Indicator/donchian.js.map +1 -1
  263. package/dist/engine/renderers/Indicator/fastk.js +1 -1
  264. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  265. package/dist/engine/renderers/Indicator/fib.js +1 -1
  266. package/dist/engine/renderers/Indicator/fib.js.map +1 -1
  267. package/dist/engine/renderers/Indicator/hma.js +1 -1
  268. package/dist/engine/renderers/Indicator/hma.js.map +1 -1
  269. package/dist/engine/renderers/Indicator/hv.js +2 -2
  270. package/dist/engine/renderers/Indicator/hv.js.map +1 -1
  271. package/dist/engine/renderers/Indicator/ichimoku.js +95 -92
  272. package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
  273. package/dist/engine/renderers/Indicator/kama.js +1 -1
  274. package/dist/engine/renderers/Indicator/kama.js.map +1 -1
  275. package/dist/engine/renderers/Indicator/keltner.js +1 -1
  276. package/dist/engine/renderers/Indicator/keltner.js.map +1 -1
  277. package/dist/engine/renderers/Indicator/kst.js +2 -2
  278. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  279. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  280. package/dist/engine/renderers/Indicator/macd.js +1 -1
  281. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  282. package/dist/engine/renderers/Indicator/mfi.js +1 -1
  283. package/dist/engine/renderers/Indicator/mfi.js.map +1 -1
  284. package/dist/engine/renderers/Indicator/mom.js +2 -2
  285. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  286. package/dist/engine/renderers/Indicator/obv.js +1 -1
  287. package/dist/engine/renderers/Indicator/obv.js.map +1 -1
  288. package/dist/engine/renderers/Indicator/parkinson.js +2 -2
  289. package/dist/engine/renderers/Indicator/parkinson.js.map +1 -1
  290. package/dist/engine/renderers/Indicator/pivot.js +1 -1
  291. package/dist/engine/renderers/Indicator/pivot.js.map +1 -1
  292. package/dist/engine/renderers/Indicator/pvt.js +1 -1
  293. package/dist/engine/renderers/Indicator/pvt.js.map +1 -1
  294. package/dist/engine/renderers/Indicator/roc.js +1 -1
  295. package/dist/engine/renderers/Indicator/roc.js.map +1 -1
  296. package/dist/engine/renderers/Indicator/rsi.js +1 -1
  297. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  298. package/dist/engine/renderers/Indicator/sar.js +1 -1
  299. package/dist/engine/renderers/Indicator/sar.js.map +1 -1
  300. package/dist/engine/renderers/Indicator/stoch.js +1 -1
  301. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  302. package/dist/engine/renderers/Indicator/structure.js +1 -1
  303. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  304. package/dist/engine/renderers/Indicator/supertrend.js +1 -1
  305. package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
  306. package/dist/engine/renderers/Indicator/tema.js +1 -1
  307. package/dist/engine/renderers/Indicator/tema.js.map +1 -1
  308. package/dist/engine/renderers/Indicator/trix.js +2 -2
  309. package/dist/engine/renderers/Indicator/trix.js.map +1 -1
  310. package/dist/engine/renderers/Indicator/vma.js +2 -2
  311. package/dist/engine/renderers/Indicator/vma.js.map +1 -1
  312. package/dist/engine/renderers/Indicator/volumeProfile.js +1 -1
  313. package/dist/engine/renderers/Indicator/volumeProfile.js.map +1 -1
  314. package/dist/engine/renderers/Indicator/vwap.js +1 -1
  315. package/dist/engine/renderers/Indicator/vwap.js.map +1 -1
  316. package/dist/engine/renderers/Indicator/wma.js +1 -1
  317. package/dist/engine/renderers/Indicator/wma.js.map +1 -1
  318. package/dist/engine/renderers/Indicator/wmsr.js +1 -1
  319. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  320. package/dist/engine/renderers/Indicator/zones.js +1 -1
  321. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  322. package/dist/engine/renderers/candle.d.ts.map +1 -1
  323. package/dist/engine/renderers/candle.js +94 -60
  324. package/dist/engine/renderers/candle.js.map +1 -1
  325. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  326. package/dist/engine/renderers/extremaMarkers.js +5 -6
  327. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  328. package/dist/engine/renderers/gridLines.js +1 -1
  329. package/dist/engine/renderers/gridLines.js.map +1 -1
  330. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -1
  331. package/dist/engine/renderers/leftYAxis.js +24 -3
  332. package/dist/engine/renderers/leftYAxis.js.map +1 -1
  333. package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
  334. package/dist/engine/renderers/timeAxis.js +2 -0
  335. package/dist/engine/renderers/timeAxis.js.map +1 -1
  336. package/dist/engine/renderers/timeShare.js +1 -1
  337. package/dist/engine/renderers/timeShare.js.map +1 -1
  338. package/dist/engine/viewport/chartViewportManager.d.ts +34 -1
  339. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  340. package/dist/engine/viewport/chartViewportManager.js +57 -22
  341. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  342. package/dist/mcp/chartBridge.js +1 -1
  343. package/dist/mcp/chartBridge.js.map +1 -1
  344. package/dist/plugin/types.d.ts +4 -0
  345. package/dist/plugin/types.d.ts.map +1 -1
  346. package/dist/plugin/types.js.map +1 -1
  347. package/dist/utils/dateFormat.d.ts +2 -2
  348. package/dist/utils/dateFormat.d.ts.map +1 -1
  349. package/dist/utils/dateFormat.js +6 -6
  350. package/dist/utils/dateFormat.js.map +1 -1
  351. package/dist/utils/kLineDraw/axis.d.ts +4 -0
  352. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  353. package/dist/utils/kLineDraw/axis.js +2 -2
  354. package/dist/utils/kLineDraw/axis.js.map +1 -1
  355. package/dist/utils/volumePrice.d.ts.map +1 -1
  356. package/dist/utils/volumePrice.js +20 -3
  357. package/dist/utils/volumePrice.js.map +1 -1
  358. package/dist/version.d.ts +1 -1
  359. package/dist/version.js +1 -1
  360. package/package.json +1 -1
  361. package/src/controllers/createChartController.ts +2 -2
  362. package/src/controllers/index.ts +1 -1
  363. package/src/controllers/types.ts +2 -2
  364. package/src/data-fetchers/__tests__/dataBuffer.test.ts +135 -0
  365. package/src/data-fetchers/dataBuffer.ts +61 -9
  366. package/src/engine/chart.ts +0 -43
  367. package/src/engine/controller/interaction.ts +186 -76
  368. package/src/engine/data/chartDataManager.ts +16 -4
  369. package/src/engine/drawing/index.ts +2 -36
  370. package/src/engine/drawing/interaction.ts +1 -1
  371. package/src/engine/drawing/linearRegression.ts +36 -0
  372. package/src/engine/drawing/plugin.ts +160 -97
  373. package/src/engine/indicators/__tests__/calculators.test.ts +9 -1
  374. package/src/engine/indicators/__tests__/indicatorRegistry.test.ts +10 -5
  375. package/src/engine/indicators/__tests__/scheduler.test.ts +12 -12
  376. package/src/engine/indicators/__tests__/soa.test.ts +46 -12
  377. package/src/engine/indicators/calculators/_shared.ts +44 -0
  378. package/src/engine/indicators/calculators/bands.ts +365 -0
  379. package/src/engine/indicators/calculators/index.ts +37 -0
  380. package/src/engine/indicators/calculators/movingAverages.ts +189 -0
  381. package/src/engine/indicators/calculators/oscillators.ts +446 -0
  382. package/src/engine/indicators/calculators/patterns.ts +287 -0
  383. package/src/engine/indicators/calculators/volatility.ts +150 -0
  384. package/src/engine/indicators/calculators/volume.ts +248 -0
  385. package/src/engine/indicators/calculators.ts +1 -2460
  386. package/src/engine/indicators/chartIndicatorManager.ts +3 -44
  387. package/src/engine/indicators/indicatorRegistry.ts +15 -0
  388. package/src/engine/indicators/indicatorRuntime.ts +2 -2
  389. package/src/engine/indicators/scheduler.ts +39 -154
  390. package/src/engine/indicators/{atrState.ts → state/atrState.ts} +2 -2
  391. package/src/engine/indicators/{bollState.ts → state/bollState.ts} +8 -5
  392. package/src/engine/indicators/{cciState.ts → state/cciState.ts} +2 -2
  393. package/src/engine/indicators/{chaikinVolState.ts → state/chaikinVolState.ts} +2 -2
  394. package/src/engine/indicators/{cmfState.ts → state/cmfState.ts} +2 -2
  395. package/src/engine/indicators/{demaState.ts → state/demaState.ts} +2 -2
  396. package/src/engine/indicators/{donchianState.ts → state/donchianState.ts} +2 -2
  397. package/src/engine/indicators/{eneState.ts → state/eneState.ts} +8 -5
  398. package/src/engine/indicators/{expmaState.ts → state/expmaState.ts} +8 -5
  399. package/src/engine/indicators/{fastkState.ts → state/fastkState.ts} +2 -2
  400. package/src/engine/indicators/{fibState.ts → state/fibState.ts} +2 -2
  401. package/src/engine/indicators/{hmaState.ts → state/hmaState.ts} +2 -2
  402. package/src/engine/indicators/{hvState.ts → state/hvState.ts} +2 -2
  403. package/src/engine/indicators/{ichimokuState.ts → state/ichimokuState.ts} +2 -2
  404. package/src/engine/indicators/{kamaState.ts → state/kamaState.ts} +2 -2
  405. package/src/engine/indicators/{keltnerState.ts → state/keltnerState.ts} +2 -2
  406. package/src/engine/indicators/{kstState.ts → state/kstState.ts} +3 -3
  407. package/src/engine/indicators/{maState.ts → state/maState.ts} +2 -2
  408. package/src/engine/indicators/{macdState.ts → state/macdState.ts} +3 -20
  409. package/src/engine/indicators/{mfiState.ts → state/mfiState.ts} +2 -2
  410. package/src/engine/indicators/{momState.ts → state/momState.ts} +2 -2
  411. package/src/engine/indicators/{obvState.ts → state/obvState.ts} +2 -2
  412. package/src/engine/indicators/{parkinsonState.ts → state/parkinsonState.ts} +2 -2
  413. package/src/engine/indicators/{pivotState.ts → state/pivotState.ts} +2 -2
  414. package/src/engine/indicators/{pvtState.ts → state/pvtState.ts} +2 -2
  415. package/src/engine/indicators/{rocState.ts → state/rocState.ts} +2 -2
  416. package/src/engine/indicators/{rsiState.ts → state/rsiState.ts} +9 -5
  417. package/src/engine/indicators/{sarState.ts → state/sarState.ts} +2 -2
  418. package/src/engine/indicators/{stochState.ts → state/stochState.ts} +3 -3
  419. package/src/engine/indicators/{structureState.ts → state/structureState.ts} +2 -2
  420. package/src/engine/indicators/{supertrendState.ts → state/supertrendState.ts} +2 -2
  421. package/src/engine/indicators/{temaState.ts → state/temaState.ts} +2 -2
  422. package/src/engine/indicators/{trixState.ts → state/trixState.ts} +2 -2
  423. package/src/engine/indicators/{vmaState.ts → state/vmaState.ts} +2 -2
  424. package/src/engine/indicators/{volumeProfileState.ts → state/volumeProfileState.ts} +2 -2
  425. package/src/engine/indicators/{vwapState.ts → state/vwapState.ts} +2 -2
  426. package/src/engine/indicators/{wmaState.ts → state/wmaState.ts} +2 -2
  427. package/src/engine/indicators/{wmsrState.ts → state/wmsrState.ts} +2 -2
  428. package/src/engine/indicators/{zonesState.ts → state/zonesState.ts} +2 -2
  429. package/src/engine/indicators/stateComposer.ts +39 -39
  430. package/src/engine/indicators/visibleStateComposers.ts +203 -30
  431. package/src/engine/layout/pane.ts +2 -2
  432. package/src/engine/paneRenderer.ts +2 -6
  433. package/src/engine/render/chartRenderer.ts +7 -2
  434. package/src/engine/renderers/Indicator/__tests__/createSubIndicatorRenderer.test.ts +1 -1
  435. package/src/engine/renderers/Indicator/atr.ts +3 -3
  436. package/src/engine/renderers/Indicator/boll.ts +1 -1
  437. package/src/engine/renderers/Indicator/cci.ts +2 -2
  438. package/src/engine/renderers/Indicator/chaikinVol.ts +2 -2
  439. package/src/engine/renderers/Indicator/cmf.ts +2 -2
  440. package/src/engine/renderers/Indicator/dema.ts +2 -2
  441. package/src/engine/renderers/Indicator/donchian.ts +2 -2
  442. package/src/engine/renderers/Indicator/ene.ts +1 -1
  443. package/src/engine/renderers/Indicator/expma.ts +1 -1
  444. package/src/engine/renderers/Indicator/fastk.ts +2 -2
  445. package/src/engine/renderers/Indicator/fib.ts +2 -2
  446. package/src/engine/renderers/Indicator/hma.ts +2 -2
  447. package/src/engine/renderers/Indicator/hv.ts +3 -3
  448. package/src/engine/renderers/Indicator/ichimoku.ts +111 -85
  449. package/src/engine/renderers/Indicator/kama.ts +3 -3
  450. package/src/engine/renderers/Indicator/keltner.ts +4 -4
  451. package/src/engine/renderers/Indicator/kst.ts +5 -5
  452. package/src/engine/renderers/Indicator/ma.ts +2 -2
  453. package/src/engine/renderers/Indicator/macd.ts +40 -40
  454. package/src/engine/renderers/Indicator/mfi.ts +3 -3
  455. package/src/engine/renderers/Indicator/mom.ts +4 -4
  456. package/src/engine/renderers/Indicator/obv.ts +3 -3
  457. package/src/engine/renderers/Indicator/parkinson.ts +5 -5
  458. package/src/engine/renderers/Indicator/pivot.ts +4 -4
  459. package/src/engine/renderers/Indicator/pvt.ts +3 -3
  460. package/src/engine/renderers/Indicator/roc.ts +3 -3
  461. package/src/engine/renderers/Indicator/rsi.ts +4 -4
  462. package/src/engine/renderers/Indicator/sar.ts +3 -3
  463. package/src/engine/renderers/Indicator/stoch.ts +4 -4
  464. package/src/engine/renderers/Indicator/structure.ts +24 -24
  465. package/src/engine/renderers/Indicator/supertrend.ts +4 -4
  466. package/src/engine/renderers/Indicator/tema.ts +3 -3
  467. package/src/engine/renderers/Indicator/trix.ts +34 -34
  468. package/src/engine/renderers/Indicator/vma.ts +3 -3
  469. package/src/engine/renderers/Indicator/volumeProfile.ts +28 -28
  470. package/src/engine/renderers/Indicator/vwap.ts +3 -3
  471. package/src/engine/renderers/Indicator/wma.ts +3 -3
  472. package/src/engine/renderers/Indicator/wmsr.ts +3 -3
  473. package/src/engine/renderers/Indicator/zones.ts +6 -6
  474. package/src/engine/renderers/__tests__/boll.renderer.test.ts +1 -1
  475. package/src/engine/renderers/__tests__/ene.renderer.test.ts +1 -1
  476. package/src/engine/renderers/__tests__/expma.renderer.test.ts +1 -1
  477. package/src/engine/renderers/__tests__/ma.renderer.test.ts +1 -1
  478. package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +4 -4
  479. package/src/engine/renderers/candle.ts +112 -70
  480. package/src/engine/renderers/extremaMarkers.ts +5 -3
  481. package/src/engine/renderers/gridLines.ts +1 -1
  482. package/src/engine/renderers/leftYAxis.ts +26 -3
  483. package/src/engine/renderers/timeAxis.ts +2 -0
  484. package/src/engine/renderers/timeShare.ts +10 -10
  485. package/src/engine/viewport/chartViewportManager.ts +61 -26
  486. package/src/mcp/chartBridge.ts +1 -1
  487. package/src/plugin/types.ts +4 -0
  488. package/src/utils/__tests__/dateFormat.test.ts +164 -0
  489. package/src/utils/dateFormat.ts +12 -6
  490. package/src/utils/kLineDraw/axis.ts +6 -2
  491. package/src/utils/volumePrice.ts +19 -3
  492. package/src/version.ts +1 -1
  493. package/dist/engine/indicators/atrState.d.ts.map +0 -1
  494. package/dist/engine/indicators/atrState.js.map +0 -1
  495. package/dist/engine/indicators/bollState.d.ts.map +0 -1
  496. package/dist/engine/indicators/bollState.js.map +0 -1
  497. package/dist/engine/indicators/cciState.d.ts.map +0 -1
  498. package/dist/engine/indicators/cciState.js.map +0 -1
  499. package/dist/engine/indicators/chaikinVolState.d.ts.map +0 -1
  500. package/dist/engine/indicators/chaikinVolState.js.map +0 -1
  501. package/dist/engine/indicators/cmfState.d.ts.map +0 -1
  502. package/dist/engine/indicators/cmfState.js.map +0 -1
  503. package/dist/engine/indicators/demaState.d.ts.map +0 -1
  504. package/dist/engine/indicators/demaState.js.map +0 -1
  505. package/dist/engine/indicators/donchianState.d.ts.map +0 -1
  506. package/dist/engine/indicators/donchianState.js.map +0 -1
  507. package/dist/engine/indicators/eneState.d.ts.map +0 -1
  508. package/dist/engine/indicators/eneState.js.map +0 -1
  509. package/dist/engine/indicators/expmaState.d.ts.map +0 -1
  510. package/dist/engine/indicators/expmaState.js.map +0 -1
  511. package/dist/engine/indicators/fastkState.d.ts.map +0 -1
  512. package/dist/engine/indicators/fastkState.js.map +0 -1
  513. package/dist/engine/indicators/fibState.d.ts.map +0 -1
  514. package/dist/engine/indicators/fibState.js.map +0 -1
  515. package/dist/engine/indicators/hmaState.d.ts.map +0 -1
  516. package/dist/engine/indicators/hmaState.js.map +0 -1
  517. package/dist/engine/indicators/hvState.d.ts.map +0 -1
  518. package/dist/engine/indicators/hvState.js.map +0 -1
  519. package/dist/engine/indicators/ichimokuState.d.ts.map +0 -1
  520. package/dist/engine/indicators/ichimokuState.js.map +0 -1
  521. package/dist/engine/indicators/kamaState.d.ts.map +0 -1
  522. package/dist/engine/indicators/kamaState.js.map +0 -1
  523. package/dist/engine/indicators/keltnerState.d.ts.map +0 -1
  524. package/dist/engine/indicators/keltnerState.js.map +0 -1
  525. package/dist/engine/indicators/kstState.d.ts.map +0 -1
  526. package/dist/engine/indicators/kstState.js.map +0 -1
  527. package/dist/engine/indicators/maState.d.ts.map +0 -1
  528. package/dist/engine/indicators/maState.js.map +0 -1
  529. package/dist/engine/indicators/macdState.d.ts.map +0 -1
  530. package/dist/engine/indicators/macdState.js.map +0 -1
  531. package/dist/engine/indicators/mfiState.d.ts.map +0 -1
  532. package/dist/engine/indicators/mfiState.js.map +0 -1
  533. package/dist/engine/indicators/momState.d.ts.map +0 -1
  534. package/dist/engine/indicators/momState.js.map +0 -1
  535. package/dist/engine/indicators/obvState.d.ts.map +0 -1
  536. package/dist/engine/indicators/obvState.js.map +0 -1
  537. package/dist/engine/indicators/parkinsonState.d.ts.map +0 -1
  538. package/dist/engine/indicators/parkinsonState.js.map +0 -1
  539. package/dist/engine/indicators/pivotState.d.ts.map +0 -1
  540. package/dist/engine/indicators/pivotState.js.map +0 -1
  541. package/dist/engine/indicators/pvtState.d.ts.map +0 -1
  542. package/dist/engine/indicators/pvtState.js.map +0 -1
  543. package/dist/engine/indicators/rocState.d.ts.map +0 -1
  544. package/dist/engine/indicators/rocState.js.map +0 -1
  545. package/dist/engine/indicators/rsiState.d.ts.map +0 -1
  546. package/dist/engine/indicators/rsiState.js.map +0 -1
  547. package/dist/engine/indicators/sarState.d.ts.map +0 -1
  548. package/dist/engine/indicators/sarState.js.map +0 -1
  549. package/dist/engine/indicators/stochState.d.ts.map +0 -1
  550. package/dist/engine/indicators/stochState.js.map +0 -1
  551. package/dist/engine/indicators/structureState.d.ts.map +0 -1
  552. package/dist/engine/indicators/structureState.js.map +0 -1
  553. package/dist/engine/indicators/supertrendState.d.ts.map +0 -1
  554. package/dist/engine/indicators/supertrendState.js.map +0 -1
  555. package/dist/engine/indicators/temaState.d.ts.map +0 -1
  556. package/dist/engine/indicators/temaState.js.map +0 -1
  557. package/dist/engine/indicators/trixState.d.ts.map +0 -1
  558. package/dist/engine/indicators/trixState.js.map +0 -1
  559. package/dist/engine/indicators/vmaState.d.ts.map +0 -1
  560. package/dist/engine/indicators/vmaState.js.map +0 -1
  561. package/dist/engine/indicators/volumeProfileState.d.ts.map +0 -1
  562. package/dist/engine/indicators/volumeProfileState.js.map +0 -1
  563. package/dist/engine/indicators/vwapState.d.ts.map +0 -1
  564. package/dist/engine/indicators/vwapState.js.map +0 -1
  565. package/dist/engine/indicators/wmaState.d.ts.map +0 -1
  566. package/dist/engine/indicators/wmaState.js.map +0 -1
  567. package/dist/engine/indicators/wmsrState.d.ts.map +0 -1
  568. package/dist/engine/indicators/wmsrState.js.map +0 -1
  569. package/dist/engine/indicators/zonesState.d.ts.map +0 -1
  570. package/dist/engine/indicators/zonesState.js.map +0 -1
  571. /package/dist/engine/indicators/{macdState.js → state/macdState.js} +0 -0
@@ -0,0 +1,287 @@
1
+ import type { KLineData } from '../../../types/price'
2
+
3
+ export interface PivotPoint {
4
+ pp: number
5
+ r1: number
6
+ r2: number
7
+ r3: number
8
+ s1: number
9
+ s2: number
10
+ s3: number
11
+ }
12
+
13
+ export function calcPivotData(data: KLineData[]): (PivotPoint | undefined)[] {
14
+ const n = data.length
15
+ const result: (PivotPoint | undefined)[] = new Array(n).fill(undefined)
16
+ if (n < 2) return result
17
+ for (let t = 1; t < n; t++) {
18
+ const p = data[t - 1]!
19
+ const pp = (p.high + p.low + p.close) / 3
20
+ const range = p.high - p.low
21
+ result[t] = {
22
+ pp,
23
+ r1: 2 * pp - p.low,
24
+ s1: 2 * pp - p.high,
25
+ r2: pp + range,
26
+ s2: pp - range,
27
+ r3: p.high + 2 * (pp - p.low),
28
+ s3: p.low - 2 * (p.high - pp),
29
+ }
30
+ }
31
+ return result
32
+ }
33
+
34
+ export interface FibPoint {
35
+ high: number
36
+ low: number
37
+ direction: 'up' | 'down'
38
+ level236: number
39
+ level382: number
40
+ level500: number
41
+ level618: number
42
+ level786: number
43
+ }
44
+
45
+ export function calcFibData(data: KLineData[], period: number): (FibPoint | undefined)[] {
46
+ const n = data.length
47
+ const result: (FibPoint | undefined)[] = new Array(n).fill(undefined)
48
+ if (n === 0 || period <= 0 || n < period) return result
49
+
50
+ for (let t = period - 1; t < n; t++) {
51
+ let hi = -Infinity
52
+ let lo = Infinity
53
+ let hiIdx = t
54
+ let loIdx = t
55
+ for (let k = 0; k < period; k++) {
56
+ const bar = data[t - k]!
57
+ if (bar.high > hi) { hi = bar.high; hiIdx = t - k }
58
+ if (bar.low < lo) { lo = bar.low; loIdx = t - k }
59
+ }
60
+ const direction: 'up' | 'down' = hiIdx >= loIdx ? 'up' : 'down'
61
+ const range = hi - lo
62
+ const level = (frac: number) =>
63
+ direction === 'up' ? hi - range * frac : lo + range * frac
64
+ result[t] = {
65
+ high: hi,
66
+ low: lo,
67
+ direction,
68
+ level236: level(0.236),
69
+ level382: level(0.382),
70
+ level500: level(0.5),
71
+ level618: level(0.618),
72
+ level786: level(0.786),
73
+ }
74
+ }
75
+ return result
76
+ }
77
+
78
+ export interface SwingPoint {
79
+ index: number
80
+ price: number
81
+ kind: 'high' | 'low'
82
+ label: 'HH' | 'HL' | 'LH' | 'LL'
83
+ confirmed: boolean
84
+ }
85
+
86
+ export type StructureEventKind = 'BOS' | 'CHOCH'
87
+
88
+ export interface StructureEvent {
89
+ kind: StructureEventKind
90
+ index: number
91
+ triggerPrice: number
92
+ brokenLevel: number
93
+ brokenSwingIndex: number
94
+ direction: 'up' | 'down'
95
+ }
96
+
97
+ export interface StructureSnapshot {
98
+ swings: SwingPoint[]
99
+ events: StructureEvent[]
100
+ trend: 'up' | 'down' | 'range'
101
+ }
102
+
103
+ function isExtremum(
104
+ data: KLineData[],
105
+ i: number,
106
+ left: number,
107
+ right: number,
108
+ kind: 'high' | 'low',
109
+ ): boolean {
110
+ const n = data.length
111
+ if (i < left || i + right >= n) return false
112
+ const center = kind === 'high' ? data[i]!.high : data[i]!.low
113
+ for (let k = 1; k <= left; k++) {
114
+ const v = kind === 'high' ? data[i - k]!.high : data[i - k]!.low
115
+ if (kind === 'high' ? v >= center : v <= center) return false
116
+ }
117
+ for (let k = 1; k <= right; k++) {
118
+ const v = kind === 'high' ? data[i + k]!.high : data[i + k]!.low
119
+ if (kind === 'high' ? v >= center : v <= center) return false
120
+ }
121
+ return true
122
+ }
123
+
124
+ export function calcStructureData(
125
+ data: KLineData[],
126
+ leftWindow: number,
127
+ rightWindow: number,
128
+ breakoutSource: 'close' | 'wick',
129
+ ): StructureSnapshot {
130
+ const n = data.length
131
+ if (n === 0 || leftWindow < 0 || rightWindow < 0) {
132
+ return { swings: [], events: [], trend: 'range' }
133
+ }
134
+
135
+ const rawSwings: { index: number; price: number; kind: 'high' | 'low'; confirmed: boolean }[] = []
136
+ for (let i = 0; i < n; i++) {
137
+ const bar = data[i]!
138
+ if (isExtremum(data, i, leftWindow, rightWindow, 'high')) {
139
+ rawSwings.push({ index: i, price: bar.high, kind: 'high', confirmed: i + rightWindow < n })
140
+ }
141
+ if (isExtremum(data, i, leftWindow, rightWindow, 'low')) {
142
+ rawSwings.push({ index: i, price: bar.low, kind: 'low', confirmed: i + rightWindow < n })
143
+ }
144
+ }
145
+ rawSwings.sort((a, b) => a.index - b.index)
146
+
147
+ const swings: SwingPoint[] = []
148
+ let lastHigh: { index: number; price: number } | null = null
149
+ let lastLow: { index: number; price: number } | null = null
150
+ for (const s of rawSwings) {
151
+ let label: 'HH' | 'HL' | 'LH' | 'LL'
152
+ if (s.kind === 'high') {
153
+ label = lastHigh && s.price > lastHigh.price ? 'HH' : 'LH'
154
+ lastHigh = { index: s.index, price: s.price }
155
+ } else {
156
+ label = lastLow && s.price > lastLow.price ? 'HL' : 'LL'
157
+ lastLow = { index: s.index, price: s.price }
158
+ }
159
+ swings.push({ ...s, label })
160
+ }
161
+
162
+ const events: StructureEvent[] = []
163
+ let trend: 'up' | 'down' | 'range' = 'range'
164
+ let lastSwingHigh: { index: number; price: number } | null = null
165
+ let lastSwingLow: { index: number; price: number } | null = null
166
+ const confirmedSwings = swings.filter((s) => s.confirmed)
167
+ let swingCursor = 0
168
+
169
+ for (let t = 0; t < n; t++) {
170
+ while (swingCursor < confirmedSwings.length && confirmedSwings[swingCursor]!.index + rightWindow <= t) {
171
+ const s = confirmedSwings[swingCursor]!
172
+ if (s.kind === 'high') lastSwingHigh = { index: s.index, price: s.price }
173
+ else lastSwingLow = { index: s.index, price: s.price }
174
+ swingCursor++
175
+ }
176
+
177
+ const bar = data[t]!
178
+ const upBreakPrice = breakoutSource === 'close' ? bar.close : bar.high
179
+ const downBreakPrice = breakoutSource === 'close' ? bar.close : bar.low
180
+
181
+ if (lastSwingHigh && upBreakPrice > lastSwingHigh.price) {
182
+ const kind: StructureEventKind = trend === 'down' ? 'CHOCH' : 'BOS'
183
+ events.push({
184
+ kind,
185
+ index: t,
186
+ triggerPrice: upBreakPrice,
187
+ brokenLevel: lastSwingHigh.price,
188
+ brokenSwingIndex: lastSwingHigh.index,
189
+ direction: 'up',
190
+ })
191
+ trend = 'up'
192
+ lastSwingHigh = null
193
+ } else if (lastSwingLow && downBreakPrice < lastSwingLow.price) {
194
+ const kind: StructureEventKind = trend === 'up' ? 'CHOCH' : 'BOS'
195
+ events.push({
196
+ kind,
197
+ index: t,
198
+ triggerPrice: downBreakPrice,
199
+ brokenLevel: lastSwingLow.price,
200
+ brokenSwingIndex: lastSwingLow.index,
201
+ direction: 'down',
202
+ })
203
+ trend = 'down'
204
+ lastSwingLow = null
205
+ }
206
+ }
207
+
208
+ return { swings, events, trend }
209
+ }
210
+
211
+ export type ZoneKind = 'FVG_BULL' | 'FVG_BEAR' | 'OB_BULL' | 'OB_BEAR'
212
+
213
+ export interface Zone {
214
+ kind: ZoneKind
215
+ startIndex: number
216
+ endIndex?: number
217
+ high: number
218
+ low: number
219
+ }
220
+
221
+ export function calcZonesData(
222
+ data: KLineData[],
223
+ obLookback: number,
224
+ structureLeftWindow: number,
225
+ structureRightWindow: number,
226
+ breakoutSource: 'close' | 'wick',
227
+ ): Zone[] {
228
+ const n = data.length
229
+ if (n < 3) return []
230
+ const zones: Zone[] = []
231
+
232
+ for (let t = 2; t < n; t++) {
233
+ const a = data[t - 2]!
234
+ const c = data[t]!
235
+ if (a.high < c.low) {
236
+ zones.push({
237
+ kind: 'FVG_BULL',
238
+ startIndex: t - 1,
239
+ high: c.low,
240
+ low: a.high,
241
+ })
242
+ }
243
+ if (a.low > c.high) {
244
+ zones.push({
245
+ kind: 'FVG_BEAR',
246
+ startIndex: t - 1,
247
+ high: a.low,
248
+ low: c.high,
249
+ })
250
+ }
251
+ }
252
+
253
+ const struct = calcStructureData(data, structureLeftWindow, structureRightWindow, breakoutSource)
254
+ for (const ev of struct.events) {
255
+ if (ev.kind !== 'BOS') continue
256
+ const start = Math.max(0, ev.index - obLookback)
257
+ if (ev.direction === 'up') {
258
+ for (let k = ev.index - 1; k >= start; k--) {
259
+ const bar = data[k]!
260
+ if (bar.close < bar.open) {
261
+ zones.push({ kind: 'OB_BULL', startIndex: k, high: bar.high, low: bar.low })
262
+ break
263
+ }
264
+ }
265
+ } else {
266
+ for (let k = ev.index - 1; k >= start; k--) {
267
+ const bar = data[k]!
268
+ if (bar.close > bar.open) {
269
+ zones.push({ kind: 'OB_BEAR', startIndex: k, high: bar.high, low: bar.low })
270
+ break
271
+ }
272
+ }
273
+ }
274
+ }
275
+
276
+ for (const zone of zones) {
277
+ for (let t = zone.startIndex + 1; t < n; t++) {
278
+ const bar = data[t]!
279
+ if (bar.low <= zone.high && bar.high >= zone.low) {
280
+ zone.endIndex = t
281
+ break
282
+ }
283
+ }
284
+ }
285
+
286
+ return zones
287
+ }
@@ -0,0 +1,150 @@
1
+ import type { KLineData } from '../../../types/price'
2
+ import { _computeEMASeries } from './_shared'
3
+
4
+ export function calcATRData(data: KLineData[], period: number): (number | undefined)[] {
5
+ const n = data.length
6
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
7
+ if (n === 0 || period <= 0) return result
8
+
9
+ if (period === 1) {
10
+ const first = data[0]!
11
+ result[0] = first.high - first.low
12
+ let prevClose = first.close
13
+ for (let i = 1; i < n; i++) {
14
+ const cur = data[i]!
15
+ const tr = Math.max(
16
+ cur.high - cur.low,
17
+ Math.abs(cur.high - prevClose),
18
+ Math.abs(cur.low - prevClose),
19
+ )
20
+ result[i] = tr
21
+ prevClose = cur.close
22
+ }
23
+ return result
24
+ }
25
+
26
+ if (n < period) return result
27
+
28
+ const first = data[0]!
29
+ let sumTR = first.high - first.low
30
+ let prevClose = first.close
31
+
32
+ for (let i = 1; i < period; i++) {
33
+ const cur = data[i]!
34
+ sumTR += Math.max(
35
+ cur.high - cur.low,
36
+ Math.abs(cur.high - prevClose),
37
+ Math.abs(cur.low - prevClose),
38
+ )
39
+ prevClose = cur.close
40
+ }
41
+
42
+ let atr = sumTR / period
43
+ result[period - 1] = atr
44
+
45
+ const periodMinusOne = period - 1
46
+ for (let i = period; i < n; i++) {
47
+ const cur = data[i]!
48
+ const tr = Math.max(
49
+ cur.high - cur.low,
50
+ Math.abs(cur.high - prevClose),
51
+ Math.abs(cur.low - prevClose),
52
+ )
53
+ atr = (periodMinusOne * atr + tr) / period
54
+ result[i] = atr
55
+ prevClose = cur.close
56
+ }
57
+
58
+ return result
59
+ }
60
+
61
+ export function calcHVData(
62
+ data: KLineData[],
63
+ period: number,
64
+ annualizationFactor: number,
65
+ ): (number | undefined)[] {
66
+ const n = data.length
67
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
68
+ if (n < 2 || period <= 0 || annualizationFactor <= 0) return result
69
+
70
+ const logReturns: number[] = new Array(n)
71
+ logReturns[0] = 0
72
+ for (let t = 1; t < n; t++) {
73
+ const prev = data[t - 1]!.close
74
+ const cur = data[t]!.close
75
+ logReturns[t] = (prev > 0 && cur > 0) ? Math.log(cur / prev) : 0
76
+ }
77
+
78
+ const annScale = Math.sqrt(annualizationFactor)
79
+ for (let t = period; t < n; t++) {
80
+ let sum = 0
81
+ for (let k = 1; k <= period; k++) sum += logReturns[t - period + k]!
82
+ const mean = sum / period
83
+ let varSum = 0
84
+ for (let k = 1; k <= period; k++) {
85
+ const diff = logReturns[t - period + k]! - mean
86
+ varSum += diff * diff
87
+ }
88
+ const std = Math.sqrt(varSum / (period - 1 > 0 ? period - 1 : 1))
89
+ result[t] = std * annScale * 100
90
+ }
91
+
92
+ return result
93
+ }
94
+
95
+ export function calcParkinsonData(
96
+ data: KLineData[],
97
+ period: number,
98
+ annualizationFactor: number,
99
+ ): (number | undefined)[] {
100
+ const n = data.length
101
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
102
+ if (n === 0 || period <= 0 || annualizationFactor <= 0 || n < period) return result
103
+
104
+ const factor = 1 / (4 * Math.log(2))
105
+ const annScale = Math.sqrt(annualizationFactor)
106
+
107
+ const hlLogSq: number[] = new Array(n)
108
+ for (let i = 0; i < n; i++) {
109
+ const bar = data[i]!
110
+ if (bar.high > 0 && bar.low > 0) {
111
+ const ln = Math.log(bar.high / bar.low)
112
+ hlLogSq[i] = ln * ln
113
+ } else {
114
+ hlLogSq[i] = 0
115
+ }
116
+ }
117
+
118
+ for (let t = period - 1; t < n; t++) {
119
+ let sum = 0
120
+ for (let k = 0; k < period; k++) sum += hlLogSq[t - k]!
121
+ const mean = sum / period
122
+ result[t] = Math.sqrt(factor * mean) * annScale * 100
123
+ }
124
+
125
+ return result
126
+ }
127
+
128
+ export function calcChaikinVolData(
129
+ data: KLineData[],
130
+ emaPeriod: number,
131
+ rocPeriod: number,
132
+ ): (number | undefined)[] {
133
+ const n = data.length
134
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
135
+ if (n === 0 || emaPeriod <= 0 || rocPeriod <= 0) return result
136
+
137
+ const hl: (number | undefined)[] = new Array(n)
138
+ for (let i = 0; i < n; i++) hl[i] = data[i]!.high - data[i]!.low
139
+
140
+ const emaSeries = _computeEMASeries(hl, emaPeriod)
141
+
142
+ for (let t = rocPeriod; t < n; t++) {
143
+ const cur = emaSeries[t]
144
+ const prev = emaSeries[t - rocPeriod]
145
+ if (cur === undefined || prev === undefined || prev === 0) continue
146
+ result[t] = (cur - prev) / prev * 100
147
+ }
148
+
149
+ return result
150
+ }
@@ -0,0 +1,248 @@
1
+ import type { KLineData } from '../../../types/price'
2
+
3
+ export function calcVMAData(data: KLineData[], period: number): (number | undefined)[] {
4
+ const n = data.length
5
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
6
+ if (n === 0 || period <= 0 || n < period) return result
7
+ let sum = 0
8
+ for (let i = 0; i < period; i++) sum += data[i]!.volume ?? 0
9
+ result[period - 1] = sum / period
10
+ for (let t = period; t < n; t++) {
11
+ sum += (data[t]!.volume ?? 0) - (data[t - period]!.volume ?? 0)
12
+ result[t] = sum / period
13
+ }
14
+ return result
15
+ }
16
+
17
+ export function calcOBVData(data: KLineData[]): (number | undefined)[] {
18
+ const n = data.length
19
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
20
+ if (n === 0) return result
21
+ let obv = 0
22
+ result[0] = 0
23
+ for (let t = 1; t < n; t++) {
24
+ const cur = data[t]!
25
+ const prev = data[t - 1]!
26
+ if (cur.close > prev.close) obv += cur.volume ?? 0
27
+ else if (cur.close < prev.close) obv -= cur.volume ?? 0
28
+ result[t] = obv
29
+ }
30
+ return result
31
+ }
32
+
33
+ export function calcPVTData(data: KLineData[]): (number | undefined)[] {
34
+ const n = data.length
35
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
36
+ if (n === 0) return result
37
+ let pvt = 0
38
+ result[0] = 0
39
+ for (let t = 1; t < n; t++) {
40
+ const prevClose = data[t - 1]!.close
41
+ if (prevClose === 0) {
42
+ result[t] = pvt
43
+ continue
44
+ }
45
+ pvt += ((data[t]!.close - prevClose) / prevClose) * (data[t]!.volume ?? 0)
46
+ result[t] = pvt
47
+ }
48
+ return result
49
+ }
50
+
51
+ export function calcVWAPData(
52
+ data: KLineData[],
53
+ sessionResetGapMs: number,
54
+ ): (number | undefined)[] {
55
+ const n = data.length
56
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
57
+ if (n === 0) return result
58
+
59
+ let cumPV = 0
60
+ let cumV = 0
61
+ let prevTs = data[0]!.timestamp
62
+
63
+ for (let t = 0; t < n; t++) {
64
+ const bar = data[t]!
65
+ if (sessionResetGapMs > 0 && t > 0 && bar.timestamp - prevTs > sessionResetGapMs) {
66
+ cumPV = 0
67
+ cumV = 0
68
+ }
69
+ const tp = (bar.high + bar.low + bar.close) / 3
70
+ cumPV += tp * (bar.volume ?? 0)
71
+ cumV += bar.volume ?? 0
72
+ result[t] = cumV > 0 ? cumPV / cumV : tp
73
+ prevTs = bar.timestamp
74
+ }
75
+
76
+ return result
77
+ }
78
+
79
+ export function calcCMFData(data: KLineData[], period: number): (number | undefined)[] {
80
+ const n = data.length
81
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
82
+ if (n === 0 || period <= 0 || n < period) return result
83
+
84
+ const mfv: number[] = new Array(n)
85
+ for (let i = 0; i < n; i++) {
86
+ const bar = data[i]!
87
+ const range = bar.high - bar.low
88
+ const mfm = range > 0 ? ((bar.close - bar.low) - (bar.high - bar.close)) / range : 0
89
+ mfv[i] = mfm * (bar.volume ?? 0)
90
+ }
91
+
92
+ let sumMFV = 0
93
+ let sumV = 0
94
+ for (let i = 0; i < period; i++) {
95
+ sumMFV += mfv[i]!
96
+ sumV += data[i]!.volume ?? 0
97
+ }
98
+ result[period - 1] = sumV > 0 ? sumMFV / sumV : 0
99
+
100
+ for (let t = period; t < n; t++) {
101
+ sumMFV += mfv[t]! - mfv[t - period]!
102
+ sumV += (data[t]!.volume ?? 0) - (data[t - period]!.volume ?? 0)
103
+ result[t] = sumV > 0 ? sumMFV / sumV : 0
104
+ }
105
+ return result
106
+ }
107
+
108
+ export function calcMFIData(data: KLineData[], period: number): (number | undefined)[] {
109
+ const n = data.length
110
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
111
+ if (n < period + 1 || period <= 0) return result
112
+
113
+ const tp: number[] = new Array(n)
114
+ for (let i = 0; i < n; i++) tp[i] = (data[i]!.high + data[i]!.low + data[i]!.close) / 3
115
+
116
+ const pmfArr: number[] = new Array(n)
117
+ const nmfArr: number[] = new Array(n)
118
+ pmfArr[0] = 0
119
+ nmfArr[0] = 0
120
+ for (let i = 1; i < n; i++) {
121
+ const rmf = tp[i]! * (data[i]!.volume ?? 0)
122
+ if (tp[i]! > tp[i - 1]!) {
123
+ pmfArr[i] = rmf
124
+ nmfArr[i] = 0
125
+ } else if (tp[i]! < tp[i - 1]!) {
126
+ pmfArr[i] = 0
127
+ nmfArr[i] = rmf
128
+ } else {
129
+ pmfArr[i] = 0
130
+ nmfArr[i] = 0
131
+ }
132
+ }
133
+
134
+ let pSum = 0
135
+ let nSum = 0
136
+ for (let i = 1; i <= period; i++) {
137
+ pSum += pmfArr[i]!
138
+ nSum += nmfArr[i]!
139
+ }
140
+ result[period] = nSum > 0 ? 100 - 100 / (1 + pSum / nSum) : 100
141
+
142
+ for (let t = period + 1; t < n; t++) {
143
+ pSum += pmfArr[t]! - pmfArr[t - period]!
144
+ nSum += nmfArr[t]! - nmfArr[t - period]!
145
+ result[t] = nSum > 0 ? 100 - 100 / (1 + pSum / nSum) : 100
146
+ }
147
+ return result
148
+ }
149
+
150
+ export interface VolumeProfileBin {
151
+ priceLow: number
152
+ priceHigh: number
153
+ volume: number
154
+ }
155
+
156
+ export interface VolumeProfileResult {
157
+ bins: VolumeProfileBin[]
158
+ poc: number
159
+ vah: number
160
+ val: number
161
+ totalVolume: number
162
+ }
163
+
164
+ export function calcVolumeProfileData(
165
+ data: KLineData[],
166
+ bins: number,
167
+ lookback: number,
168
+ valueAreaPercent: number,
169
+ ): VolumeProfileResult {
170
+ const n = data.length
171
+ if (n === 0 || bins <= 0) {
172
+ return { bins: [], poc: 0, vah: 0, val: 0, totalVolume: 0 }
173
+ }
174
+
175
+ const startIdx = lookback > 0 ? Math.max(0, n - lookback) : 0
176
+ let priceMin = Infinity
177
+ let priceMax = -Infinity
178
+ for (let i = startIdx; i < n; i++) {
179
+ const bar = data[i]!
180
+ if (bar.low < priceMin) priceMin = bar.low
181
+ if (bar.high > priceMax) priceMax = bar.high
182
+ }
183
+ if (!Number.isFinite(priceMin) || !Number.isFinite(priceMax) || priceMax <= priceMin) {
184
+ return { bins: [], poc: priceMin, vah: priceMin, val: priceMin, totalVolume: 0 }
185
+ }
186
+
187
+ const binWidth = (priceMax - priceMin) / bins
188
+ const binVolumes: number[] = new Array(bins).fill(0)
189
+
190
+ for (let i = startIdx; i < n; i++) {
191
+ const bar = data[i]!
192
+ const barRange = bar.high - bar.low
193
+ if (barRange <= 0) {
194
+ const binIdx = Math.min(bins - 1, Math.max(0, Math.floor((bar.close - priceMin) / binWidth)))
195
+ binVolumes[binIdx]! += bar.volume ?? 0
196
+ continue
197
+ }
198
+ const volPerPrice = (bar.volume ?? 0) / barRange
199
+ const startBin = Math.max(0, Math.floor((bar.low - priceMin) / binWidth))
200
+ const endBin = Math.min(bins - 1, Math.floor((bar.high - priceMin) / binWidth))
201
+ for (let b = startBin; b <= endBin; b++) {
202
+ const binLow = priceMin + b * binWidth
203
+ const binHigh = binLow + binWidth
204
+ const overlapLow = Math.max(bar.low, binLow)
205
+ const overlapHigh = Math.min(bar.high, binHigh)
206
+ const overlap = overlapHigh - overlapLow
207
+ if (overlap > 0) {
208
+ binVolumes[b]! += overlap * volPerPrice
209
+ }
210
+ }
211
+ }
212
+
213
+ const binsArr: VolumeProfileBin[] = binVolumes.map((v, b) => ({
214
+ priceLow: priceMin + b * binWidth,
215
+ priceHigh: priceMin + (b + 1) * binWidth,
216
+ volume: v,
217
+ }))
218
+
219
+ let pocBinIdx = 0
220
+ for (let b = 1; b < bins; b++) {
221
+ if (binVolumes[b]! > binVolumes[pocBinIdx]!) pocBinIdx = b
222
+ }
223
+ const poc = (binsArr[pocBinIdx]!.priceLow + binsArr[pocBinIdx]!.priceHigh) / 2
224
+
225
+ const totalVolume = binVolumes.reduce((a, b) => a + b, 0)
226
+
227
+ const target = totalVolume * valueAreaPercent
228
+ let acc = binVolumes[pocBinIdx]!
229
+ let lo = pocBinIdx
230
+ let hi = pocBinIdx
231
+ while (acc < target && (lo > 0 || hi < bins - 1)) {
232
+ const loCand = lo > 0 ? binVolumes[lo - 1]! : -Infinity
233
+ const hiCand = hi < bins - 1 ? binVolumes[hi + 1]! : -Infinity
234
+ if (loCand >= hiCand && lo > 0) {
235
+ lo--
236
+ acc += binVolumes[lo]!
237
+ } else if (hi < bins - 1) {
238
+ hi++
239
+ acc += binVolumes[hi]!
240
+ } else {
241
+ break
242
+ }
243
+ }
244
+ const val = binsArr[lo]!.priceLow
245
+ const vah = binsArr[hi]!.priceHigh
246
+
247
+ return { bins: binsArr, poc, vah, val, totalVolume }
248
+ }