@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
@@ -10,29 +10,76 @@ import type { PrimitiveRendererSet } from './index'
10
10
  import type { KLineData } from '../../types/price'
11
11
  import { getPhysicalKLineConfig } from '../utils/klineConfig'
12
12
 
13
+ type SafeViewport = { scrollLeft: number; plotWidth: number; plotHeight: number }
14
+ type ToScreenFn = (anchor: { index: number; price: number }) => { x: number; y: number }
15
+
16
+ function resolveViewport(context: RenderContext, paneHeight: number): SafeViewport {
17
+ return context.viewport ?? {
18
+ scrollLeft: context.scrollLeft,
19
+ plotWidth: context.paneWidth,
20
+ plotHeight: paneHeight,
21
+ }
22
+ }
23
+
24
+ function createToScreen(
25
+ kWidth: number, kGap: number, dpr: number,
26
+ pane: RenderContext['pane'], viewport: SafeViewport
27
+ ): ToScreenFn {
28
+ const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, dpr)
29
+ return (anchor) => {
30
+ if (!Number.isFinite(anchor.index) || anchor.index < 0) {
31
+ return { x: -kWidth, y: pane.yAxis.priceToY(anchor.price) }
32
+ }
33
+ const x = (startXPx + anchor.index * unitPx + (unitPx - 1) / 2) / dpr - viewport.scrollLeft
34
+ return { x, y: pane.yAxis.priceToY(anchor.price) }
35
+ }
36
+ }
37
+
38
+ function renderPrimitives(
39
+ ctx: CanvasRenderingContext2D,
40
+ primitives: DrawingPrimitive[],
41
+ renderers: PrimitiveRendererSet,
42
+ viewportClip: { left: number; top: number; right: number; bottom: number },
43
+ dpr: number
44
+ ): void {
45
+ for (const primitive of primitives) {
46
+ if (primitive.kind === 'point') {
47
+ renderers.point(ctx, primitive, dpr)
48
+ continue
49
+ }
50
+ if (primitive.kind === 'line') {
51
+ renderers.line(ctx, primitive, viewportClip, dpr)
52
+ continue
53
+ }
54
+ if (primitive.kind === 'area') {
55
+ renderers.area(ctx, primitive, dpr)
56
+ continue
57
+ }
58
+ renderers.text(ctx, primitive, dpr)
59
+ }
60
+ }
61
+
13
62
  /**
14
- * 为选中的绘图推送锚点轴标签
15
- * 提取为独立函数供主插件和 overlay 插件共用
63
+ * 查找当前选中且在指定 pane 内的绘图
16
64
  */
17
- function pushSelectedDrawingLabels(
65
+ function findSelectedAnchorDrawing(
18
66
  store: DrawingStore,
19
67
  definitions: DrawingDefinitionRegistry,
20
- context: RenderContext,
21
68
  pane: RenderContext['pane'],
22
69
  seriesData: KLineData[],
23
70
  range: RenderContext['range'],
71
+ context: RenderContext,
24
72
  kWidth: number,
25
73
  kGap: number,
26
74
  dpr: number,
27
- viewport: NonNullable<RenderContext['viewport']>,
28
- startXPx: number,
29
- unitPx: number
30
- ): void {
75
+ viewport: SafeViewport,
76
+ toScreen: ToScreenFn
77
+ ) {
31
78
  const selectedId = store.getSelectedId()
32
- if (!selectedId) return
79
+ if (!selectedId) return null
33
80
 
34
81
  const selectedDrawing = store.getAll().find(d => d.id === selectedId)
35
- if (!selectedDrawing || !selectedDrawing.visible || selectedDrawing.paneId !== pane.id) return
82
+ if (!selectedDrawing || !selectedDrawing.visible || selectedDrawing.paneId !== pane.id) return null
36
83
 
37
84
  const geometry = definitions.compute(selectedDrawing, {
38
85
  pane,
@@ -47,65 +94,88 @@ function pushSelectedDrawingLabels(
47
94
  dpr,
48
95
  paneWidth: context.paneWidth,
49
96
  viewport,
50
- toScreen(anchor) {
51
- if (!Number.isFinite(anchor.index) || anchor.index < 0) {
52
- return { x: -kWidth, y: pane.yAxis.priceToY(anchor.price) }
53
- }
54
- const x = (startXPx + anchor.index * unitPx + (unitPx - 1) / 2) / dpr - viewport.scrollLeft
55
- return { x, y: pane.yAxis.priceToY(anchor.price) }
56
- },
97
+ toScreen,
57
98
  })
99
+ if (!geometry) return null
58
100
 
59
- if (!geometry) return
101
+ const allAnchors = [...selectedDrawing.anchors, ...(geometry.computedAnchors ?? [])]
102
+ if (allAnchors.length === 0) return null
60
103
 
61
- // 只在价格 pane 时添加标签
62
- if (pane.role !== 'price') return
104
+ return { drawing: selectedDrawing, allAnchors }
105
+ }
63
106
 
64
- // 合并用户锚点和计算锚点
65
- const allAnchors = [...selectedDrawing.anchors, ...(geometry.computedAnchors ?? [])]
66
- if (allAnchors.length === 0) return
107
+ /**
108
+ * 单次遍历锚点,同时计算价格范围和索引范围,推送到 context
109
+ */
110
+ function pushAnchorBands(
111
+ allAnchors: ReadonlyArray<{ price: number; index: number }>,
112
+ context: RenderContext,
113
+ pane: RenderContext['pane'],
114
+ style: DrawingStyle | undefined,
115
+ startXPx: number,
116
+ unitPx: number,
117
+ dpr: number
118
+ ): void {
119
+ if (allAnchors.length < 2) return
67
120
 
68
- // 计算锚点价格范围,用于Y轴价格范围带
69
- if (allAnchors.length >= 2) {
70
- let minP = Infinity, maxP = -Infinity
71
- for (const a of allAnchors) {
72
- if (!Number.isFinite(a.price)) continue
121
+ let minP = Infinity, maxP = -Infinity
122
+ let minIdx = Infinity, maxIdx = -Infinity
123
+
124
+ for (const a of allAnchors) {
125
+ if (Number.isFinite(a.price)) {
73
126
  if (a.price < minP) minP = a.price
74
127
  if (a.price > maxP) maxP = a.price
75
128
  }
76
- if (Number.isFinite(minP) && Number.isFinite(maxP) && minP !== maxP) {
77
- if (!context.yAxisRanges) context.yAxisRanges = []
78
- context.yAxisRanges.push({
79
- topY: pane.yAxis.priceToY(maxP),
80
- bottomY: pane.yAxis.priceToY(minP),
81
- color: selectedDrawing.style?.stroke ?? '#2962ff',
82
- opacity: 0.15,
83
- })
84
- }
85
- }
86
-
87
- // 计算锚点X坐标范围,用于X轴时间范围带
88
- if (allAnchors.length >= 2) {
89
- let minIdx = Infinity, maxIdx = -Infinity
90
- for (const a of allAnchors) {
91
- if (!Number.isFinite(a.index) || a.index < 0) continue
129
+ if (Number.isFinite(a.index) && a.index >= 0) {
92
130
  if (a.index < minIdx) minIdx = a.index
93
131
  if (a.index > maxIdx) maxIdx = a.index
94
132
  }
95
- if (Number.isFinite(minIdx) && Number.isFinite(maxIdx) && minIdx !== maxIdx) {
96
- if (!context.xAxisRanges) context.xAxisRanges = []
97
- const leftX = (startXPx + minIdx * unitPx + (unitPx - 1) / 2) / dpr
98
- const rightX = (startXPx + maxIdx * unitPx + (unitPx - 1) / 2) / dpr
99
- context.xAxisRanges.push({
100
- leftX,
101
- rightX,
102
- color: selectedDrawing.style?.stroke ?? '#2962ff',
103
- opacity: 0.15,
104
- })
105
- }
106
133
  }
107
134
 
108
- // 辅助函数:根据index获取时间戳
135
+ const strokeColor = style?.stroke ?? '#2962ff'
136
+
137
+ if (Number.isFinite(minP) && Number.isFinite(maxP) && minP !== maxP) {
138
+ if (!context.yAxisRanges) context.yAxisRanges = []
139
+ context.yAxisRanges.push({
140
+ topY: pane.yAxis.priceToY(maxP),
141
+ bottomY: pane.yAxis.priceToY(minP),
142
+ color: strokeColor,
143
+ opacity: 0.15,
144
+ })
145
+ }
146
+
147
+ if (Number.isFinite(minIdx) && Number.isFinite(maxIdx) && minIdx !== maxIdx) {
148
+ if (!context.xAxisRanges) context.xAxisRanges = []
149
+ const leftX = (startXPx + minIdx * unitPx + (unitPx - 1) / 2) / dpr
150
+ const rightX = (startXPx + maxIdx * unitPx + (unitPx - 1) / 2) / dpr
151
+ context.xAxisRanges.push({
152
+ leftX,
153
+ rightX,
154
+ color: strokeColor,
155
+ opacity: 0.15,
156
+ })
157
+ }
158
+ }
159
+
160
+ /**
161
+ * 遍历锚点,推送 Y 轴和 X 轴标签
162
+ */
163
+ function pushAnchorLabels(
164
+ allAnchors: ReadonlyArray<{ index: number; price: number; time?: number | string }>,
165
+ context: RenderContext,
166
+ pane: RenderContext['pane'],
167
+ viewport: SafeViewport,
168
+ kWidth: number,
169
+ style: DrawingStyle | undefined,
170
+ seriesData: KLineData[],
171
+ startXPx: number,
172
+ unitPx: number,
173
+ dpr: number
174
+ ): void {
175
+ if (pane.role !== 'price') return
176
+
177
+ const strokeColor = style?.stroke ?? '#2962ff'
178
+
109
179
  const getTimestampForIndex = (idx: number): number | null => {
110
180
  if (idx >= 0 && idx < seriesData.length) {
111
181
  return seriesData[idx]?.timestamp ?? null
@@ -121,7 +191,6 @@ function pushSelectedDrawingLabels(
121
191
  return null
122
192
  }
123
193
 
124
- // 推送每个锚点的标签
125
194
  for (const anchor of allAnchors) {
126
195
  if (!Number.isFinite(anchor.index) || !Number.isFinite(anchor.price)) continue
127
196
 
@@ -133,7 +202,6 @@ function pushSelectedDrawingLabels(
133
202
  return { x, y: pane.yAxis.priceToY(anchor.price) }
134
203
  })()
135
204
 
136
- // Y轴标签
137
205
  if (screenPoint.y >= 0 && screenPoint.y <= pane.height) {
138
206
  if (!context.yAxisLabels) context.yAxisLabels = []
139
207
  context.yAxisLabels.push({
@@ -141,14 +209,13 @@ function pushSelectedDrawingLabels(
141
209
  price: anchor.price,
142
210
  y: screenPoint.y,
143
211
  style: {
144
- bgColor: selectedDrawing.style?.stroke ?? '#2962ff',
145
- borderColor: selectedDrawing.style?.stroke ?? '#2962ff',
212
+ bgColor: strokeColor,
213
+ borderColor: strokeColor,
146
214
  textColor: '#ffffff',
147
215
  }
148
216
  })
149
217
  }
150
218
 
151
- // X轴标签
152
219
  if (screenPoint.x >= -kWidth && screenPoint.x <= viewport.plotWidth + kWidth) {
153
220
  const timestamp = anchor.time
154
221
  ? (typeof anchor.time === 'string' ? new Date(anchor.time).getTime() : anchor.time)
@@ -161,7 +228,7 @@ function pushSelectedDrawingLabels(
161
228
  timestamp,
162
229
  x: screenPoint.x + viewport.scrollLeft,
163
230
  style: {
164
- bgColor: selectedDrawing.style?.stroke ?? '#2962ff',
231
+ bgColor: strokeColor,
165
232
  textColor: '#ffffff',
166
233
  }
167
234
  })
@@ -169,6 +236,32 @@ function pushSelectedDrawingLabels(
169
236
  }
170
237
  }
171
238
 
239
+ /**
240
+ * 为选中的绘图推送锚点轴标签
241
+ * 提取为独立函数供主插件和 overlay 插件共用
242
+ */
243
+ function pushSelectedDrawingLabels(
244
+ store: DrawingStore,
245
+ definitions: DrawingDefinitionRegistry,
246
+ context: RenderContext,
247
+ pane: RenderContext['pane'],
248
+ seriesData: KLineData[],
249
+ range: RenderContext['range'],
250
+ kWidth: number,
251
+ kGap: number,
252
+ dpr: number,
253
+ viewport: SafeViewport,
254
+ startXPx: number,
255
+ unitPx: number
256
+ ): void {
257
+ const toScreen = createToScreen(kWidth, kGap, dpr, pane, viewport)
258
+ const found = findSelectedAnchorDrawing(store, definitions, pane, seriesData, range, context, kWidth, kGap, dpr, viewport, toScreen)
259
+ if (!found) return
260
+
261
+ pushAnchorBands(found.allAnchors, context, pane, found.drawing.style, startXPx, unitPx, dpr)
262
+ pushAnchorLabels(found.allAnchors, context, pane, viewport, kWidth, found.drawing.style, seriesData, startXPx, unitPx, dpr)
263
+ }
264
+
172
265
  /**
173
266
  * 创建绘图渲染器插件(主层,负责绘制 shape)
174
267
  * 注意:此插件不再推送轴标签,标签由 createDrawingLabelOverlayPlugin 负责
@@ -193,11 +286,7 @@ export function createDrawingRendererPlugin(options: {
193
286
  priority: 55,
194
287
  draw(context: RenderContext) {
195
288
  const { ctx, pane, data, range, dpr, paneWidth, kLinePositions, kLineCenters, kBarRects, kWidth, kGap } = context
196
- const viewport = context.viewport ?? {
197
- scrollLeft: context.scrollLeft,
198
- plotWidth: paneWidth,
199
- plotHeight: pane.height,
200
- }
289
+ const viewport = resolveViewport(context, pane.height)
201
290
  const seriesData = data as KLineData[]
202
291
  const visibleData = seriesData.slice(range.start, range.end)
203
292
  const drawings = store.getVisibleByPane(pane.id)
@@ -209,6 +298,7 @@ export function createDrawingRendererPlugin(options: {
209
298
  right: viewport.plotWidth,
210
299
  bottom: pane.height,
211
300
  }
301
+ const toScreen = createToScreen(kWidth, kGap, dpr, pane, viewport)
212
302
 
213
303
  ctx.save()
214
304
  ctx.beginPath()
@@ -229,14 +319,7 @@ export function createDrawingRendererPlugin(options: {
229
319
  dpr,
230
320
  paneWidth,
231
321
  viewport,
232
- toScreen(anchor) {
233
- const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, dpr)
234
- if (!Number.isFinite(anchor.index) || anchor.index < 0) {
235
- return { x: -kWidth, y: pane.yAxis.priceToY(anchor.price) }
236
- }
237
- const x = (startXPx + anchor.index * unitPx + (unitPx - 1) / 2) / dpr - viewport.scrollLeft
238
- return { x, y: pane.yAxis.priceToY(anchor.price) }
239
- },
322
+ toScreen,
240
323
  })
241
324
  if (!geometry) continue
242
325
 
@@ -245,22 +328,7 @@ export function createDrawingRendererPlugin(options: {
245
328
  ? geometry.primitives.map((p) => applySelectedStyle(p, drawing.style))
246
329
  : geometry.primitives
247
330
 
248
- // 绘制形状(不再推送轴标签,标签由 overlay 插件负责)
249
- for (const primitive of primitives) {
250
- if (primitive.kind === 'point') {
251
- renderers.point(ctx, primitive, dpr)
252
- continue
253
- }
254
- if (primitive.kind === 'line') {
255
- renderers.line(ctx, primitive, viewportClip, dpr)
256
- continue
257
- }
258
- if (primitive.kind === 'area') {
259
- renderers.area(ctx, primitive, dpr)
260
- continue
261
- }
262
- renderers.text(ctx, primitive, dpr)
263
- }
331
+ renderPrimitives(ctx, primitives, renderers, viewportClip, dpr)
264
332
  }
265
333
 
266
334
  ctx.restore()
@@ -297,15 +365,10 @@ export function createDrawingLabelOverlayPlugin(options: {
297
365
  priority: -24, // 比主绘图层稍晚,确保在其他 overlay 插件之后
298
366
  draw(context: RenderContext) {
299
367
  const { pane, data, range, dpr, paneWidth, kWidth, kGap } = context
300
- const viewport = context.viewport ?? {
301
- scrollLeft: context.scrollLeft,
302
- plotWidth: paneWidth,
303
- plotHeight: pane.height,
304
- }
368
+ const viewport = resolveViewport(context, pane.height)
305
369
  const seriesData = data as KLineData[]
306
370
  const { startXPx, unitPx } = getPhysicalKLineConfig(kWidth, kGap, dpr)
307
371
 
308
- // 推送选中绘图的锚点标签
309
372
  pushSelectedDrawingLabels(
310
373
  store,
311
374
  definitions,
@@ -6,16 +6,24 @@ import {
6
6
  calcENEData,
7
7
  calcRSIData,
8
8
  DEFAULT_MA_PERIODS,
9
+ } from '../calculators'
10
+ import {
9
11
  DEFAULT_BOLL_PERIOD,
10
12
  DEFAULT_BOLL_MULTIPLIER,
13
+ } from '../state/bollState'
14
+ import {
11
15
  DEFAULT_EXPMA_FAST_PERIOD,
12
16
  DEFAULT_EXPMA_SLOW_PERIOD,
17
+ } from '../state/expmaState'
18
+ import {
13
19
  DEFAULT_ENE_PERIOD,
14
20
  DEFAULT_ENE_DEVIATION,
21
+ } from '../state/eneState'
22
+ import {
15
23
  DEFAULT_RSI_PERIOD1,
16
24
  DEFAULT_RSI_PERIOD2,
17
25
  DEFAULT_RSI_PERIOD3,
18
- } from '../calculators'
26
+ } from '../state/rsiState'
19
27
  import type { KLineData } from '@/types/price'
20
28
 
21
29
  /**
@@ -1,7 +1,12 @@
1
- import { describe, expect, it, vi } from 'vitest'
1
+ import { describe, expect, it, vi, beforeEach } from 'vitest'
2
2
  import { IndicatorRegistry } from '../indicatorRegistry'
3
+ import { clearRegisteredIndicatorDefinitionsForTest } from '../indicatorDefinitionRegistry'
3
4
  import type { IndicatorMetadata } from '../indicatorMetadata'
4
5
 
6
+ beforeEach(() => {
7
+ clearRegisteredIndicatorDefinitionsForTest()
8
+ })
9
+
5
10
  function createMeta(overrides: Partial<IndicatorMetadata> = {}): IndicatorMetadata {
6
11
  return {
7
12
  name: 'rsi',
@@ -17,7 +22,7 @@ function createMeta(overrides: Partial<IndicatorMetadata> = {}): IndicatorMetada
17
22
 
18
23
  describe('IndicatorRegistry', () => {
19
24
  it('resolves indicators by name, displayName, aliases, and case-insensitive ids', () => {
20
- const registry = new IndicatorRegistry()
25
+ const registry = new IndicatorRegistry(false)
21
26
  const meta = createMeta()
22
27
 
23
28
  registry.register(meta)
@@ -30,7 +35,7 @@ describe('IndicatorRegistry', () => {
30
35
  })
31
36
 
32
37
  it('throws for missing required metadata fields', () => {
33
- const registry = new IndicatorRegistry()
38
+ const registry = new IndicatorRegistry(false)
34
39
 
35
40
  expect(() => registry.register(createMeta({ name: '' }))).toThrow('Indicator name is required')
36
41
  expect(() => registry.register(createMeta({ displayName: '' }))).toThrow("displayName is required")
@@ -38,7 +43,7 @@ describe('IndicatorRegistry', () => {
38
43
  })
39
44
 
40
45
  it('replaces old aliases when unregistering', () => {
41
- const registry = new IndicatorRegistry()
46
+ const registry = new IndicatorRegistry(false)
42
47
  const meta = createMeta()
43
48
 
44
49
  registry.register(meta)
@@ -51,7 +56,7 @@ describe('IndicatorRegistry', () => {
51
56
  })
52
57
 
53
58
  it('returns required metadata or throws a descriptive error', () => {
54
- const registry = new IndicatorRegistry()
59
+ const registry = new IndicatorRegistry(false)
55
60
  const meta = createMeta()
56
61
 
57
62
  registry.register(meta)
@@ -1,11 +1,11 @@
1
1
  import { describe, it, expect, vi, beforeEach, beforeAll } from 'vitest'
2
2
  import { IndicatorScheduler } from '../scheduler'
3
3
  import { getBuiltinIndicatorDefinitions, loadBuiltinIndicators } from '../registerBuiltins'
4
- import { MA_STATE_KEY, EMPTY_MA_STATE, type MARenderState } from '../maState'
5
- import { BOLL_STATE_KEY, EMPTY_BOLL_STATE, type BOLLRenderState } from '../bollState'
6
- import { EXPMA_STATE_KEY, EMPTY_EXPMA_STATE, type EXPMARenderState } from '../expmaState'
7
- import { ENE_STATE_KEY, EMPTY_ENE_STATE, type ENERenderState } from '../eneState'
8
- import { createRSIStateKey, EMPTY_RSI_STATE, type RSIRenderState } from '../rsiState'
4
+ import { MA_STATE_KEY, EMPTY_MA_STATE, type MARenderState } from '../state/maState'
5
+ import { BOLL_STATE_KEY, EMPTY_BOLL_STATE, type BOLLRenderState } from '../state/bollState'
6
+ import { EXPMA_STATE_KEY, EMPTY_EXPMA_STATE, type EXPMARenderState } from '../state/expmaState'
7
+ import { ENE_STATE_KEY, EMPTY_ENE_STATE, type ENERenderState } from '../state/eneState'
8
+ import { createRSIStateKey, EMPTY_RSI_STATE, type RSIRenderState } from '../state/rsiState'
9
9
  import type { IndicatorMetadata } from '../indicatorMetadata'
10
10
  import type { KLineData } from '@/types/price'
11
11
  import type { PluginHost } from '@/plugin'
@@ -131,7 +131,7 @@ describe('IndicatorScheduler', () => {
131
131
  let mockHost: PluginHost
132
132
 
133
133
  beforeEach(() => {
134
- scheduler = new IndicatorScheduler()
134
+ scheduler = new IndicatorScheduler(false)
135
135
  mockHost = createMockPluginHost()
136
136
  scheduler.setPluginHost(mockHost)
137
137
  registerTestIndicators(scheduler)
@@ -144,7 +144,7 @@ describe('IndicatorScheduler', () => {
144
144
  })
145
145
 
146
146
  it('should accept plugin host', () => {
147
- const newScheduler = new IndicatorScheduler()
147
+ const newScheduler = new IndicatorScheduler(false)
148
148
  newScheduler.setPluginHost(mockHost)
149
149
  // Should not throw
150
150
  expect(() => newScheduler.recompute()).not.toThrow()
@@ -426,7 +426,7 @@ describe('BOLL State in scheduler', () => {
426
426
  let mockHost: PluginHost
427
427
 
428
428
  beforeEach(() => {
429
- scheduler = new IndicatorScheduler()
429
+ scheduler = new IndicatorScheduler(false)
430
430
  mockHost = createMockPluginHost()
431
431
  scheduler.setPluginHost(mockHost)
432
432
  registerTestIndicators(scheduler)
@@ -509,7 +509,7 @@ describe('EXPMA State in scheduler', () => {
509
509
  let mockHost: PluginHost
510
510
 
511
511
  beforeEach(() => {
512
- scheduler = new IndicatorScheduler()
512
+ scheduler = new IndicatorScheduler(false)
513
513
  mockHost = createMockPluginHost()
514
514
  scheduler.setPluginHost(mockHost)
515
515
  registerTestIndicators(scheduler)
@@ -563,7 +563,7 @@ describe('ENE State in scheduler', () => {
563
563
  let mockHost: PluginHost
564
564
 
565
565
  beforeEach(() => {
566
- scheduler = new IndicatorScheduler()
566
+ scheduler = new IndicatorScheduler(false)
567
567
  mockHost = createMockPluginHost()
568
568
  scheduler.setPluginHost(mockHost)
569
569
  registerTestIndicators(scheduler)
@@ -620,7 +620,7 @@ describe('Per-indicator dirty flags', () => {
620
620
  let mockHost: PluginHost
621
621
 
622
622
  beforeEach(() => {
623
- scheduler = new IndicatorScheduler()
623
+ scheduler = new IndicatorScheduler(false)
624
624
  mockHost = createMockPluginHost()
625
625
  scheduler.setPluginHost(mockHost)
626
626
  registerTestIndicators(scheduler)
@@ -769,7 +769,7 @@ describe('RSI State in scheduler', () => {
769
769
  let mockHost: PluginHost
770
770
 
771
771
  beforeEach(() => {
772
- scheduler = new IndicatorScheduler()
772
+ scheduler = new IndicatorScheduler(false)
773
773
  mockHost = createMockPluginHost()
774
774
  scheduler.setPluginHost(mockHost)
775
775
  registerTestIndicators(scheduler)
@@ -9,30 +9,64 @@ import {
9
9
  } from '../soa'
10
10
  import {
11
11
  calcBOLLData,
12
- calcBOLLDataSoA,
13
12
  calcEXPMAData,
14
- calcEXPMADataSoA,
15
13
  calcENEData,
16
- calcENEDataSoA,
17
14
  calcMAData,
18
- calcMADataSoA,
19
15
  calcRSIData,
20
- calcRSIDataSoA,
21
16
  calcCCIData,
22
- calcCCIDataSoA,
23
17
  calcSTOCHData,
24
- calcSTOCHDataSoA,
25
18
  calcMOMData,
26
- calcMOMDataSoA,
27
19
  calcWMSRData,
28
- calcWMSRDataSoA,
29
20
  calcKSTData,
30
- calcKSTDataSoA,
31
21
  calcFASTKData,
32
- calcFASTKDataSoA,
33
22
  calcMACDData,
34
- calcMACDDataSoA,
35
23
  } from '../calculators'
24
+ import type {
25
+ BOLLPoint,
26
+ EXPMAPoint,
27
+ ENEPoint,
28
+ STOCHPoint,
29
+ KSTPoint,
30
+ MACDPoint,
31
+ } from '../calculators'
32
+
33
+ // SoA wrapper functions (test-only — convert SoA → AoS before computing)
34
+ function calcBOLLDataSoA(layout: KLineSoALayout, period: number, multiplier: number): BOLLPoint[] {
35
+ return calcBOLLData(SharedKLineBuffer.toKLineData(layout), period, multiplier)
36
+ }
37
+ function calcEXPMADataSoA(layout: KLineSoALayout, fastPeriod: number, slowPeriod: number): EXPMAPoint[] {
38
+ return calcEXPMAData(SharedKLineBuffer.toKLineData(layout), fastPeriod, slowPeriod)
39
+ }
40
+ function calcENEDataSoA(layout: KLineSoALayout, period: number, deviation: number): ENEPoint[] {
41
+ return calcENEData(SharedKLineBuffer.toKLineData(layout), period, deviation)
42
+ }
43
+ function calcMADataSoA(layout: KLineSoALayout, period: number): (number | undefined)[] {
44
+ return calcMAData(SharedKLineBuffer.toKLineData(layout), period)
45
+ }
46
+ function calcRSIDataSoA(layout: KLineSoALayout, period: number): (number | undefined)[] {
47
+ return calcRSIData(SharedKLineBuffer.toKLineData(layout), period)
48
+ }
49
+ function calcCCIDataSoA(layout: KLineSoALayout, period: number): (number | undefined)[] {
50
+ return calcCCIData(SharedKLineBuffer.toKLineData(layout), period)
51
+ }
52
+ function calcSTOCHDataSoA(layout: KLineSoALayout, n: number, m: number): STOCHPoint[] {
53
+ return calcSTOCHData(SharedKLineBuffer.toKLineData(layout), n, m)
54
+ }
55
+ function calcMOMDataSoA(layout: KLineSoALayout, period: number): (number | undefined)[] {
56
+ return calcMOMData(SharedKLineBuffer.toKLineData(layout), period)
57
+ }
58
+ function calcWMSRDataSoA(layout: KLineSoALayout, period: number): (number | undefined)[] {
59
+ return calcWMSRData(SharedKLineBuffer.toKLineData(layout), period)
60
+ }
61
+ function calcKSTDataSoA(layout: KLineSoALayout, roc1: number, roc2: number, roc3: number, roc4: number, signalPeriod: number): KSTPoint[] {
62
+ return calcKSTData(SharedKLineBuffer.toKLineData(layout), roc1, roc2, roc3, roc4, signalPeriod)
63
+ }
64
+ function calcFASTKDataSoA(layout: KLineSoALayout, period: number): (number | undefined)[] {
65
+ return calcFASTKData(SharedKLineBuffer.toKLineData(layout), period)
66
+ }
67
+ function calcMACDDataSoA(layout: KLineSoALayout, fastPeriod: number, slowPeriod: number, signalPeriod: number): MACDPoint[] {
68
+ return calcMACDData(SharedKLineBuffer.toKLineData(layout), fastPeriod, slowPeriod, signalPeriod)
69
+ }
36
70
 
37
71
  /**
38
72
  * 生成测试用的 K线数据
@@ -0,0 +1,44 @@
1
+ export function _computeEMASeries(values: (number | undefined)[], period: number): (number | undefined)[] {
2
+ const n = values.length
3
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
4
+ if (n === 0 || period <= 0) return result
5
+
6
+ const alpha = 2 / (period + 1)
7
+
8
+ let i = 0
9
+ while (i < n && values[i] === undefined) i++
10
+ if (i >= n) return result
11
+
12
+ let ema = values[i]!
13
+ result[i] = ema
14
+ for (let t = i + 1; t < n; t++) {
15
+ const v = values[t]
16
+ if (v === undefined) continue
17
+ ema = v * alpha + ema * (1 - alpha)
18
+ result[t] = ema
19
+ }
20
+ return result
21
+ }
22
+
23
+ export function _computeWMAOnNumbers(values: (number | undefined)[], period: number): (number | undefined)[] {
24
+ const n = values.length
25
+ const result: (number | undefined)[] = new Array(n).fill(undefined)
26
+ if (n === 0 || period <= 0 || n < period) return result
27
+
28
+ const denom = (period * (period + 1)) / 2
29
+
30
+ for (let t = period - 1; t < n; t++) {
31
+ let sw = 0
32
+ let valid = true
33
+ for (let k = 0; k < period; k++) {
34
+ const v = values[t - period + 1 + k]
35
+ if (v === undefined) {
36
+ valid = false
37
+ break
38
+ }
39
+ sw += (k + 1) * v
40
+ }
41
+ if (valid) result[t] = sw / denom
42
+ }
43
+ return result
44
+ }