minerva-design 1.4.0 → 1.6.0

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 (824) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +3072 -611
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1491 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +595 -5
  7. package/dist/charts/canvas.d.cts +4 -3
  8. package/dist/charts/canvas.d.ts +4 -3
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +42 -19
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.js +155 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +370 -255
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +34 -1
  34. package/dist/charts/engine/controller.d.ts +34 -1
  35. package/dist/charts/engine/controller.js +318 -273
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1708 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +339 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +76 -0
  82. package/dist/charts/engine/graph/force.d.ts +76 -0
  83. package/dist/charts/engine/graph/force.js +423 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +50 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +50 -0
  89. package/dist/charts/engine/graph/geometry.js +197 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +52 -0
  104. package/dist/charts/engine/graph/model.d.ts +52 -0
  105. package/dist/charts/engine/graph/model.js +108 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +640 -0
  120. package/dist/charts/engine/graph/types.d.ts +640 -0
  121. package/dist/charts/engine/graph/worker.cjs +52 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +135 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.d.cts +17 -0
  136. package/dist/charts/engine/labels.d.ts +17 -0
  137. package/dist/charts/engine/labels.js +28 -4
  138. package/dist/charts/engine/labels.js.map +1 -1
  139. package/dist/charts/engine/layout.cjs +1 -1
  140. package/dist/charts/engine/layout.cjs.map +1 -1
  141. package/dist/charts/engine/layout.d.cts +9 -0
  142. package/dist/charts/engine/layout.d.ts +9 -0
  143. package/dist/charts/engine/layout.js +11 -2
  144. package/dist/charts/engine/layout.js.map +1 -1
  145. package/dist/charts/engine/model.cjs +1 -1
  146. package/dist/charts/engine/model.cjs.map +1 -1
  147. package/dist/charts/engine/model.d.cts +73 -3
  148. package/dist/charts/engine/model.d.ts +73 -3
  149. package/dist/charts/engine/model.js +258 -154
  150. package/dist/charts/engine/model.js.map +1 -1
  151. package/dist/charts/engine/orderbook/field.cjs +37 -0
  152. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  153. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  154. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  155. package/dist/charts/engine/orderbook/field.js +297 -0
  156. package/dist/charts/engine/orderbook/field.js.map +1 -0
  157. package/dist/charts/engine/orderbook/format.cjs +1 -1
  158. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  159. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  160. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  161. package/dist/charts/engine/orderbook/format.js +5 -5
  162. package/dist/charts/engine/orderbook/format.js.map +1 -1
  163. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  164. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  165. package/dist/charts/engine/orderbook/heatmap.js +566 -475
  166. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  167. package/dist/charts/engine/orderbook/host.cjs +1 -1
  168. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  169. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  170. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  171. package/dist/charts/engine/orderbook/host.js +27 -5
  172. package/dist/charts/engine/orderbook/host.js.map +1 -1
  173. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  174. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  175. package/dist/charts/engine/orderbook/ladder.js +1 -1
  176. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  177. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  178. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  179. package/dist/charts/engine/orderbook/layout.d.cts +42 -0
  180. package/dist/charts/engine/orderbook/layout.d.ts +42 -0
  181. package/dist/charts/engine/orderbook/layout.js +76 -0
  182. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  183. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  184. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  185. package/dist/charts/engine/orderbook/tape.js +4 -4
  186. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  187. package/dist/charts/engine/orderbook/types.d.cts +27 -3
  188. package/dist/charts/engine/orderbook/types.d.ts +27 -3
  189. package/dist/charts/engine/overlay.cjs +1 -1
  190. package/dist/charts/engine/overlay.cjs.map +1 -1
  191. package/dist/charts/engine/overlay.d.cts +27 -0
  192. package/dist/charts/engine/overlay.d.ts +27 -0
  193. package/dist/charts/engine/overlay.js +34 -12
  194. package/dist/charts/engine/overlay.js.map +1 -1
  195. package/dist/charts/engine/presets.cjs +2 -2
  196. package/dist/charts/engine/presets.cjs.map +1 -1
  197. package/dist/charts/engine/presets.d.cts +35 -3
  198. package/dist/charts/engine/presets.d.ts +35 -3
  199. package/dist/charts/engine/presets.js +121 -101
  200. package/dist/charts/engine/presets.js.map +1 -1
  201. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  202. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  203. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  204. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  205. package/dist/charts/engine/renderers/detect.cjs +1 -1
  206. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  207. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  208. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  209. package/dist/charts/engine/renderers/detect.js +23 -21
  210. package/dist/charts/engine/renderers/detect.js.map +1 -1
  211. package/dist/charts/engine/renderers/follow.cjs +2 -0
  212. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  213. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  214. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  215. package/dist/charts/engine/renderers/follow.js +10 -0
  216. package/dist/charts/engine/renderers/follow.js.map +1 -0
  217. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  218. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  219. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  220. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  221. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  222. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  223. package/dist/charts/engine/renderers/gl.cjs +1 -1
  224. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  225. package/dist/charts/engine/renderers/gl.js +1 -1
  226. package/dist/charts/engine/renderers/gl.js.map +1 -1
  227. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  228. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  229. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  230. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  231. package/dist/charts/engine/renderers/shaders.js +9 -6
  232. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  233. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  234. package/dist/charts/engine/renderers/types.d.cts +2 -0
  235. package/dist/charts/engine/renderers/types.d.ts +2 -0
  236. package/dist/charts/engine/renderers/types.js.map +1 -1
  237. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  238. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  239. package/dist/charts/engine/renderers/webgl.js +85 -64
  240. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  241. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  242. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  243. package/dist/charts/engine/renderers/webgl2.js +72 -58
  244. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  245. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  246. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  247. package/dist/charts/engine/renderers/webgpu.js +1 -1
  248. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  249. package/dist/charts/engine/scene.cjs +1 -1
  250. package/dist/charts/engine/scene.cjs.map +1 -1
  251. package/dist/charts/engine/scene.d.cts +104 -4
  252. package/dist/charts/engine/scene.d.ts +104 -4
  253. package/dist/charts/engine/scene.js +412 -193
  254. package/dist/charts/engine/scene.js.map +1 -1
  255. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  256. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  257. package/dist/charts/engine/shapes/bullet.js +110 -110
  258. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  259. package/dist/charts/engine/shapes/chart.cjs +1 -1
  260. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  261. package/dist/charts/engine/shapes/chart.js +4 -1
  262. package/dist/charts/engine/shapes/chart.js.map +1 -1
  263. package/dist/charts/engine/shapes/chord.cjs +2 -0
  264. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  265. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  266. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  267. package/dist/charts/engine/shapes/chord.js +419 -0
  268. package/dist/charts/engine/shapes/chord.js.map +1 -0
  269. package/dist/charts/engine/shapes/draw.cjs +1 -1
  270. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  271. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  272. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  273. package/dist/charts/engine/shapes/draw.js +47 -17
  274. package/dist/charts/engine/shapes/draw.js.map +1 -1
  275. package/dist/charts/engine/shapes/hit.cjs +1 -1
  276. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  277. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  278. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  279. package/dist/charts/engine/shapes/hit.js +75 -46
  280. package/dist/charts/engine/shapes/hit.js.map +1 -1
  281. package/dist/charts/engine/shapes/index.d.cts +3 -2
  282. package/dist/charts/engine/shapes/index.d.ts +3 -2
  283. package/dist/charts/engine/shapes/labels.cjs +1 -1
  284. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  285. package/dist/charts/engine/shapes/labels.js +12 -4
  286. package/dist/charts/engine/shapes/labels.js.map +1 -1
  287. package/dist/charts/engine/shapes/layout.cjs +2 -2
  288. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  289. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  290. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  291. package/dist/charts/engine/shapes/layout.js +106 -78
  292. package/dist/charts/engine/shapes/layout.js.map +1 -1
  293. package/dist/charts/engine/shapes/scene.cjs +1 -1
  294. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  295. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  296. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  297. package/dist/charts/engine/shapes/scene.js +62 -19
  298. package/dist/charts/engine/shapes/scene.js.map +1 -1
  299. package/dist/charts/engine/shapes/types.d.cts +121 -8
  300. package/dist/charts/engine/shapes/types.d.ts +121 -8
  301. package/dist/charts/engine/signature.cjs +1 -1
  302. package/dist/charts/engine/signature.cjs.map +1 -1
  303. package/dist/charts/engine/signature.js +1 -1
  304. package/dist/charts/engine/signature.js.map +1 -1
  305. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  306. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  307. package/dist/charts/engine/three-d/canvas2d.d.cts +41 -3
  308. package/dist/charts/engine/three-d/canvas2d.d.ts +41 -3
  309. package/dist/charts/engine/three-d/canvas2d.js +166 -67
  310. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  311. package/dist/charts/engine/three-d/chart.cjs +1 -1
  312. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  313. package/dist/charts/engine/three-d/chart.js +219 -215
  314. package/dist/charts/engine/three-d/chart.js.map +1 -1
  315. package/dist/charts/engine/three-d/detect.cjs +1 -1
  316. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  317. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  318. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  319. package/dist/charts/engine/three-d/detect.js +22 -20
  320. package/dist/charts/engine/three-d/detect.js.map +1 -1
  321. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  322. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  323. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  324. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  325. package/dist/charts/engine/three-d/geometry.js +106 -90
  326. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  327. package/dist/charts/engine/three-d/model.cjs +1 -1
  328. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  329. package/dist/charts/engine/three-d/model.d.cts +2 -0
  330. package/dist/charts/engine/three-d/model.d.ts +2 -0
  331. package/dist/charts/engine/three-d/model.js +2 -0
  332. package/dist/charts/engine/three-d/model.js.map +1 -1
  333. package/dist/charts/engine/three-d/oit.cjs +109 -0
  334. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  335. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  336. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  337. package/dist/charts/engine/three-d/oit.js +111 -0
  338. package/dist/charts/engine/three-d/oit.js.map +1 -0
  339. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  340. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  341. package/dist/charts/engine/three-d/overlay.js +43 -36
  342. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  343. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  344. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  345. package/dist/charts/engine/three-d/render-types.d.cts +37 -3
  346. package/dist/charts/engine/three-d/render-types.d.ts +37 -3
  347. package/dist/charts/engine/three-d/render-types.js +6 -10
  348. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  349. package/dist/charts/engine/three-d/shaders.cjs +109 -48
  350. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  351. package/dist/charts/engine/three-d/shaders.d.cts +12 -5
  352. package/dist/charts/engine/three-d/shaders.d.ts +12 -5
  353. package/dist/charts/engine/three-d/shaders.js +118 -55
  354. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  355. package/dist/charts/engine/three-d/sort.cjs +1 -1
  356. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  357. package/dist/charts/engine/three-d/sort.d.cts +18 -5
  358. package/dist/charts/engine/three-d/sort.d.ts +18 -5
  359. package/dist/charts/engine/three-d/sort.js +129 -43
  360. package/dist/charts/engine/three-d/sort.js.map +1 -1
  361. package/dist/charts/engine/three-d/types.d.cts +36 -0
  362. package/dist/charts/engine/three-d/types.d.ts +36 -0
  363. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  364. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  365. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  366. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  367. package/dist/charts/engine/three-d/webgl.js +199 -74
  368. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  369. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  370. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  371. package/dist/charts/engine/three-d/webgpu.js +231 -94
  372. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  373. package/dist/charts/engine/trading/chart.cjs +1 -1
  374. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  375. package/dist/charts/engine/trading/chart.d.cts +10 -1
  376. package/dist/charts/engine/trading/chart.d.ts +10 -1
  377. package/dist/charts/engine/trading/chart.js +1677 -813
  378. package/dist/charts/engine/trading/chart.js.map +1 -1
  379. package/dist/charts/engine/trading/drawings.cjs +2 -1
  380. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  381. package/dist/charts/engine/trading/drawings.d.cts +53 -9
  382. package/dist/charts/engine/trading/drawings.d.ts +53 -9
  383. package/dist/charts/engine/trading/drawings.js +346 -71
  384. package/dist/charts/engine/trading/drawings.js.map +1 -1
  385. package/dist/charts/engine/trading/format.cjs +1 -1
  386. package/dist/charts/engine/trading/format.cjs.map +1 -1
  387. package/dist/charts/engine/trading/format.d.cts +19 -0
  388. package/dist/charts/engine/trading/format.d.ts +19 -0
  389. package/dist/charts/engine/trading/format.js +65 -21
  390. package/dist/charts/engine/trading/format.js.map +1 -1
  391. package/dist/charts/engine/trading/geometry.cjs +1 -1
  392. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  393. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  394. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  395. package/dist/charts/engine/trading/geometry.js +19 -4
  396. package/dist/charts/engine/trading/geometry.js.map +1 -1
  397. package/dist/charts/engine/trading/index.cjs +1 -1
  398. package/dist/charts/engine/trading/index.d.cts +2 -1
  399. package/dist/charts/engine/trading/index.d.ts +2 -1
  400. package/dist/charts/engine/trading/index.js +4 -3
  401. package/dist/charts/engine/trading/indicators.cjs +1 -1
  402. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  403. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  404. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  405. package/dist/charts/engine/trading/indicators.js +449 -173
  406. package/dist/charts/engine/trading/indicators.js.map +1 -1
  407. package/dist/charts/engine/trading/labels.cjs +1 -1
  408. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  409. package/dist/charts/engine/trading/labels.js +104 -4
  410. package/dist/charts/engine/trading/labels.js.map +1 -1
  411. package/dist/charts/engine/trading/store.cjs +1 -1
  412. package/dist/charts/engine/trading/store.cjs.map +1 -1
  413. package/dist/charts/engine/trading/store.d.cts +21 -0
  414. package/dist/charts/engine/trading/store.d.ts +21 -0
  415. package/dist/charts/engine/trading/store.js +22 -1
  416. package/dist/charts/engine/trading/store.js.map +1 -1
  417. package/dist/charts/engine/trading/studies.cjs +1 -1
  418. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  419. package/dist/charts/engine/trading/studies.d.cts +49 -8
  420. package/dist/charts/engine/trading/studies.d.ts +49 -8
  421. package/dist/charts/engine/trading/studies.js +352 -93
  422. package/dist/charts/engine/trading/studies.js.map +1 -1
  423. package/dist/charts/engine/trading/sync.cjs +2 -0
  424. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  425. package/dist/charts/engine/trading/sync.d.cts +8 -0
  426. package/dist/charts/engine/trading/sync.d.ts +8 -0
  427. package/dist/charts/engine/trading/sync.js +25 -0
  428. package/dist/charts/engine/trading/sync.js.map +1 -0
  429. package/dist/charts/engine/trading/types.d.cts +514 -16
  430. package/dist/charts/engine/trading/types.d.ts +514 -16
  431. package/dist/charts/engine/types.d.cts +106 -11
  432. package/dist/charts/engine/types.d.ts +106 -11
  433. package/dist/charts/index.cjs +1 -1
  434. package/dist/charts/index.d.cts +3 -2
  435. package/dist/charts/index.d.ts +3 -2
  436. package/dist/charts/index.js +30 -22
  437. package/dist/charts/react/charts.cjs +1 -1
  438. package/dist/charts/react/charts.cjs.map +1 -1
  439. package/dist/charts/react/charts.js +51 -34
  440. package/dist/charts/react/charts.js.map +1 -1
  441. package/dist/charts/react/graph.cjs +2 -0
  442. package/dist/charts/react/graph.cjs.map +1 -0
  443. package/dist/charts/react/graph.d.cts +219 -0
  444. package/dist/charts/react/graph.d.ts +219 -0
  445. package/dist/charts/react/graph.js +160 -0
  446. package/dist/charts/react/graph.js.map +1 -0
  447. package/dist/charts/react/orderbook.cjs +1 -1
  448. package/dist/charts/react/orderbook.cjs.map +1 -1
  449. package/dist/charts/react/orderbook.d.cts +3 -1
  450. package/dist/charts/react/orderbook.d.ts +3 -1
  451. package/dist/charts/react/orderbook.js +1 -0
  452. package/dist/charts/react/orderbook.js.map +1 -1
  453. package/dist/charts/react/shapes.cjs +1 -1
  454. package/dist/charts/react/shapes.cjs.map +1 -1
  455. package/dist/charts/react/shapes.d.cts +88 -4
  456. package/dist/charts/react/shapes.d.ts +88 -4
  457. package/dist/charts/react/shapes.js +55 -12
  458. package/dist/charts/react/shapes.js.map +1 -1
  459. package/dist/charts/react/three-d.cjs +1 -1
  460. package/dist/charts/react/three-d.cjs.map +1 -1
  461. package/dist/charts/react/three-d.d.cts +7 -0
  462. package/dist/charts/react/three-d.d.ts +7 -0
  463. package/dist/charts/react/three-d.js +14 -13
  464. package/dist/charts/react/three-d.js.map +1 -1
  465. package/dist/charts/react/trading.cjs +1 -1
  466. package/dist/charts/react/trading.cjs.map +1 -1
  467. package/dist/charts/react/trading.d.cts +54 -2
  468. package/dist/charts/react/trading.d.ts +54 -2
  469. package/dist/charts/react/trading.js +68 -37
  470. package/dist/charts/react/trading.js.map +1 -1
  471. package/dist/charts/react/types.d.cts +11 -0
  472. package/dist/charts/react/types.d.ts +11 -0
  473. package/dist/core/contracts.cjs +1 -1
  474. package/dist/core/contracts.cjs.map +1 -1
  475. package/dist/core/contracts.js +1 -1
  476. package/dist/core/contracts.js.map +1 -1
  477. package/dist/native/charts/src/canvas.cjs +1 -1
  478. package/dist/native/charts/src/canvas.js +5 -4
  479. package/dist/native/charts/src/engine/axis.cjs +1 -1
  480. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  481. package/dist/native/charts/src/engine/axis.js +42 -19
  482. package/dist/native/charts/src/engine/axis.js.map +1 -1
  483. package/dist/native/charts/src/engine/color.cjs +1 -1
  484. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  485. package/dist/native/charts/src/engine/color.js +47 -5
  486. package/dist/native/charts/src/engine/color.js.map +1 -1
  487. package/dist/native/charts/src/engine/controller.cjs +2 -2
  488. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  489. package/dist/native/charts/src/engine/controller.js +296 -251
  490. package/dist/native/charts/src/engine/controller.js.map +1 -1
  491. package/dist/native/charts/src/engine/data.cjs +1 -1
  492. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  493. package/dist/native/charts/src/engine/data.js +6 -4
  494. package/dist/native/charts/src/engine/data.js.map +1 -1
  495. package/dist/native/charts/src/engine/format.cjs +1 -1
  496. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  497. package/dist/native/charts/src/engine/format.js +15 -2
  498. package/dist/native/charts/src/engine/format.js.map +1 -1
  499. package/dist/native/charts/src/engine/labels.cjs +1 -1
  500. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  501. package/dist/native/charts/src/engine/labels.js +42 -5
  502. package/dist/native/charts/src/engine/labels.js.map +1 -1
  503. package/dist/native/charts/src/engine/layout.cjs +1 -1
  504. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  505. package/dist/native/charts/src/engine/layout.js +11 -2
  506. package/dist/native/charts/src/engine/layout.js.map +1 -1
  507. package/dist/native/charts/src/engine/model.cjs +1 -1
  508. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  509. package/dist/native/charts/src/engine/model.js +278 -174
  510. package/dist/native/charts/src/engine/model.js.map +1 -1
  511. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  512. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  513. package/dist/native/charts/src/engine/presets.cjs +2 -2
  514. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  515. package/dist/native/charts/src/engine/presets.js +110 -90
  516. package/dist/native/charts/src/engine/presets.js.map +1 -1
  517. package/dist/native/charts/src/engine/scene.cjs +1 -1
  518. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  519. package/dist/native/charts/src/engine/scene.js +421 -202
  520. package/dist/native/charts/src/engine/scene.js.map +1 -1
  521. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  522. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  523. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  524. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  525. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  526. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  527. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  528. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  529. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  530. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  531. package/dist/native/charts/src/engine/shapes/chord.js +419 -0
  532. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  533. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  534. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  535. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  536. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  537. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  538. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  539. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  540. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  541. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  542. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  543. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  544. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  545. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  546. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  547. package/dist/native/charts/src/engine/shapes/layout.js +136 -94
  548. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  549. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  550. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  551. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  552. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  553. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  554. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  555. package/dist/native/components/Chart/ChartBase.js +127 -115
  556. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  557. package/dist/native/components/Chart/charts.cjs +1 -1
  558. package/dist/native/components/Chart/charts.cjs.map +1 -1
  559. package/dist/native/components/Chart/charts.js +8 -5
  560. package/dist/native/components/Chart/charts.js.map +1 -1
  561. package/dist/native/components/Chart/scene.cjs +1 -1
  562. package/dist/native/components/Chart/scene.cjs.map +1 -1
  563. package/dist/native/components/Chart/scene.d.cts +6 -1
  564. package/dist/native/components/Chart/scene.d.ts +6 -1
  565. package/dist/native/components/Chart/scene.js +226 -108
  566. package/dist/native/components/Chart/scene.js.map +1 -1
  567. package/dist/native/components/Chart/types.d.cts +7 -1
  568. package/dist/native/components/Chart/types.d.ts +7 -1
  569. package/dist/native/components/Charts/charts.cjs +1 -1
  570. package/dist/native/components/Charts/charts.cjs.map +1 -1
  571. package/dist/native/components/Charts/charts.js +60 -43
  572. package/dist/native/components/Charts/charts.js.map +1 -1
  573. package/dist/native/components/Charts/types.d.cts +11 -0
  574. package/dist/native/components/Charts/types.d.ts +11 -0
  575. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  576. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  577. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  578. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  579. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -106
  580. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  581. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  582. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  583. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  584. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  585. package/dist/native/components/ShapeChart/charts.js +138 -96
  586. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  587. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  588. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  589. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  590. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  591. package/dist/native/components/ShapeChart/draw.js +26 -17
  592. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  593. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  594. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  595. package/dist/native/components/ShapeChart/geometry.js +233 -70
  596. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  597. package/dist/native/components/ShapeChart/index.cjs +1 -1
  598. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  599. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  600. package/dist/native/components/ShapeChart/index.js +2 -2
  601. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  602. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  603. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  604. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  605. package/dist/native/components/ShapeChart/recorder.js +19 -10
  606. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  607. package/dist/native/components/ShapeChart/types.d.cts +95 -8
  608. package/dist/native/components/ShapeChart/types.d.ts +95 -8
  609. package/dist/native/index.cjs +1 -1
  610. package/dist/native/index.js +2 -2
  611. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  612. package/dist/native/source/components/Chart/charts.tsx +10 -3
  613. package/dist/native/source/components/Chart/scene.tsx +243 -14
  614. package/dist/native/source/components/Chart/types.ts +7 -0
  615. package/dist/native/source/components/Charts/charts.tsx +37 -2
  616. package/dist/native/source/components/Charts/types.ts +11 -0
  617. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -34
  618. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  619. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  620. package/dist/native/source/components/ShapeChart/geometry.ts +376 -25
  621. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  622. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  623. package/dist/native/source/components/ShapeChart/types.ts +99 -6
  624. package/dist/native/source/manifest.ts +1 -0
  625. package/dist/taro/chart-a11y.d.ts +7 -0
  626. package/dist/taro/charts.d.ts +29 -6
  627. package/dist/taro/index.js +3129 -1902
  628. package/dist/taro/shape-charts.d.ts +99 -5
  629. package/dist/uni/AreaChart.vue +2 -1
  630. package/dist/uni/AreaChart.vue.d.ts +5 -1
  631. package/dist/uni/Badge.vue.d.ts +1 -1
  632. package/dist/uni/BarChart.vue +2 -1
  633. package/dist/uni/BarChart.vue.d.ts +5 -1
  634. package/dist/uni/BoxPlotChart.vue +2 -1
  635. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  636. package/dist/uni/BubbleChart.vue +2 -1
  637. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  638. package/dist/uni/BulletChart.vue.d.ts +4 -0
  639. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  640. package/dist/uni/CandlestickChart.vue +2 -1
  641. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  642. package/dist/uni/Chart.vue +2 -1
  643. package/dist/uni/Chart.vue.d.ts +4 -0
  644. package/dist/uni/ChordChart.vue +93 -0
  645. package/dist/uni/ChordChart.vue.d.ts +136 -0
  646. package/dist/uni/Divider.vue.d.ts +1 -1
  647. package/dist/uni/DonutChart.vue.d.ts +5 -1
  648. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  649. package/dist/uni/GanttChart.vue +2 -1
  650. package/dist/uni/GanttChart.vue.d.ts +15 -0
  651. package/dist/uni/GaugeChart.vue.d.ts +5 -1
  652. package/dist/uni/HeatmapChart.vue +2 -1
  653. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  654. package/dist/uni/HistogramChart.vue +2 -1
  655. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  656. package/dist/uni/HorizontalBarChart.vue +2 -1
  657. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  658. package/dist/uni/LineChart.vue +2 -1
  659. package/dist/uni/LineChart.vue.d.ts +4 -0
  660. package/dist/uni/MixedChart.vue +2 -1
  661. package/dist/uni/MixedChart.vue.d.ts +4 -0
  662. package/dist/uni/PieChart.vue.d.ts +5 -1
  663. package/dist/uni/QuadrantChart.vue +2 -1
  664. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  665. package/dist/uni/RadarChart.vue.d.ts +4 -0
  666. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  667. package/dist/uni/RangeAreaChart.vue +2 -1
  668. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  669. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  670. package/dist/uni/ScatterChart.vue +2 -1
  671. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  672. package/dist/uni/Sparkline.vue +2 -1
  673. package/dist/uni/Sparkline.vue.d.ts +4 -0
  674. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  675. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  676. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  677. package/dist/uni/WaterfallChart.vue +2 -1
  678. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  679. package/dist/uni/chart-a11y.d.ts +7 -0
  680. package/dist/uni/chart-a11y.js +29 -0
  681. package/dist/uni/chart-canvas.d.ts +12 -0
  682. package/dist/uni/chart-canvas.js +15 -1
  683. package/dist/uni/chart-types.d.ts +36 -5
  684. package/dist/uni/chart-types.js +31 -3
  685. package/dist/uni/charts-canvas.js +3 -2
  686. package/dist/uni/index.d.ts +2 -1
  687. package/dist/uni/index.js +1 -0
  688. package/dist/uni/manifest.d.ts +7 -0
  689. package/dist/uni/manifest.js +10 -0
  690. package/dist/uni/named-chart-options.d.ts +11 -2
  691. package/dist/uni/named-chart-options.js +21 -1
  692. package/dist/uni/shape-chart-canvas.d.ts +3 -3
  693. package/dist/uni/shape-chart-canvas.js +17 -58
  694. package/dist/uni/shape-chart-types.d.ts +53 -3
  695. package/dist/uni/shape-chart-types.js +45 -1
  696. package/dist/vue/charts-global.d.ts +48 -0
  697. package/dist/vue/charts.d.ts +18 -0
  698. package/dist/vue/charts.js +56 -0
  699. package/dist/vue/charts.js.map +1 -0
  700. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  701. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  702. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  703. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  704. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  705. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  706. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  707. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  708. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  709. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  710. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +181 -0
  711. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  712. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  713. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  714. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  715. package/dist/vue/components/Chart/GanttChart.vue.d.ts +19 -0
  716. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  717. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +12 -1
  718. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  719. package/dist/vue/components/Chart/GraphChart.vue.d.ts +186 -0
  720. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  721. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  722. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  723. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  724. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  725. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  726. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  727. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  728. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  729. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  730. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  731. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  732. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  733. package/dist/vue/components/Chart/TradingChart.vue.d.ts +58 -1
  734. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  735. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  736. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  737. package/dist/vue/components/Chart/TreeChart.vue.d.ts +174 -0
  738. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  739. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  740. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  741. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  742. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  743. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  744. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  745. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  746. package/dist/vue/components/Chart/graph.d.ts +156 -0
  747. package/dist/vue/components/Chart/graph.js +137 -0
  748. package/dist/vue/components/Chart/graph.js.map +1 -0
  749. package/dist/vue/components/Chart/index.d.ts +5 -1
  750. package/dist/vue/components/Chart/index.js +5 -1
  751. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  752. package/dist/vue/components/Chart/orderbook.js +2 -0
  753. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  754. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  755. package/dist/vue/components/Chart/three-d.js +2 -0
  756. package/dist/vue/components/Chart/three-d.js.map +1 -1
  757. package/dist/vue/components/Chart/trading.d.ts +30 -3
  758. package/dist/vue/components/Chart/trading.js +9 -0
  759. package/dist/vue/components/Chart/trading.js.map +1 -1
  760. package/dist/vue/components/Chart/types.d.ts +74 -2
  761. package/dist/vue/global.d.ts +2 -38
  762. package/dist/vue/groups/charts.js +10 -2
  763. package/dist/vue/groups/charts.js.map +1 -1
  764. package/dist/vue/index.js +6 -2
  765. package/dist/vue/internal/register.d.ts +7 -0
  766. package/dist/vue/internal/register.js +14 -0
  767. package/dist/vue/internal/register.js.map +1 -0
  768. package/dist/vue/plugin.d.ts +9 -4
  769. package/dist/vue/plugin.js +6 -11
  770. package/dist/vue/plugin.js.map +1 -1
  771. package/dist/weapp/area-chart/index.wxml +1 -1
  772. package/dist/weapp/bar-chart/index.wxml +1 -1
  773. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  774. package/dist/weapp/bubble-chart/index.wxml +1 -1
  775. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  776. package/dist/weapp/chart/index.wxml +1 -1
  777. package/dist/weapp/charts/canvas.js +1987 -175
  778. package/dist/weapp/charts/core.js +3 -0
  779. package/dist/weapp/chord-chart/index.js +1 -0
  780. package/dist/weapp/chord-chart/index.json +1 -0
  781. package/dist/weapp/chord-chart/index.wxml +1 -0
  782. package/dist/weapp/chord-chart/index.wxss +1 -0
  783. package/dist/weapp/controls.js +148 -57
  784. package/dist/weapp/gantt-chart/index.wxml +1 -1
  785. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  786. package/dist/weapp/histogram-chart/index.wxml +1 -1
  787. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  788. package/dist/weapp/line-chart/index.wxml +1 -1
  789. package/dist/weapp/mixed-chart/index.wxml +1 -1
  790. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  791. package/dist/weapp/range-area-chart/index.wxml +1 -1
  792. package/dist/weapp/scatter-chart/index.wxml +1 -1
  793. package/dist/weapp/sparkline/index.wxml +1 -1
  794. package/dist/weapp/types.d.ts +96 -4
  795. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  796. package/dist/web-components/components/chart/charts.d.ts +4 -2
  797. package/dist/web-components/components/chart/charts.js +8 -1
  798. package/dist/web-components/components/chart/charts.js.map +1 -1
  799. package/dist/web-components/components/chart/extended.d.ts +21 -7
  800. package/dist/web-components/components/chart/extended.js +29 -9
  801. package/dist/web-components/components/chart/extended.js.map +1 -1
  802. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  803. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  804. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  805. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  806. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  807. package/dist/web-components/components/graph/graph.d.ts +156 -0
  808. package/dist/web-components/components/graph/graph.js +150 -0
  809. package/dist/web-components/components/graph/graph.js.map +1 -0
  810. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  811. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  812. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  813. package/dist/web-components/elements/chart.d.ts +1 -1
  814. package/dist/web-components/elements/chart.js +6 -5
  815. package/dist/web-components/elements/chart.js.map +1 -1
  816. package/dist/web-components/elements/graph.d.ts +2 -0
  817. package/dist/web-components/elements/graph.js +12 -0
  818. package/dist/web-components/elements/graph.js.map +1 -0
  819. package/dist/web-components/html-custom-data.json +318 -4
  820. package/dist/web-components/types/react.d.ts +63 -4
  821. package/dist/web-components/types/solid.d.ts +55 -8
  822. package/dist/web-components/types/svelte.d.ts +55 -8
  823. package/dist/web-components/types/vue.d.ts +55 -4
  824. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"indicators.js","names":["finite","nanArray","n","periodOf","period","smaInto","p","sum","valid","j","from","v","src","i","old","windowMean","k","smoothInto","prev","out","alpha","emaInto","rmaInto","wmaInto","denominator","direct","num","stdevInto","mean","sq","d","rsiInto","change","close","gain","loss","g","l","ok","c","trueRangeInto","range","high","low","pc","kdjInto","m1","kPeriod","m2","dPeriod","hh","ll","q","rsv","pk","pd","DAY","sessionKey","reset","t","time","utcOffset","day","date","vwapInto","tp","volume","same","basePv","pv","baseV","vol","heikinAshiInto","open","prevOpen","prevClose","o","sma","values","ema","wma","bollinger","middle","upper","lower","dev","multiplier","macd","f","s","fast","slow","line","sig","signal","histogram","rsi","kdj","atr","tr","vwap","options","heikinAshi","bars","UNIT_MS","parseTimeframe","timeframe","match","count","unit","bucketStart","shift","tf","months","start","monday","isColumns","resampleBars","columns","get","current","bar","m","result"],"sources":["../../../../../charts/src/engine/trading/indicators.ts"],"sourcesContent":["// Technical indicators on columns of numbers (Float64Array out, NaN while\n// an indicator warms up). Every kernel computes the outputs from index\n// `from` on, assuming the outputs before it are up to date: the chart\n// recomputes only the last bar on each tick, even with a million bars.\n\nimport type {\n TradingBar,\n TradingBarColumns,\n TradingBarsInput,\n TradingTimeframe,\n} from \"./types\";\n\ntype Values = ArrayLike<number>;\n\nconst finite = Number.isFinite;\n\n/** Output array of `n` values, NaN-filled */\nconst nanArray = (n: number) => new Float64Array(n).fill(NaN);\n\nconst periodOf = (period: number) => Math.max(1, Math.floor(period) || 1);\n\n// ---------------------------------------------------------------- kernels\n\n/** Simple moving average of `src[0..n)` into `out`, from index `from` */\nexport const smaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n let sum = 0;\n let valid = 0;\n // the window ending just before `from` (the loop below drops its oldest value)\n for (let j = Math.max(0, from - p); j < from; j++) {\n const v = src[j];\n if (finite(v)) {\n sum += v;\n valid++;\n }\n }\n for (let i = from; i < n; i++) {\n const v = src[i];\n if (finite(v)) {\n sum += v;\n valid++;\n }\n if (i >= p) {\n const old = src[i - p];\n if (finite(old)) {\n sum -= old;\n valid--;\n }\n }\n out[i] = valid === p ? sum / p : NaN;\n }\n};\n\n/** Mean of `src[i-p+1..i]`, NaN unless the window is complete */\nconst windowMean = (src: Values, i: number, p: number) => {\n if (i < p - 1) return NaN;\n let sum = 0;\n for (let k = i - p + 1; k <= i; k++) {\n const v = src[k];\n if (!finite(v)) return NaN;\n sum += v;\n }\n return sum / p;\n};\n\n/**\n * Exponential smoothing with factor `alpha`, seeded with the simple\n * average of the first complete window (the TradingView convention)\n */\nconst smoothInto = (\n src: Values,\n n: number,\n p: number,\n alpha: number,\n out: Float64Array,\n from: number,\n) => {\n for (let i = from; i < n; i++) {\n const v = src[i];\n const prev = i > 0 ? out[i - 1] : NaN;\n if (!finite(v)) out[i] = NaN;\n else if (finite(prev)) out[i] = prev + alpha * (v - prev);\n else out[i] = windowMean(src, i, p);\n }\n};\n\n/** Exponential moving average (alpha = 2 / (period + 1)) */\nexport const emaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n smoothInto(src, n, p, 2 / (p + 1), out, from);\n};\n\n/** Wilder's moving average (alpha = 1 / period), used by RSI and ATR */\nexport const rmaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n smoothInto(src, n, p, 1 / p, out, from);\n};\n\n/** Linearly weighted moving average (the newest bar weighs `period`) */\nexport const wmaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n const denominator = (p * (p + 1)) / 2;\n const direct = (i: number) => {\n if (i < p - 1) return NaN;\n let num = 0;\n for (let k = 0; k < p; k++) {\n const v = src[i - k];\n if (!finite(v)) return NaN;\n num += (p - k) * v;\n }\n return num;\n };\n // numerator of the previous index and the sum of its window\n let num = from > 0 ? direct(from - 1) : NaN;\n let sum = from > 0 ? windowMean(src, from - 1, p) * p : NaN;\n for (let i = from; i < n; i++) {\n const v = src[i];\n if (finite(num) && finite(sum) && finite(v)) {\n num = num - sum + p * v;\n sum = sum + v - (i >= p ? src[i - p] : 0);\n } else {\n num = direct(i);\n sum = windowMean(src, i, p) * p;\n }\n out[i] = finite(num) ? num / denominator : NaN;\n }\n};\n\n/** Population standard deviation over the window (two passes: exact) */\nexport const stdevInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n for (let i = from; i < n; i++) {\n const mean = windowMean(src, i, p);\n if (!finite(mean)) {\n out[i] = NaN;\n continue;\n }\n let sq = 0;\n for (let k = i - p + 1; k <= i; k++) {\n const d = src[k] - mean;\n sq += d * d;\n }\n out[i] = Math.sqrt(sq / p);\n }\n};\n\n/** Highest value of the window ending at each index */\nconst extremeInto = (\n src: Values,\n n: number,\n p: number,\n out: Float64Array,\n from: number,\n highest: boolean,\n) => {\n for (let i = from; i < n; i++) {\n if (i < p - 1) {\n out[i] = NaN;\n continue;\n }\n let m = highest ? -Infinity : Infinity;\n for (let k = i - p + 1; k <= i; k++) {\n const v = src[k];\n if (!finite(v)) {\n m = NaN;\n break;\n }\n if (highest ? v > m : v < m) m = v;\n }\n out[i] = m;\n }\n};\n\n/** RSI with Wilder smoothing; `gain` / `loss` hold the running averages */\nexport const rsiInto = (\n close: Values,\n n: number,\n period: number,\n out: Float64Array,\n gain: Float64Array,\n loss: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n for (let i = from; i < n; i++) {\n gain[i] = loss[i] = NaN;\n out[i] = NaN;\n if (i === 0) continue;\n const change = close[i] - close[i - 1];\n if (!finite(change)) continue;\n if (finite(gain[i - 1]) && finite(loss[i - 1])) {\n gain[i] = (gain[i - 1] * (p - 1) + Math.max(change, 0)) / p;\n loss[i] = (loss[i - 1] * (p - 1) + Math.max(-change, 0)) / p;\n } else if (i >= p) {\n let g = 0;\n let l = 0;\n let ok = true;\n for (let k = i - p + 1; k <= i; k++) {\n const c = close[k] - close[k - 1];\n if (!finite(c)) {\n ok = false;\n break;\n }\n if (c > 0) g += c;\n else l -= c;\n }\n if (!ok) continue;\n gain[i] = g / p;\n loss[i] = l / p;\n } else {\n continue;\n }\n out[i] =\n loss[i] === 0\n ? gain[i] === 0\n ? 50\n : 100\n : 100 - 100 / (1 + gain[i] / loss[i]);\n }\n};\n\n/** True range of each bar */\nexport const trueRangeInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n out: Float64Array,\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n const range = high[i] - low[i];\n if (i === 0 || !finite(close[i - 1])) {\n out[i] = range;\n continue;\n }\n const pc = close[i - 1];\n out[i] = Math.max(range, Math.abs(high[i] - pc), Math.abs(low[i] - pc));\n }\n};\n\n/** KDJ: K and D smoothed from the raw stochastic value (seeded at 50), J = 3K − 2D */\nexport const kdjInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n period: number,\n kPeriod: number,\n dPeriod: number,\n k: Float64Array,\n d: Float64Array,\n j: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n const m1 = periodOf(kPeriod);\n const m2 = periodOf(dPeriod);\n for (let i = from; i < n; i++) {\n k[i] = d[i] = j[i] = NaN;\n if (i < p - 1) continue;\n let hh = -Infinity;\n let ll = Infinity;\n for (let q = i - p + 1; q <= i; q++) {\n if (high[q] > hh) hh = high[q];\n if (low[q] < ll) ll = low[q];\n }\n const c = close[i];\n if (!finite(hh) || !finite(ll) || !finite(c)) continue;\n const rsv = hh === ll ? 50 : ((c - ll) / (hh - ll)) * 100;\n const pk = i > 0 && finite(k[i - 1]) ? k[i - 1] : 50;\n const pd = i > 0 && finite(d[i - 1]) ? d[i - 1] : 50;\n k[i] = ((m1 - 1) * pk + rsv) / m1;\n d[i] = ((m2 - 1) * pd + k[i]) / m2;\n j[i] = 3 * k[i] - 2 * d[i];\n }\n};\n\nconst DAY = 86_400_000;\n\n/** Session key of a time: bars with the same key are in the same VWAP period */\nexport const sessionKey = (\n time: number,\n reset: \"day\" | \"week\" | \"month\" | \"none\",\n utcOffset = 0,\n): number => {\n if (reset === \"none\") return 0;\n const t = time + utcOffset * 60_000;\n const day = Math.floor(t / DAY);\n if (reset === \"day\") return day;\n // 1970-01-01 is a Thursday: weeks start on Monday\n if (reset === \"week\") return Math.floor((day + 3) / 7);\n const date = new Date(t);\n return date.getUTCFullYear() * 12 + date.getUTCMonth();\n};\n\n/** VWAP; `pv` / `vol` hold the cumulative sums of the period */\nexport const vwapInto = (\n high: Values,\n low: Values,\n close: Values,\n volume: Values,\n time: Values | null,\n n: number,\n reset: \"day\" | \"week\" | \"month\" | \"none\",\n utcOffset: number,\n out: Float64Array,\n pv: Float64Array,\n vol: Float64Array,\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n const tp = (high[i] + low[i] + close[i]) / 3;\n const v = finite(volume[i]) ? volume[i] : 0;\n const same =\n i > 0 &&\n (!time ||\n sessionKey(time[i], reset, utcOffset) ===\n sessionKey(time[i - 1], reset, utcOffset));\n const basePv = same && finite(pv[i - 1]) ? pv[i - 1] : 0;\n const baseV = same && finite(vol[i - 1]) ? vol[i - 1] : 0;\n pv[i] = basePv + (finite(tp) ? tp * v : 0);\n vol[i] = baseV + v;\n out[i] = vol[i] > 0 ? pv[i] / vol[i] : finite(tp) ? tp : NaN;\n }\n};\n\n/** Heikin-Ashi bars from regular bars */\nexport const heikinAshiInto = (\n open: Values,\n high: Values,\n low: Values,\n close: Values,\n n: number,\n out: {\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n },\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n const c = (open[i] + high[i] + low[i] + close[i]) / 4;\n const prevOpen = i > 0 ? out.open[i - 1] : NaN;\n const prevClose = i > 0 ? out.close[i - 1] : NaN;\n const o =\n finite(prevOpen) && finite(prevClose)\n ? (prevOpen + prevClose) / 2\n : (open[i] + close[i]) / 2;\n out.open[i] = o;\n out.close[i] = c;\n out.high[i] = Math.max(high[i], o, c);\n out.low[i] = Math.min(low[i], o, c);\n }\n};\n\n// ------------------------------------------------------- public functions\n\n/**\n * Simple moving average: the mean of the last `period` values (NaN until\n * `period` values are available)\n */\nexport const sma = (values: Values, period: number): Float64Array => {\n const out = nanArray(values.length);\n smaInto(values, values.length, period, out);\n return out;\n};\n\n/** Exponential moving average, seeded with the simple average of the first `period` values */\nexport const ema = (values: Values, period: number): Float64Array => {\n const out = nanArray(values.length);\n emaInto(values, values.length, period, out);\n return out;\n};\n\n/** Linearly weighted moving average: the newest value weighs `period`, the oldest 1 */\nexport const wma = (values: Values, period: number): Float64Array => {\n const out = nanArray(values.length);\n wmaInto(values, values.length, period, out);\n return out;\n};\n\n/** Bollinger bands: simple average ± `multiplier` population standard deviations */\nexport const bollinger = (\n values: Values,\n period = 20,\n multiplier = 2,\n): { middle: Float64Array; upper: Float64Array; lower: Float64Array } => {\n const n = values.length;\n const middle = nanArray(n);\n const upper = nanArray(n);\n const lower = nanArray(n);\n const dev = nanArray(n);\n smaInto(values, n, period, middle);\n stdevInto(values, n, period, dev);\n for (let i = 0; i < n; i++) {\n upper[i] = middle[i] + multiplier * dev[i];\n lower[i] = middle[i] - multiplier * dev[i];\n }\n return { middle, upper, lower };\n};\n\n/** MACD line (fast EMA − slow EMA), its signal EMA and their difference */\nexport const macd = (\n values: Values,\n fast = 12,\n slow = 26,\n signal = 9,\n): { macd: Float64Array; signal: Float64Array; histogram: Float64Array } => {\n const n = values.length;\n const f = nanArray(n);\n const s = nanArray(n);\n emaInto(values, n, fast, f);\n emaInto(values, n, slow, s);\n const line = nanArray(n);\n for (let i = 0; i < n; i++) line[i] = f[i] - s[i];\n const sig = nanArray(n);\n emaInto(line, n, signal, sig);\n const histogram = nanArray(n);\n for (let i = 0; i < n; i++) histogram[i] = line[i] - sig[i];\n return { macd: line, signal: sig, histogram };\n};\n\n/** Relative strength index (0-100) with Wilder smoothing */\nexport const rsi = (values: Values, period = 14): Float64Array => {\n const n = values.length;\n const out = nanArray(n);\n rsiInto(values, n, period, out, nanArray(n), nanArray(n));\n return out;\n};\n\n/** KDJ stochastic: K and D smoothed (seeded at 50), J = 3K − 2D */\nexport const kdj = (\n high: Values,\n low: Values,\n close: Values,\n period = 9,\n kPeriod = 3,\n dPeriod = 3,\n): { k: Float64Array; d: Float64Array; j: Float64Array } => {\n const n = close.length;\n const k = nanArray(n);\n const d = nanArray(n);\n const j = nanArray(n);\n kdjInto(high, low, close, n, period, kPeriod, dPeriod, k, d, j);\n return { k, d, j };\n};\n\n/** Average true range with Wilder smoothing */\nexport const atr = (\n high: Values,\n low: Values,\n close: Values,\n period = 14,\n): Float64Array => {\n const n = close.length;\n const tr = nanArray(n);\n trueRangeInto(high, low, close, n, tr);\n const out = nanArray(n);\n rmaInto(tr, n, period, out);\n return out;\n};\n\n/**\n * Volume-weighted average of the typical price (high + low + close) / 3,\n * restarting each `reset` period (UTC, or shifted by `utcOffset` minutes);\n * without `time`, a single cumulative average\n */\nexport const vwap = (\n high: Values,\n low: Values,\n close: Values,\n volume: Values,\n options: {\n time?: Values;\n reset?: \"day\" | \"week\" | \"month\" | \"none\";\n utcOffset?: number;\n } = {},\n): Float64Array => {\n const n = close.length;\n const out = nanArray(n);\n vwapInto(\n high,\n low,\n close,\n volume,\n options.time ?? null,\n n,\n options.reset ?? \"day\",\n options.utcOffset ?? 0,\n out,\n nanArray(n),\n nanArray(n),\n );\n return out;\n};\n\n/** Heikin-Ashi bars: averaged bars that smooth out the noise of trends */\nexport const heikinAshi = (bars: {\n open: Values;\n high: Values;\n low: Values;\n close: Values;\n}): {\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n} => {\n const n = bars.close.length;\n const out = {\n open: nanArray(n),\n high: nanArray(n),\n low: nanArray(n),\n close: nanArray(n),\n };\n heikinAshiInto(bars.open, bars.high, bars.low, bars.close, n, out);\n return out;\n};\n\n// -------------------------------------------------------------- timeframes\n\n/** A parsed timeframe: a count of a unit, with its approximate duration */\nexport interface ParsedTimeframe {\n unit: \"ms\" | \"month\";\n count: number;\n /** Approximate duration in ms (30 days per month) */\n ms: number;\n}\n\nconst UNIT_MS: Record<string, number> = {\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n H: 3_600_000,\n d: DAY,\n D: DAY,\n w: 7 * DAY,\n W: 7 * DAY,\n};\n\n/** `\"15m\"` -> 15 minutes, `\"1M\"` -> 1 month; `null` when invalid */\nexport const parseTimeframe = (\n timeframe: TradingTimeframe,\n): ParsedTimeframe | null => {\n if (typeof timeframe === \"number\") {\n return timeframe > 0\n ? { unit: \"ms\", count: timeframe, ms: timeframe }\n : null;\n }\n const match = /^(\\d+(?:\\.\\d+)?)([smhHdDwWM])$/.exec(timeframe.trim());\n if (!match) return null;\n const count = Number(match[1]);\n if (!(count > 0)) return null;\n const unit = match[2];\n if (unit === \"M\") return { unit: \"month\", count, ms: count * 30 * DAY };\n return {\n unit: \"ms\",\n count: count * UNIT_MS[unit],\n ms: count * UNIT_MS[unit],\n };\n};\n\n/** Start of the bucket of `time` (weeks start on Monday, months on the 1st) */\nexport const bucketStart = (\n time: number,\n tf: ParsedTimeframe,\n utcOffset = 0,\n): number => {\n const shift = utcOffset * 60_000;\n const t = time + shift;\n if (tf.unit === \"month\") {\n const date = new Date(t);\n const months = date.getUTCFullYear() * 12 + date.getUTCMonth();\n const start = months - (months % tf.count);\n return Date.UTC(Math.floor(start / 12), start % 12, 1) - shift;\n }\n if (tf.count % (7 * DAY) === 0) {\n // Monday-aligned weeks (the epoch is a Thursday)\n const monday = 4 * DAY;\n return Math.floor((t - monday) / tf.count) * tf.count + monday - shift;\n }\n return Math.floor(t / tf.count) * tf.count - shift;\n};\n\nconst isColumns = (bars: TradingBarsInput): bars is TradingBarColumns =>\n !Array.isArray(bars);\n\n/**\n * Aggregates bars into a longer timeframe (`\"5m\"` bars into `\"1H\"`, ...):\n * first open, highest high, lowest low, last close, summed volume. Buckets\n * are aligned on UTC (or shifted by `utcOffset` minutes); weeks start on\n * Monday. Columns in, columns out (Float64Array).\n */\nexport function resampleBars(\n bars: readonly TradingBar[],\n timeframe: TradingTimeframe,\n utcOffset?: number,\n): TradingBar[];\nexport function resampleBars(\n bars: TradingBarColumns,\n timeframe: TradingTimeframe,\n utcOffset?: number,\n): TradingBarColumns;\nexport function resampleBars(\n bars: TradingBarsInput,\n timeframe: TradingTimeframe,\n utcOffset = 0,\n): TradingBar[] | TradingBarColumns {\n const tf = parseTimeframe(timeframe);\n if (!tf) throw new Error(`Invalid timeframe: ${String(timeframe)}`);\n const columns = isColumns(bars);\n const n = columns ? bars.close.length : bars.length;\n const get = (i: number): TradingBar => {\n if (!columns) return (bars as readonly TradingBar[])[i];\n const c = bars as TradingBarColumns;\n return {\n time: c.time[i],\n open: c.open[i],\n high: c.high[i],\n low: c.low[i],\n close: c.close[i],\n volume: c.volume ? c.volume[i] : undefined,\n };\n };\n const out: TradingBar[] = [];\n let current: TradingBar | null = null;\n for (let i = 0; i < n; i++) {\n const bar = get(i);\n const start = bucketStart(bar.time, tf, utcOffset);\n if (!current || start !== current.time) {\n if (current) out.push(current);\n current = {\n time: start,\n open: bar.open,\n high: bar.high,\n low: bar.low,\n close: bar.close,\n volume: bar.volume ?? 0,\n };\n } else {\n if (bar.high > current.high) current.high = bar.high;\n if (bar.low < current.low) current.low = bar.low;\n current.close = bar.close;\n current.volume = (current.volume ?? 0) + (bar.volume ?? 0);\n }\n }\n if (current) out.push(current);\n if (!columns) return out;\n const m = out.length;\n const result = {\n time: new Float64Array(m),\n open: new Float64Array(m),\n high: new Float64Array(m),\n low: new Float64Array(m),\n close: new Float64Array(m),\n volume: new Float64Array(m),\n };\n out.forEach((bar, i) => {\n result.time[i] = bar.time;\n result.open[i] = bar.open;\n result.high[i] = bar.high;\n result.low[i] = bar.low;\n result.close[i] = bar.close;\n result.volume[i] = bar.volume ?? 0;\n });\n return result;\n}\n\n/** Highest / lowest of a window: exported for the KDJ-like studies of the chart */\nexport const highestInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => extremeInto(src, n, periodOf(period), out, from, true);\n\nexport const lowestInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => extremeInto(src, n, periodOf(period), out, from, false);\n"],"mappings":"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"}
1
+ {"version":3,"file":"indicators.js","names":["finite","nanArray","n","periodOf","period","smaInto","p","sum","valid","j","from","v","src","i","old","windowMean","k","smoothInto","prev","out","alpha","emaInto","rmaInto","wmaInto","denominator","direct","num","stdevInto","mean","sq","d","extremeInto","queue","head","tail","lastNaN","better","highest","a","b","push","rsiInto","change","close","gain","loss","g","l","ok","c","trueRangeInto","range","high","low","pc","kdjInto","m1","kPeriod","m2","dPeriod","hh","ll","q","rsv","pk","pd","DAY","sessionKey","reset","t","time","offsetOf","utcOffset","day","date","vwapInto","tp","volume","same","basePv","pv","baseV","vol","heikinAshiInto","open","prevOpen","prevClose","o","obvInto","typicalInto","cciInto","typical","m","deviation","williamsRInto","lowest","mfiInto","positive","negative","flow","stochRsiInto","stochPeriod","rsiPeriod","work","dmiInto","up","down","tr","plus","minus","adxPeriod","adx","psarInto","trend","start","prevEp","ep","prevAf","af","sar","before","increment","maximum","supertrendInto","mid","multiplier","pu","upper","pl","lower","direction","midpointInto","ichimokuInto","conversionPeriod","conversion","basePeriod","base","spanBPeriod","spanB","donchianInto","keltnerInto","middle","atrPeriod","sma","values","ema","wma","bollinger","dev","macd","f","fast","slow","line","sig","signal","histogram","rsi","kdj","atr","vwap","zone","options","zoneOffset","heikinAshi","bars","obv","cci","williamsR","mfi","stochRsi","dmi","psar","supertrend","value","ichimoku","keltner","donchian","volumeProfile","count","to","rows","lo","hi","empty","step","total","h","target","r0","r1","span","r","bottom","overlap","poc","wanted","inside","below","UNIT_MS","parseTimeframe","timeframe","match","unit","bucketKey","tf","months","bucketStart","key","shifted","guess","isColumns","resampleBars","offset","timeZone","columns","get","current","currentKey","bar","result"],"sources":["../../../../../charts/src/engine/trading/indicators.ts"],"sourcesContent":["// Technical indicators on columns of numbers (Float64Array out, NaN while\n// an indicator warms up). Every kernel computes the outputs from index\n// `from` on, assuming the outputs before it are up to date: the chart\n// recomputes only the last bar on each tick, even with a million bars.\n\nimport { offsetOf, zoneOffset, type UtcOffset } from \"./format\";\nimport type {\n TradingBar,\n TradingBarColumns,\n TradingBarsInput,\n TradingTimeframe,\n TradingVolumeProfile,\n} from \"./types\";\n\ntype Values = ArrayLike<number>;\n\nconst finite = Number.isFinite;\n\n/** Output array of `n` values, NaN-filled */\nconst nanArray = (n: number) => new Float64Array(n).fill(NaN);\n\nconst periodOf = (period: number) => Math.max(1, Math.floor(period) || 1);\n\n// ---------------------------------------------------------------- kernels\n\n/** Simple moving average of `src[0..n)` into `out`, from index `from` */\nexport const smaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n let sum = 0;\n let valid = 0;\n // the window ending just before `from` (the loop below drops its oldest value)\n for (let j = Math.max(0, from - p); j < from; j++) {\n const v = src[j];\n if (finite(v)) {\n sum += v;\n valid++;\n }\n }\n for (let i = from; i < n; i++) {\n const v = src[i];\n if (finite(v)) {\n sum += v;\n valid++;\n }\n if (i >= p) {\n const old = src[i - p];\n if (finite(old)) {\n sum -= old;\n valid--;\n }\n }\n out[i] = valid === p ? sum / p : NaN;\n }\n};\n\n/** Mean of `src[i-p+1..i]`, NaN unless the window is complete */\nconst windowMean = (src: Values, i: number, p: number) => {\n if (i < p - 1) return NaN;\n let sum = 0;\n for (let k = i - p + 1; k <= i; k++) {\n const v = src[k];\n if (!finite(v)) return NaN;\n sum += v;\n }\n return sum / p;\n};\n\n/**\n * Exponential smoothing with factor `alpha`, seeded with the simple\n * average of the first complete window (the TradingView convention)\n */\nconst smoothInto = (\n src: Values,\n n: number,\n p: number,\n alpha: number,\n out: Float64Array,\n from: number,\n) => {\n for (let i = from; i < n; i++) {\n const v = src[i];\n const prev = i > 0 ? out[i - 1] : NaN;\n if (!finite(v)) out[i] = NaN;\n else if (finite(prev)) out[i] = prev + alpha * (v - prev);\n else out[i] = windowMean(src, i, p);\n }\n};\n\n/** Exponential moving average (alpha = 2 / (period + 1)) */\nexport const emaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n smoothInto(src, n, p, 2 / (p + 1), out, from);\n};\n\n/** Wilder's moving average (alpha = 1 / period), used by RSI and ATR */\nexport const rmaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n smoothInto(src, n, p, 1 / p, out, from);\n};\n\n/** Linearly weighted moving average (the newest bar weighs `period`) */\nexport const wmaInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n const denominator = (p * (p + 1)) / 2;\n const direct = (i: number) => {\n if (i < p - 1) return NaN;\n let num = 0;\n for (let k = 0; k < p; k++) {\n const v = src[i - k];\n if (!finite(v)) return NaN;\n num += (p - k) * v;\n }\n return num;\n };\n // numerator of the previous index and the sum of its window\n let num = from > 0 ? direct(from - 1) : NaN;\n let sum = from > 0 ? windowMean(src, from - 1, p) * p : NaN;\n for (let i = from; i < n; i++) {\n const v = src[i];\n if (finite(num) && finite(sum) && finite(v)) {\n num = num - sum + p * v;\n sum = sum + v - (i >= p ? src[i - p] : 0);\n } else {\n num = direct(i);\n sum = windowMean(src, i, p) * p;\n }\n out[i] = finite(num) ? num / denominator : NaN;\n }\n};\n\n/** Population standard deviation over the window (two passes: exact) */\nexport const stdevInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n for (let i = from; i < n; i++) {\n const mean = windowMean(src, i, p);\n if (!finite(mean)) {\n out[i] = NaN;\n continue;\n }\n let sq = 0;\n for (let k = i - p + 1; k <= i; k++) {\n const d = src[k] - mean;\n sq += d * d;\n }\n out[i] = Math.sqrt(sq / p);\n }\n};\n\n/**\n * Highest (or lowest) value of the window ending at each index, NaN while\n * the window is incomplete or holds a NaN. A monotonic queue of indices\n * makes it O(1) per bar whatever the period (Ichimoku uses 52 bars).\n */\nconst extremeInto = (\n src: Values,\n n: number,\n p: number,\n out: Float64Array,\n from: number,\n highest: boolean,\n) => {\n const queue = new Int32Array(p + 1);\n let head = 0;\n let tail = 0;\n let lastNaN = -1;\n const better = (a: number, b: number) => (highest ? a >= b : a <= b);\n const push = (i: number) => {\n const v = src[i];\n if (!finite(v)) {\n lastNaN = i;\n head = tail = 0;\n return;\n }\n while (tail > head && better(v, src[queue[(tail - 1) % (p + 1)]])) tail--;\n queue[tail % (p + 1)] = i;\n tail++;\n while (queue[head % (p + 1)] <= i - p) head++;\n };\n // the window ending just before `from`\n for (let i = Math.max(0, from - p + 1); i < from; i++) push(i);\n for (let i = from; i < n; i++) {\n push(i);\n out[i] =\n i < p - 1 || lastNaN > i - p || tail === head\n ? NaN\n : src[queue[head % (p + 1)]];\n }\n};\n\n/** RSI with Wilder smoothing; `gain` / `loss` hold the running averages */\nexport const rsiInto = (\n close: Values,\n n: number,\n period: number,\n out: Float64Array,\n gain: Float64Array,\n loss: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n for (let i = from; i < n; i++) {\n gain[i] = loss[i] = NaN;\n out[i] = NaN;\n if (i === 0) continue;\n const change = close[i] - close[i - 1];\n if (!finite(change)) continue;\n if (finite(gain[i - 1]) && finite(loss[i - 1])) {\n gain[i] = (gain[i - 1] * (p - 1) + Math.max(change, 0)) / p;\n loss[i] = (loss[i - 1] * (p - 1) + Math.max(-change, 0)) / p;\n } else if (i >= p) {\n let g = 0;\n let l = 0;\n let ok = true;\n for (let k = i - p + 1; k <= i; k++) {\n const c = close[k] - close[k - 1];\n if (!finite(c)) {\n ok = false;\n break;\n }\n if (c > 0) g += c;\n else l -= c;\n }\n if (!ok) continue;\n gain[i] = g / p;\n loss[i] = l / p;\n } else {\n continue;\n }\n out[i] =\n loss[i] === 0\n ? gain[i] === 0\n ? 50\n : 100\n : 100 - 100 / (1 + gain[i] / loss[i]);\n }\n};\n\n/** True range of each bar */\nexport const trueRangeInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n out: Float64Array,\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n const range = high[i] - low[i];\n if (i === 0 || !finite(close[i - 1])) {\n out[i] = range;\n continue;\n }\n const pc = close[i - 1];\n out[i] = Math.max(range, Math.abs(high[i] - pc), Math.abs(low[i] - pc));\n }\n};\n\n/** KDJ: K and D smoothed from the raw stochastic value (seeded at 50), J = 3K − 2D */\nexport const kdjInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n period: number,\n kPeriod: number,\n dPeriod: number,\n k: Float64Array,\n d: Float64Array,\n j: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n const m1 = periodOf(kPeriod);\n const m2 = periodOf(dPeriod);\n for (let i = from; i < n; i++) {\n k[i] = d[i] = j[i] = NaN;\n if (i < p - 1) continue;\n let hh = -Infinity;\n let ll = Infinity;\n for (let q = i - p + 1; q <= i; q++) {\n if (high[q] > hh) hh = high[q];\n if (low[q] < ll) ll = low[q];\n }\n const c = close[i];\n if (!finite(hh) || !finite(ll) || !finite(c)) continue;\n const rsv = hh === ll ? 50 : ((c - ll) / (hh - ll)) * 100;\n const pk = i > 0 && finite(k[i - 1]) ? k[i - 1] : 50;\n const pd = i > 0 && finite(d[i - 1]) ? d[i - 1] : 50;\n k[i] = ((m1 - 1) * pk + rsv) / m1;\n d[i] = ((m2 - 1) * pd + k[i]) / m2;\n j[i] = 3 * k[i] - 2 * d[i];\n }\n};\n\nconst DAY = 86_400_000;\n\n/** Session key of a time: bars with the same key are in the same VWAP period */\nexport const sessionKey = (\n time: number,\n reset: \"day\" | \"week\" | \"month\" | \"none\",\n utcOffset: UtcOffset = 0,\n): number => {\n if (reset === \"none\") return 0;\n const t = time + offsetOf(utcOffset, time) * 60_000;\n const day = Math.floor(t / DAY);\n if (reset === \"day\") return day;\n // 1970-01-01 is a Thursday: weeks start on Monday\n if (reset === \"week\") return Math.floor((day + 3) / 7);\n const date = new Date(t);\n return date.getUTCFullYear() * 12 + date.getUTCMonth();\n};\n\n/** VWAP; `pv` / `vol` hold the cumulative sums of the period */\nexport const vwapInto = (\n high: Values,\n low: Values,\n close: Values,\n volume: Values,\n time: Values | null,\n n: number,\n reset: \"day\" | \"week\" | \"month\" | \"none\",\n utcOffset: UtcOffset,\n out: Float64Array,\n pv: Float64Array,\n vol: Float64Array,\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n const tp = (high[i] + low[i] + close[i]) / 3;\n const v = finite(volume[i]) ? volume[i] : 0;\n const same =\n i > 0 &&\n (!time ||\n sessionKey(time[i], reset, utcOffset) ===\n sessionKey(time[i - 1], reset, utcOffset));\n const basePv = same && finite(pv[i - 1]) ? pv[i - 1] : 0;\n const baseV = same && finite(vol[i - 1]) ? vol[i - 1] : 0;\n pv[i] = basePv + (finite(tp) ? tp * v : 0);\n vol[i] = baseV + v;\n out[i] = vol[i] > 0 ? pv[i] / vol[i] : finite(tp) ? tp : NaN;\n }\n};\n\n/** Heikin-Ashi bars from regular bars */\nexport const heikinAshiInto = (\n open: Values,\n high: Values,\n low: Values,\n close: Values,\n n: number,\n out: {\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n },\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n const c = (open[i] + high[i] + low[i] + close[i]) / 4;\n const prevOpen = i > 0 ? out.open[i - 1] : NaN;\n const prevClose = i > 0 ? out.close[i - 1] : NaN;\n const o =\n finite(prevOpen) && finite(prevClose)\n ? (prevOpen + prevClose) / 2\n : (open[i] + close[i]) / 2;\n out.open[i] = o;\n out.close[i] = c;\n out.high[i] = Math.max(high[i], o, c);\n out.low[i] = Math.min(low[i], o, c);\n }\n};\n\n/** On-balance volume: the volume added on up closes, subtracted on down closes */\nexport const obvInto = (\n close: Values,\n volume: Values,\n n: number,\n out: Float64Array,\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n if (i === 0) {\n out[i] = 0;\n continue;\n }\n const v = finite(volume[i]) ? volume[i] : 0;\n const prev = finite(out[i - 1]) ? out[i - 1] : 0;\n const change = close[i] - close[i - 1];\n out[i] = prev + (change > 0 ? v : change < 0 ? -v : 0);\n }\n};\n\n/** Typical price (high + low + close) / 3 */\nconst typicalInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n out: Float64Array,\n from: number,\n) => {\n for (let i = from; i < n; i++) out[i] = (high[i] + low[i] + close[i]) / 3;\n};\n\n/** Commodity channel index: distance of the typical price from its average, in mean deviations / 0.015 */\nexport const cciInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n period: number,\n out: Float64Array,\n typical: Float64Array,\n mean: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n typicalInto(high, low, close, n, typical, from);\n smaInto(typical, n, p, mean, from);\n for (let i = from; i < n; i++) {\n const m = mean[i];\n if (!finite(m)) {\n out[i] = NaN;\n continue;\n }\n let deviation = 0;\n for (let k = i - p + 1; k <= i; k++) deviation += Math.abs(typical[k] - m);\n deviation /= p;\n out[i] = deviation === 0 ? 0 : (typical[i] - m) / (0.015 * deviation);\n }\n};\n\n/** Williams %R (−100 to 0): the close within the range of the window, from its high */\nexport const williamsRInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n period: number,\n out: Float64Array,\n highest: Float64Array,\n lowest: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n extremeInto(high, n, p, highest, from, true);\n extremeInto(low, n, p, lowest, from, false);\n for (let i = from; i < n; i++) {\n const hh = highest[i];\n const ll = lowest[i];\n out[i] =\n !finite(hh) || !finite(ll)\n ? NaN\n : hh === ll\n ? -50\n : ((hh - close[i]) / (hh - ll)) * -100;\n }\n};\n\n/** Money flow index (0-100): an RSI of the typical price weighted by the volume */\nexport const mfiInto = (\n high: Values,\n low: Values,\n close: Values,\n volume: Values,\n n: number,\n period: number,\n out: Float64Array,\n typical: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n typicalInto(high, low, close, n, typical, Math.max(0, from - p - 1));\n for (let i = from; i < n; i++) {\n if (i < p) {\n out[i] = NaN;\n continue;\n }\n let positive = 0;\n let negative = 0;\n let ok = true;\n for (let k = i - p + 1; k <= i; k++) {\n const flow = typical[k] * (finite(volume[k]) ? volume[k] : 0);\n if (!finite(flow) || !finite(typical[k - 1])) {\n ok = false;\n break;\n }\n if (typical[k] > typical[k - 1]) positive += flow;\n else if (typical[k] < typical[k - 1]) negative += flow;\n }\n out[i] = !ok\n ? NaN\n : negative === 0\n ? positive === 0\n ? 50\n : 100\n : 100 - 100 / (1 + positive / negative);\n }\n};\n\n/** Working columns of the stochastic RSI */\nexport interface StochRsiWork {\n rsi: Float64Array;\n gain: Float64Array;\n loss: Float64Array;\n highest: Float64Array;\n lowest: Float64Array;\n raw: Float64Array;\n}\n\n/** Stochastic RSI: the stochastic of the RSI, smoothed into K and D */\nexport const stochRsiInto = (\n close: Values,\n n: number,\n rsiPeriod: number,\n stochPeriod: number,\n kPeriod: number,\n dPeriod: number,\n k: Float64Array,\n d: Float64Array,\n work: StochRsiWork,\n from = 0,\n): void => {\n const p = periodOf(stochPeriod);\n rsiInto(close, n, rsiPeriod, work.rsi, work.gain, work.loss, from);\n extremeInto(work.rsi, n, p, work.highest, from, true);\n extremeInto(work.rsi, n, p, work.lowest, from, false);\n for (let i = from; i < n; i++) {\n const hh = work.highest[i];\n const ll = work.lowest[i];\n work.raw[i] =\n !finite(hh) || !finite(ll)\n ? NaN\n : hh === ll\n ? 50\n : ((work.rsi[i] - ll) / (hh - ll)) * 100;\n }\n smaInto(work.raw, n, kPeriod, k, from);\n smaInto(k, n, dPeriod, d, from);\n};\n\n/** Working columns of the DMI */\nexport interface DmiWork {\n tr: Float64Array;\n plusDm: Float64Array;\n minusDm: Float64Array;\n smoothTr: Float64Array;\n smoothPlus: Float64Array;\n smoothMinus: Float64Array;\n dx: Float64Array;\n}\n\n/** Directional movement index (Wilder): +DI, −DI and the ADX */\nexport const dmiInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n period: number,\n adxPeriod: number,\n plus: Float64Array,\n minus: Float64Array,\n adx: Float64Array,\n work: DmiWork,\n from = 0,\n): void => {\n for (let i = from; i < n; i++) {\n if (i === 0) {\n work.tr[i] = work.plusDm[i] = work.minusDm[i] = NaN;\n continue;\n }\n const up = high[i] - high[i - 1];\n const down = low[i - 1] - low[i];\n work.plusDm[i] = up > down && up > 0 ? up : 0;\n work.minusDm[i] = down > up && down > 0 ? down : 0;\n const pc = close[i - 1];\n work.tr[i] = Math.max(\n high[i] - low[i],\n Math.abs(high[i] - pc),\n Math.abs(low[i] - pc),\n );\n }\n rmaInto(work.tr, n, period, work.smoothTr, from);\n rmaInto(work.plusDm, n, period, work.smoothPlus, from);\n rmaInto(work.minusDm, n, period, work.smoothMinus, from);\n for (let i = from; i < n; i++) {\n const tr = work.smoothTr[i];\n plus[i] = tr ? (100 * work.smoothPlus[i]) / tr : NaN;\n minus[i] = tr ? (100 * work.smoothMinus[i]) / tr : NaN;\n const sum = plus[i] + minus[i];\n work.dx[i] = !finite(sum)\n ? NaN\n : sum === 0\n ? 0\n : (100 * Math.abs(plus[i] - minus[i])) / sum;\n }\n rmaInto(work.dx, n, adxPeriod, adx, from);\n};\n\n/** Working columns of the parabolic SAR */\nexport interface PsarWork {\n /** Extreme point of the trend */\n ep: Float64Array;\n /** Acceleration factor */\n af: Float64Array;\n /** 1 rising, −1 falling */\n trend: Float64Array;\n}\n\n/** Parabolic stop and reverse (Wilder) */\nexport const psarInto = (\n high: Values,\n low: Values,\n n: number,\n start: number,\n increment: number,\n maximum: number,\n out: Float64Array,\n work: PsarWork,\n from = 0,\n): void => {\n const { ep, af, trend } = work;\n for (let i = from; i < n; i++) {\n if (i === 0) {\n out[i] = ep[i] = af[i] = trend[i] = NaN;\n continue;\n }\n if (!finite(trend[i - 1])) {\n // the first two bars set the direction\n const up = high[i] + low[i] >= high[i - 1] + low[i - 1];\n out[i] = up\n ? Math.min(low[i - 1], low[i])\n : Math.max(high[i - 1], high[i]);\n ep[i] = up\n ? Math.max(high[i - 1], high[i])\n : Math.min(low[i - 1], low[i]);\n af[i] = start;\n trend[i] = finite(out[i]) ? (up ? 1 : -1) : NaN;\n continue;\n }\n const prevEp = ep[i - 1];\n const prevAf = af[i - 1];\n let sar = out[i - 1] + prevAf * (prevEp - out[i - 1]);\n const before = i >= 2 ? i - 2 : i - 1;\n if (trend[i - 1] === 1) {\n sar = Math.min(sar, low[i - 1], low[before]);\n if (low[i] < sar) {\n trend[i] = -1;\n sar = Math.max(prevEp, high[i]);\n ep[i] = low[i];\n af[i] = start;\n } else {\n trend[i] = 1;\n ep[i] = Math.max(prevEp, high[i]);\n af[i] =\n high[i] > prevEp ? Math.min(prevAf + increment, maximum) : prevAf;\n }\n } else {\n sar = Math.max(sar, high[i - 1], high[before]);\n if (high[i] > sar) {\n trend[i] = 1;\n sar = Math.min(prevEp, low[i]);\n ep[i] = high[i];\n af[i] = start;\n } else {\n trend[i] = -1;\n ep[i] = Math.min(prevEp, low[i]);\n af[i] =\n low[i] < prevEp ? Math.min(prevAf + increment, maximum) : prevAf;\n }\n }\n out[i] = sar;\n }\n};\n\n/** Working columns of the SuperTrend */\nexport interface SupertrendWork {\n tr: Float64Array;\n atr: Float64Array;\n upper: Float64Array;\n lower: Float64Array;\n}\n\n/**\n * SuperTrend: a trailing band `multiplier` ATRs from the median price,\n * below the bars in an uptrend (`direction` 1), above them in a downtrend (−1)\n */\nexport const supertrendInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n period: number,\n multiplier: number,\n out: Float64Array,\n direction: Float64Array,\n work: SupertrendWork,\n from = 0,\n): void => {\n const { tr, atr: range, upper, lower } = work;\n trueRangeInto(high, low, close, n, tr, from);\n rmaInto(tr, n, period, range, from);\n for (let i = from; i < n; i++) {\n const a = range[i];\n if (!finite(a)) {\n out[i] = direction[i] = upper[i] = lower[i] = NaN;\n continue;\n }\n const mid = (high[i] + low[i]) / 2;\n let up = mid + multiplier * a;\n let down = mid - multiplier * a;\n const pu = i > 0 ? upper[i - 1] : NaN;\n const pl = i > 0 ? lower[i - 1] : NaN;\n const pc = i > 0 ? close[i - 1] : NaN;\n // the bands only tighten while the trend holds\n if (finite(pl) && !(down > pl || pc < pl)) down = pl;\n if (finite(pu) && !(up < pu || pc > pu)) up = pu;\n upper[i] = up;\n lower[i] = down;\n const pd = i > 0 ? direction[i - 1] : NaN;\n const d = !finite(pd)\n ? -1\n : pd === -1\n ? close[i] > up\n ? 1\n : -1\n : close[i] < down\n ? -1\n : 1;\n direction[i] = d;\n out[i] = d === 1 ? down : up;\n }\n};\n\n/** Midpoint of the highest high and the lowest low of a window */\nconst midpointInto = (\n high: Values,\n low: Values,\n n: number,\n period: number,\n out: Float64Array,\n highest: Float64Array,\n lowest: Float64Array,\n from: number,\n) => {\n const p = periodOf(period);\n extremeInto(high, n, p, highest, from, true);\n extremeInto(low, n, p, lowest, from, false);\n for (let i = from; i < n; i++) out[i] = (highest[i] + lowest[i]) / 2;\n};\n\n/** Working columns of Ichimoku */\nexport interface IchimokuWork {\n highest: Float64Array;\n lowest: Float64Array;\n}\n\n/**\n * Ichimoku lines at each bar (unshifted): conversion (Tenkan), base\n * (Kijun), leading span A and B (drawn `displacement − 1` bars ahead)\n */\nexport const ichimokuInto = (\n high: Values,\n low: Values,\n n: number,\n conversionPeriod: number,\n basePeriod: number,\n spanBPeriod: number,\n conversion: Float64Array,\n base: Float64Array,\n spanA: Float64Array,\n spanB: Float64Array,\n work: IchimokuWork,\n from = 0,\n): void => {\n const { highest, lowest } = work;\n midpointInto(\n high,\n low,\n n,\n conversionPeriod,\n conversion,\n highest,\n lowest,\n from,\n );\n midpointInto(high, low, n, basePeriod, base, highest, lowest, from);\n midpointInto(high, low, n, spanBPeriod, spanB, highest, lowest, from);\n for (let i = from; i < n; i++) spanA[i] = (conversion[i] + base[i]) / 2;\n};\n\n/** Donchian channel: highest high, lowest low and their midpoint */\nexport const donchianInto = (\n high: Values,\n low: Values,\n n: number,\n period: number,\n upper: Float64Array,\n lower: Float64Array,\n middle: Float64Array,\n from = 0,\n): void => {\n const p = periodOf(period);\n extremeInto(high, n, p, upper, from, true);\n extremeInto(low, n, p, lower, from, false);\n for (let i = from; i < n; i++) middle[i] = (upper[i] + lower[i]) / 2;\n};\n\n/** Keltner channel: an EMA of the close ± `multiplier` ATRs */\nexport const keltnerInto = (\n high: Values,\n low: Values,\n close: Values,\n n: number,\n period: number,\n multiplier: number,\n atrPeriod: number,\n middle: Float64Array,\n upper: Float64Array,\n lower: Float64Array,\n work: { tr: Float64Array; atr: Float64Array },\n from = 0,\n): void => {\n emaInto(close, n, period, middle, from);\n trueRangeInto(high, low, close, n, work.tr, from);\n rmaInto(work.tr, n, atrPeriod, work.atr, from);\n for (let i = from; i < n; i++) {\n upper[i] = middle[i] + multiplier * work.atr[i];\n lower[i] = middle[i] - multiplier * work.atr[i];\n }\n};\n\n// ------------------------------------------------------- public functions\n\n/**\n * Simple moving average: the mean of the last `period` values (NaN until\n * `period` values are available)\n */\nexport const sma = (values: Values, period: number): Float64Array => {\n const out = nanArray(values.length);\n smaInto(values, values.length, period, out);\n return out;\n};\n\n/** Exponential moving average, seeded with the simple average of the first `period` values */\nexport const ema = (values: Values, period: number): Float64Array => {\n const out = nanArray(values.length);\n emaInto(values, values.length, period, out);\n return out;\n};\n\n/** Linearly weighted moving average: the newest value weighs `period`, the oldest 1 */\nexport const wma = (values: Values, period: number): Float64Array => {\n const out = nanArray(values.length);\n wmaInto(values, values.length, period, out);\n return out;\n};\n\n/** Bollinger bands: simple average ± `multiplier` population standard deviations */\nexport const bollinger = (\n values: Values,\n period = 20,\n multiplier = 2,\n): { middle: Float64Array; upper: Float64Array; lower: Float64Array } => {\n const n = values.length;\n const middle = nanArray(n);\n const upper = nanArray(n);\n const lower = nanArray(n);\n const dev = nanArray(n);\n smaInto(values, n, period, middle);\n stdevInto(values, n, period, dev);\n for (let i = 0; i < n; i++) {\n upper[i] = middle[i] + multiplier * dev[i];\n lower[i] = middle[i] - multiplier * dev[i];\n }\n return { middle, upper, lower };\n};\n\n/** MACD line (fast EMA − slow EMA), its signal EMA and their difference */\nexport const macd = (\n values: Values,\n fast = 12,\n slow = 26,\n signal = 9,\n): { macd: Float64Array; signal: Float64Array; histogram: Float64Array } => {\n const n = values.length;\n const f = nanArray(n);\n const s = nanArray(n);\n emaInto(values, n, fast, f);\n emaInto(values, n, slow, s);\n const line = nanArray(n);\n for (let i = 0; i < n; i++) line[i] = f[i] - s[i];\n const sig = nanArray(n);\n emaInto(line, n, signal, sig);\n const histogram = nanArray(n);\n for (let i = 0; i < n; i++) histogram[i] = line[i] - sig[i];\n return { macd: line, signal: sig, histogram };\n};\n\n/** Relative strength index (0-100) with Wilder smoothing */\nexport const rsi = (values: Values, period = 14): Float64Array => {\n const n = values.length;\n const out = nanArray(n);\n rsiInto(values, n, period, out, nanArray(n), nanArray(n));\n return out;\n};\n\n/** KDJ stochastic: K and D smoothed (seeded at 50), J = 3K − 2D */\nexport const kdj = (\n high: Values,\n low: Values,\n close: Values,\n period = 9,\n kPeriod = 3,\n dPeriod = 3,\n): { k: Float64Array; d: Float64Array; j: Float64Array } => {\n const n = close.length;\n const k = nanArray(n);\n const d = nanArray(n);\n const j = nanArray(n);\n kdjInto(high, low, close, n, period, kPeriod, dPeriod, k, d, j);\n return { k, d, j };\n};\n\n/** Average true range with Wilder smoothing */\nexport const atr = (\n high: Values,\n low: Values,\n close: Values,\n period = 14,\n): Float64Array => {\n const n = close.length;\n const tr = nanArray(n);\n trueRangeInto(high, low, close, n, tr);\n const out = nanArray(n);\n rmaInto(tr, n, period, out);\n return out;\n};\n\n/**\n * Volume-weighted average of the typical price (high + low + close) / 3,\n * restarting each `reset` period (UTC, or shifted by `utcOffset` minutes,\n * or in the IANA `timeZone`); without `time`, a single cumulative average\n */\nexport const vwap = (\n high: Values,\n low: Values,\n close: Values,\n volume: Values,\n options: {\n time?: Values;\n reset?: \"day\" | \"week\" | \"month\" | \"none\";\n utcOffset?: number;\n timeZone?: string;\n } = {},\n): Float64Array => {\n const n = close.length;\n const out = nanArray(n);\n const zone = options.timeZone;\n vwapInto(\n high,\n low,\n close,\n volume,\n options.time ?? null,\n n,\n options.reset ?? \"day\",\n options.utcOffset ?? (zone ? (time: number) => zoneOffset(time, zone) : 0),\n out,\n nanArray(n),\n nanArray(n),\n );\n return out;\n};\n\n/** Heikin-Ashi bars: averaged bars that smooth out the noise of trends */\nexport const heikinAshi = (bars: {\n open: Values;\n high: Values;\n low: Values;\n close: Values;\n}): {\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n} => {\n const n = bars.close.length;\n const out = {\n open: nanArray(n),\n high: nanArray(n),\n low: nanArray(n),\n close: nanArray(n),\n };\n heikinAshiInto(bars.open, bars.high, bars.low, bars.close, n, out);\n return out;\n};\n\n/** On-balance volume: the running sum of the volume, signed by the close change */\nexport const obv = (close: Values, volume: Values): Float64Array => {\n const out = nanArray(close.length);\n obvInto(close, volume, close.length, out);\n return out;\n};\n\n/** Commodity channel index (typically between −100 and +100 in a range) */\nexport const cci = (\n high: Values,\n low: Values,\n close: Values,\n period = 20,\n): Float64Array => {\n const n = close.length;\n const out = nanArray(n);\n cciInto(high, low, close, n, period, out, nanArray(n), nanArray(n));\n return out;\n};\n\n/** Williams %R, from −100 (close at the lowest low) to 0 (at the highest high) */\nexport const williamsR = (\n high: Values,\n low: Values,\n close: Values,\n period = 14,\n): Float64Array => {\n const n = close.length;\n const out = nanArray(n);\n williamsRInto(high, low, close, n, period, out, nanArray(n), nanArray(n));\n return out;\n};\n\n/** Money flow index (0-100): a volume-weighted RSI of the typical price */\nexport const mfi = (\n high: Values,\n low: Values,\n close: Values,\n volume: Values,\n period = 14,\n): Float64Array => {\n const n = close.length;\n const out = nanArray(n);\n mfiInto(high, low, close, volume, n, period, out, nanArray(n));\n return out;\n};\n\n/** Stochastic RSI (0-100): the stochastic of the RSI, smoothed into K and D */\nexport const stochRsi = (\n close: Values,\n options: {\n rsiPeriod?: number;\n stochPeriod?: number;\n kPeriod?: number;\n dPeriod?: number;\n } = {},\n): { k: Float64Array; d: Float64Array } => {\n const n = close.length;\n const k = nanArray(n);\n const d = nanArray(n);\n stochRsiInto(\n close,\n n,\n options.rsiPeriod ?? 14,\n options.stochPeriod ?? 14,\n options.kPeriod ?? 3,\n options.dPeriod ?? 3,\n k,\n d,\n {\n rsi: nanArray(n),\n gain: nanArray(n),\n loss: nanArray(n),\n highest: nanArray(n),\n lowest: nanArray(n),\n raw: nanArray(n),\n },\n );\n return { k, d };\n};\n\n/** Directional movement (Wilder): +DI, −DI and the average directional index */\nexport const dmi = (\n high: Values,\n low: Values,\n close: Values,\n period = 14,\n adxPeriod = 14,\n): { plus: Float64Array; minus: Float64Array; adx: Float64Array } => {\n const n = close.length;\n const plus = nanArray(n);\n const minus = nanArray(n);\n const adx = nanArray(n);\n dmiInto(high, low, close, n, period, adxPeriod, plus, minus, adx, {\n tr: nanArray(n),\n plusDm: nanArray(n),\n minusDm: nanArray(n),\n smoothTr: nanArray(n),\n smoothPlus: nanArray(n),\n smoothMinus: nanArray(n),\n dx: nanArray(n),\n });\n return { plus, minus, adx };\n};\n\n/**\n * Parabolic SAR (Wilder): a trailing stop below the bars in an uptrend,\n * above them in a downtrend, accelerating with each new extreme\n */\nexport const psar = (\n high: Values,\n low: Values,\n options: { start?: number; increment?: number; maximum?: number } = {},\n): Float64Array => {\n const n = high.length;\n const out = nanArray(n);\n const start = options.start ?? 0.02;\n psarInto(\n high,\n low,\n n,\n start,\n options.increment ?? start,\n options.maximum ?? 0.2,\n out,\n { ep: nanArray(n), af: nanArray(n), trend: nanArray(n) },\n );\n return out;\n};\n\n/**\n * SuperTrend: the trailing band (`value`) and the trend (`direction`: 1 up,\n * −1 down)\n */\nexport const supertrend = (\n high: Values,\n low: Values,\n close: Values,\n period = 10,\n multiplier = 3,\n): { value: Float64Array; direction: Float64Array } => {\n const n = close.length;\n const value = nanArray(n);\n const direction = nanArray(n);\n supertrendInto(high, low, close, n, period, multiplier, value, direction, {\n tr: nanArray(n),\n atr: nanArray(n),\n upper: nanArray(n),\n lower: nanArray(n),\n });\n return { value, direction };\n};\n\n/**\n * Ichimoku Kinkō Hyō, aligned on the bars that compute them: the leading\n * spans are plotted `displacement − 1` bars ahead and the lagging span is\n * the close plotted `displacement − 1` bars back\n */\nexport const ichimoku = (\n high: Values,\n low: Values,\n options: {\n conversionPeriod?: number;\n basePeriod?: number;\n spanBPeriod?: number;\n } = {},\n): {\n conversion: Float64Array;\n base: Float64Array;\n spanA: Float64Array;\n spanB: Float64Array;\n} => {\n const n = high.length;\n const out = {\n conversion: nanArray(n),\n base: nanArray(n),\n spanA: nanArray(n),\n spanB: nanArray(n),\n };\n ichimokuInto(\n high,\n low,\n n,\n options.conversionPeriod ?? 9,\n options.basePeriod ?? 26,\n options.spanBPeriod ?? 52,\n out.conversion,\n out.base,\n out.spanA,\n out.spanB,\n { highest: nanArray(n), lowest: nanArray(n) },\n );\n return out;\n};\n\n/** Keltner channel: EMA of the close ± `multiplier` average true ranges */\nexport const keltner = (\n high: Values,\n low: Values,\n close: Values,\n options: { period?: number; multiplier?: number; atrPeriod?: number } = {},\n): { middle: Float64Array; upper: Float64Array; lower: Float64Array } => {\n const n = close.length;\n const out = { middle: nanArray(n), upper: nanArray(n), lower: nanArray(n) };\n keltnerInto(\n high,\n low,\n close,\n n,\n options.period ?? 20,\n options.multiplier ?? 2,\n options.atrPeriod ?? 10,\n out.middle,\n out.upper,\n out.lower,\n { tr: nanArray(n), atr: nanArray(n) },\n );\n return out;\n};\n\n/** Donchian channel: highest high, lowest low and their midpoint over `period` bars */\nexport const donchian = (\n high: Values,\n low: Values,\n period = 20,\n): { upper: Float64Array; lower: Float64Array; middle: Float64Array } => {\n const n = high.length;\n const out = { upper: nanArray(n), lower: nanArray(n), middle: nanArray(n) };\n donchianInto(high, low, n, period, out.upper, out.lower, out.middle);\n return out;\n};\n\n/**\n * Volume profile: the volume of bars `from..to` (inclusive) spread over\n * `rows` price rows (each bar evenly over its low-high range), split by\n * rising / falling bars, with the point of control and the value area\n * (the rows around it holding `valueArea` of the volume, 70% by default)\n */\nexport const volumeProfile = (\n bars: {\n open: Values;\n high: Values;\n low: Values;\n close: Values;\n volume: Values;\n },\n options: {\n from?: number;\n to?: number;\n rows?: number;\n valueArea?: number;\n } = {},\n): TradingVolumeProfile => {\n const count = bars.close.length;\n const from = Math.max(0, Math.floor(options.from ?? 0));\n const to = Math.min(count - 1, Math.floor(options.to ?? count - 1));\n const rows = Math.max(1, Math.floor(options.rows ?? 24));\n let lo = Infinity;\n let hi = -Infinity;\n for (let i = from; i <= to; i++) {\n if (bars.low[i] < lo) lo = bars.low[i];\n if (bars.high[i] > hi) hi = bars.high[i];\n }\n const up = new Float64Array(rows);\n const down = new Float64Array(rows);\n const empty = {\n low: lo,\n high: hi,\n step: 0,\n up,\n down,\n total: 0,\n poc: -1,\n valueAreaFrom: -1,\n valueAreaTo: -1,\n };\n if (!finite(lo) || !finite(hi)) return empty;\n if (hi === lo) {\n hi += Math.abs(lo) * 1e-6 || 1e-6;\n lo -= Math.abs(lo) * 1e-6 || 1e-6;\n }\n const step = (hi - lo) / rows;\n let total = 0;\n for (let i = from; i <= to; i++) {\n const v = bars.volume[i];\n const l = bars.low[i];\n const h = bars.high[i];\n if (!(v > 0) || !finite(l) || !finite(h)) continue;\n const target = bars.close[i] >= bars.open[i] ? up : down;\n total += v;\n const r0 = Math.min(rows - 1, Math.max(0, Math.floor((l - lo) / step)));\n const r1 = Math.min(rows - 1, Math.max(0, Math.floor((h - lo) / step)));\n if (r0 === r1 || h <= l) {\n target[r0] += v;\n continue;\n }\n const span = h - l;\n for (let r = r0; r <= r1; r++) {\n const bottom = lo + r * step;\n const overlap = Math.min(h, bottom + step) - Math.max(l, bottom);\n if (overlap > 0) target[r] += (v * overlap) / span;\n }\n }\n if (!(total > 0)) return { ...empty, low: lo, high: hi, step };\n let poc = 0;\n for (let r = 1; r < rows; r++)\n if (up[r] + down[r] > up[poc] + down[poc]) poc = r;\n // grow the value area from the point of control toward the larger side\n const wanted = total * Math.min(1, Math.max(0, options.valueArea ?? 0.7));\n let a = poc;\n let b = poc;\n let inside = up[poc] + down[poc];\n while (inside < wanted && (a > 0 || b < rows - 1)) {\n const below = a > 0 ? up[a - 1] + down[a - 1] : -1;\n const above = b < rows - 1 ? up[b + 1] + down[b + 1] : -1;\n if (above >= below) {\n b++;\n inside += up[b] + down[b];\n } else {\n a--;\n inside += up[a] + down[a];\n }\n }\n return {\n low: lo,\n high: hi,\n step,\n up,\n down,\n total,\n poc,\n valueAreaFrom: a,\n valueAreaTo: b,\n };\n};\n\n// -------------------------------------------------------------- timeframes\n\n/** A parsed timeframe: a count of a unit, with its approximate duration */\nexport interface ParsedTimeframe {\n unit: \"ms\" | \"month\";\n count: number;\n /** Approximate duration in ms (30 days per month) */\n ms: number;\n}\n\nconst UNIT_MS: Record<string, number> = {\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n H: 3_600_000,\n d: DAY,\n D: DAY,\n w: 7 * DAY,\n W: 7 * DAY,\n};\n\n/** `\"15m\"` -> 15 minutes, `\"1M\"` -> 1 month; `null` when invalid */\nexport const parseTimeframe = (\n timeframe: TradingTimeframe,\n): ParsedTimeframe | null => {\n if (typeof timeframe === \"number\") {\n return timeframe > 0\n ? { unit: \"ms\", count: timeframe, ms: timeframe }\n : null;\n }\n const match = /^(\\d+(?:\\.\\d+)?)([smhHdDwWM])$/.exec(timeframe.trim());\n if (!match) return null;\n const count = Number(match[1]);\n if (!(count > 0)) return null;\n const unit = match[2];\n if (unit === \"M\") return { unit: \"month\", count, ms: count * 30 * DAY };\n return {\n unit: \"ms\",\n count: count * UNIT_MS[unit],\n ms: count * UNIT_MS[unit],\n };\n};\n\n/**\n * Key of the bucket of `time` in the shifted (displayed) time: weeks start\n * on Monday, months on the 1st. Comparing keys rather than UTC starts keeps\n * a day whole when its offset changes (daylight saving).\n */\nexport const bucketKey = (\n time: number,\n tf: ParsedTimeframe,\n utcOffset: UtcOffset = 0,\n): number => {\n const t = time + offsetOf(utcOffset, time) * 60_000;\n if (tf.unit === \"month\") {\n const date = new Date(t);\n const months = date.getUTCFullYear() * 12 + date.getUTCMonth();\n return months - (months % tf.count);\n }\n if (tf.count % (7 * DAY) === 0) {\n // Monday-aligned weeks (the epoch is a Thursday)\n return Math.floor((t - 4 * DAY) / tf.count);\n }\n return Math.floor(t / tf.count);\n};\n\n/** Start of the bucket of `time` (weeks start on Monday, months on the 1st) */\nexport const bucketStart = (\n time: number,\n tf: ParsedTimeframe,\n utcOffset: UtcOffset = 0,\n): number => {\n const key = bucketKey(time, tf, utcOffset);\n const shifted =\n tf.unit === \"month\"\n ? Date.UTC(Math.floor(key / 12), key % 12, 1)\n : tf.count % (7 * DAY) === 0\n ? key * tf.count + 4 * DAY\n : key * tf.count;\n // the offset at the start itself (it may differ from the one at `time`)\n const guess = shifted - offsetOf(utcOffset, time) * 60_000;\n return shifted - offsetOf(utcOffset, guess) * 60_000;\n};\n\nconst isColumns = (bars: TradingBarsInput): bars is TradingBarColumns =>\n !Array.isArray(bars);\n\n/**\n * Aggregates bars into a longer timeframe (`\"5m\"` bars into `\"1H\"`, ...):\n * first open, highest high, lowest low, last close, summed volume. Buckets\n * are aligned on UTC, or shifted by `timeZone` (minutes from UTC, or an\n * IANA time zone such as `\"America/New_York\"`); weeks start on Monday.\n * Columns in, columns out (Float64Array).\n */\nexport function resampleBars(\n bars: readonly TradingBar[],\n timeframe: TradingTimeframe,\n timeZone?: number | string,\n): TradingBar[];\nexport function resampleBars(\n bars: TradingBarColumns,\n timeframe: TradingTimeframe,\n timeZone?: number | string,\n): TradingBarColumns;\nexport function resampleBars(\n bars: TradingBarsInput,\n timeframe: TradingTimeframe,\n timeZone: number | string = 0,\n): TradingBar[] | TradingBarColumns {\n const tf = parseTimeframe(timeframe);\n if (!tf) throw new Error(`Invalid timeframe: ${String(timeframe)}`);\n const offset: UtcOffset =\n typeof timeZone === \"string\"\n ? (time: number) => zoneOffset(time, timeZone)\n : timeZone;\n const columns = isColumns(bars);\n const n = columns ? bars.close.length : bars.length;\n const get = (i: number): TradingBar => {\n if (!columns) return (bars as readonly TradingBar[])[i];\n const c = bars as TradingBarColumns;\n return {\n time: c.time[i],\n open: c.open[i],\n high: c.high[i],\n low: c.low[i],\n close: c.close[i],\n volume: c.volume ? c.volume[i] : undefined,\n };\n };\n const out: TradingBar[] = [];\n let current: TradingBar | null = null;\n let currentKey = NaN;\n for (let i = 0; i < n; i++) {\n const bar = get(i);\n const key = bucketKey(bar.time, tf, offset);\n if (!current || key !== currentKey) {\n if (current) out.push(current);\n currentKey = key;\n current = {\n time: bucketStart(bar.time, tf, offset),\n open: bar.open,\n high: bar.high,\n low: bar.low,\n close: bar.close,\n volume: bar.volume ?? 0,\n };\n } else {\n if (bar.high > current.high) current.high = bar.high;\n if (bar.low < current.low) current.low = bar.low;\n current.close = bar.close;\n current.volume = (current.volume ?? 0) + (bar.volume ?? 0);\n }\n }\n if (current) out.push(current);\n if (!columns) return out;\n const m = out.length;\n const result = {\n time: new Float64Array(m),\n open: new Float64Array(m),\n high: new Float64Array(m),\n low: new Float64Array(m),\n close: new Float64Array(m),\n volume: new Float64Array(m),\n };\n out.forEach((bar, i) => {\n result.time[i] = bar.time;\n result.open[i] = bar.open;\n result.high[i] = bar.high;\n result.low[i] = bar.low;\n result.close[i] = bar.close;\n result.volume[i] = bar.volume ?? 0;\n });\n return result;\n}\n\n/** Highest / lowest of a window: exported for the KDJ-like studies of the chart */\nexport const highestInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => extremeInto(src, n, periodOf(period), out, from, true);\n\nexport const lowestInto = (\n src: Values,\n n: number,\n period: number,\n out: Float64Array,\n from = 0,\n): void => extremeInto(src, n, periodOf(period), out, from, false);\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e={en:{open:`O`,high:`H`,low:`L`,close:`C`,change:``,volume:`Vol`,limit:`Limit`,position:`Position`,takeProfit:`TP`,stopLoss:`SL`,alert:`Alert`,scrollToRealtime:`Scroll to the latest bar`,toggleIndicator:`Show or hide {name}`,bars:`{count} bars`,days:`{count}d`,hours:`{count}h`,minutes:`{count}m`,chart:`{symbol} price chart`,announcement:`{time}: open {open}, high {high}, low {low}, close {close}`},zh:{open:`开`,high:`高`,low:`低`,close:`收`,change:`涨跌幅`,volume:`成交量`,limit:`限价`,position:`持仓`,takeProfit:`止盈`,stopLoss:`止损`,alert:`预警`,scrollToRealtime:`回到最新 K 线`,toggleIndicator:`显示或隐藏 {name}`,bars:`{count} 根 K 线`,days:`{count}天`,hours:`{count}小时`,minutes:`{count}分`,chart:`{symbol} 价格图表`,announcement:`{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}`},ja:{open:`始`,high:`高`,low:`安`,close:`終`,change:`騰落率`,volume:`出来高`,limit:`指値`,position:`建玉`,takeProfit:`利確`,stopLoss:`損切`,alert:`アラート`,scrollToRealtime:`最新の足へ移動`,toggleIndicator:`{name} の表示を切り替え`,bars:`{count} 本`,days:`{count}日`,hours:`{count}時間`,minutes:`{count}分`,chart:`{symbol} 価格チャート`,announcement:`{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}`},fr:{open:`O`,high:`H`,low:`B`,close:`C`,change:`Var.`,volume:`Vol`,limit:`Limite`,position:`Position`,takeProfit:`TP`,stopLoss:`SL`,alert:`Alerte`,scrollToRealtime:`Revenir à la dernière bougie`,toggleIndicator:`Afficher ou masquer {name}`,bars:`{count} barres`,days:`{count} j`,hours:`{count} h`,minutes:`{count} min`,chart:`Graphique de cours {symbol}`,announcement:`{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}`}},t=(e,t)=>e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e);exports.TRADING_LABELS=e,exports.fill=t;
1
+ var e={en:{open:`O`,high:`H`,low:`L`,close:`C`,change:``,volume:`Vol`,limit:`Limit`,position:`Position`,takeProfit:`TP`,stopLoss:`SL`,alert:`Alert`,scrollToRealtime:`Scroll to the latest bar`,toggleIndicator:`Show or hide {name}`,bars:`{count} bars`,days:`{count}d`,hours:`{count}h`,minutes:`{count}m`,chart:`{symbol} price chart`,announcement:`{time}: open {open}, high {high}, low {low}, close {close}`,ichimoku:`Ichimoku`,supertrend:`SuperTrend`,text:`Text`,color:`Color`,lineWidth:`Line width`,lineStyle:`Line style`,fill:`Fill`,editText:`Edit text`,lock:`Lock`,remove:`Delete`,target:`Target {price} ({change})`,stop:`Stop {price} ({change})`,riskReward:`R:R {ratio}`,profit:`P&L {value}`,long:`Long`,short:`Short`,replay:`Replay · {time}`,replayHint:`Click a bar to start the replay`,buyLimit:`Buy limit {price}`,sellLimit:`Sell limit {price}`,orderHint:`Arrows move the price, Enter confirms, Escape cancels`,orderCancelHint:`Delete cancels the order`,orderLine:`{title} at {price}`,orderPlaced:`Order placed at {price}`,orderCancelled:`Order cancelled`},zh:{open:`开`,high:`高`,low:`低`,close:`收`,change:`涨跌幅`,volume:`成交量`,limit:`限价`,position:`持仓`,takeProfit:`止盈`,stopLoss:`止损`,alert:`预警`,scrollToRealtime:`回到最新 K 线`,toggleIndicator:`显示或隐藏 {name}`,bars:`{count} 根 K 线`,days:`{count}天`,hours:`{count}小时`,minutes:`{count}分`,chart:`{symbol} 价格图表`,announcement:`{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}`,ichimoku:`一目均衡表`,supertrend:`超级趋势`,text:`文本`,color:`颜色`,lineWidth:`线宽`,lineStyle:`线型`,fill:`填充`,editText:`编辑文本`,lock:`锁定`,remove:`删除`,target:`止盈 {price}({change})`,stop:`止损 {price}({change})`,riskReward:`盈亏比 {ratio}`,profit:`盈亏 {value}`,long:`做多`,short:`做空`,replay:`回放 · {time}`,replayHint:`点击一根 K 线开始回放`,buyLimit:`限价买入 {price}`,sellLimit:`限价卖出 {price}`,orderHint:`方向键调整价格,回车确认,Esc 取消`,orderCancelHint:`Delete 键撤销该订单`,orderLine:`{title},价格 {price}`,orderPlaced:`已在 {price} 下单`,orderCancelled:`订单已取消`},ja:{open:`始`,high:`高`,low:`安`,close:`終`,change:`騰落率`,volume:`出来高`,limit:`指値`,position:`建玉`,takeProfit:`利確`,stopLoss:`損切`,alert:`アラート`,scrollToRealtime:`最新の足へ移動`,toggleIndicator:`{name} の表示を切り替え`,bars:`{count} 本`,days:`{count}日`,hours:`{count}時間`,minutes:`{count}分`,chart:`{symbol} 価格チャート`,announcement:`{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}`,ichimoku:`一目均衡表`,supertrend:`スーパートレンド`,text:`テキスト`,color:`色`,lineWidth:`線の太さ`,lineStyle:`線の種類`,fill:`塗りつぶし`,editText:`テキストを編集`,lock:`ロック`,remove:`削除`,target:`利確 {price}({change})`,stop:`損切 {price}({change})`,riskReward:`リスクリワード {ratio}`,profit:`損益 {value}`,long:`ロング`,short:`ショート`,replay:`リプレイ · {time}`,replayHint:`足をクリックしてリプレイを開始`,buyLimit:`指値買い {price}`,sellLimit:`指値売り {price}`,orderHint:`矢印キーで価格を調整、Enter で確定、Esc で取消`,orderCancelHint:`Delete キーで注文を取消`,orderLine:`{title}、価格 {price}`,orderPlaced:`{price} で注文しました`,orderCancelled:`注文を取り消しました`},fr:{open:`O`,high:`H`,low:`B`,close:`C`,change:`Var.`,volume:`Vol`,limit:`Limite`,position:`Position`,takeProfit:`TP`,stopLoss:`SL`,alert:`Alerte`,scrollToRealtime:`Revenir à la dernière bougie`,toggleIndicator:`Afficher ou masquer {name}`,bars:`{count} barres`,days:`{count} j`,hours:`{count} h`,minutes:`{count} min`,chart:`Graphique de cours {symbol}`,announcement:`{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}`,ichimoku:`Ichimoku`,supertrend:`SuperTrend`,text:`Texte`,color:`Couleur`,lineWidth:`Épaisseur`,lineStyle:`Style de trait`,fill:`Remplissage`,editText:`Modifier le texte`,lock:`Verrouiller`,remove:`Supprimer`,target:`Objectif {price} ({change})`,stop:`Stop {price} ({change})`,riskReward:`R/R {ratio}`,profit:`P&L {value}`,long:`Achat`,short:`Vente`,replay:`Relecture · {time}`,replayHint:`Cliquez sur une barre pour lancer la relecture`,buyLimit:`Achat limite {price}`,sellLimit:`Vente limite {price}`,orderHint:`Les flèches déplacent le prix, Entrée valide, Échap annule`,orderCancelHint:`Suppr annule l’ordre`,orderLine:`{title} à {price}`,orderPlaced:`Ordre placé à {price}`,orderCancelled:`Ordre annulé`}},t=(e,t)=>e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e);exports.TRADING_LABELS=e,exports.fill=t;
2
2
  //# sourceMappingURL=labels.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"labels.cjs","names":["TRADING_LABELS","fill","template","key","values","match"],"sources":["../../../../../charts/src/engine/trading/labels.ts"],"sourcesContent":["// Built-in texts of the trading chart, per language (see ../locale.ts).\n\nimport type { LabelDictionary } from \"../locale\";\nimport type { TradingChartLabels } from \"./types\";\n\n/** Every text of the chart but the timeframe (taken from the options) */\nexport type TradingTexts = Required<Omit<TradingChartLabels, \"timeframe\">>;\n\nexport const TRADING_LABELS: LabelDictionary<TradingTexts> = {\n en: {\n open: \"O\",\n high: \"H\",\n low: \"L\",\n close: \"C\",\n change: \"\",\n volume: \"Vol\",\n limit: \"Limit\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alert\",\n scrollToRealtime: \"Scroll to the latest bar\",\n toggleIndicator: \"Show or hide {name}\",\n bars: \"{count} bars\",\n days: \"{count}d\",\n hours: \"{count}h\",\n minutes: \"{count}m\",\n chart: \"{symbol} price chart\",\n announcement: \"{time}: open {open}, high {high}, low {low}, close {close}\",\n },\n zh: {\n open: \"开\",\n high: \"高\",\n low: \"低\",\n close: \"收\",\n change: \"涨跌幅\",\n volume: \"成交量\",\n limit: \"限价\",\n position: \"持仓\",\n takeProfit: \"止盈\",\n stopLoss: \"止损\",\n alert: \"预警\",\n scrollToRealtime: \"回到最新 K 线\",\n toggleIndicator: \"显示或隐藏 {name}\",\n bars: \"{count} 根 K 线\",\n days: \"{count}天\",\n hours: \"{count}小时\",\n minutes: \"{count}分\",\n chart: \"{symbol} 价格图表\",\n announcement: \"{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}\",\n },\n ja: {\n open: \"始\",\n high: \"高\",\n low: \"安\",\n close: \"終\",\n change: \"騰落率\",\n volume: \"出来高\",\n limit: \"指値\",\n position: \"建玉\",\n takeProfit: \"利確\",\n stopLoss: \"損切\",\n alert: \"アラート\",\n scrollToRealtime: \"最新の足へ移動\",\n toggleIndicator: \"{name} の表示を切り替え\",\n bars: \"{count} 本\",\n days: \"{count}日\",\n hours: \"{count}時間\",\n minutes: \"{count}分\",\n chart: \"{symbol} 価格チャート\",\n announcement: \"{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}\",\n },\n fr: {\n open: \"O\",\n high: \"H\",\n low: \"B\",\n close: \"C\",\n change: \"Var.\",\n volume: \"Vol\",\n limit: \"Limite\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alerte\",\n scrollToRealtime: \"Revenir à la dernière bougie\",\n toggleIndicator: \"Afficher ou masquer {name}\",\n bars: \"{count} barres\",\n days: \"{count} j\",\n hours: \"{count} h\",\n minutes: \"{count} min\",\n chart: \"Graphique de cours {symbol}\",\n announcement:\n \"{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}\",\n },\n};\n\n/** `\"{count} bars\"` -> `\"24 bars\"` */\nexport const fill = (\n template: string,\n values: Record<string, string | number>,\n): string =>\n template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n"],"mappings":"AAQA,IAAaA,EAAgD,CAC3D,GAAI,CACF,KAAM,IACN,KAAM,IACN,IAAK,IACL,MAAO,IACP,OAAQ,GACR,OAAQ,MACR,MAAO,QACP,SAAU,WACV,WAAY,KACZ,SAAU,KACV,MAAO,QACP,iBAAkB,2BAClB,gBAAiB,sBACjB,KAAM,eACN,KAAM,WACN,MAAO,WACP,QAAS,WACT,MAAO,uBACP,aAAc,4DAChB,EACA,GAAI,CACF,KAAM,IACN,KAAM,IACN,IAAK,IACL,MAAO,IACP,OAAQ,MACR,OAAQ,MACR,MAAO,KACP,SAAU,KACV,WAAY,KACZ,SAAU,KACV,MAAO,KACP,iBAAkB,WAClB,gBAAiB,eACjB,KAAM,gBACN,KAAM,WACN,MAAO,YACP,QAAS,WACT,MAAO,gBACP,aAAc,gDAChB,EACA,GAAI,CACF,KAAM,IACN,KAAM,IACN,IAAK,IACL,MAAO,IACP,OAAQ,MACR,OAAQ,MACR,MAAO,KACP,SAAU,KACV,WAAY,KACZ,SAAU,KACV,MAAO,OACP,iBAAkB,UAClB,gBAAiB,kBACjB,KAAM,YACN,KAAM,WACN,MAAO,YACP,QAAS,WACT,MAAO,kBACP,aAAc,gDAChB,EACA,GAAI,CACF,KAAM,IACN,KAAM,IACN,IAAK,IACL,MAAO,IACP,OAAQ,OACR,OAAQ,MACR,MAAO,SACP,SAAU,WACV,WAAY,KACZ,SAAU,KACV,MAAO,SACP,iBAAkB,+BAClB,gBAAiB,6BACjB,KAAM,iBACN,KAAM,YACN,MAAO,YACP,QAAS,cACT,MAAO,8BACP,aACE,8EACJ,CACF,EAGaC,GACX,EACA,IAEAC,EAAS,QAAQ,cAAe,EAAO,IACrCC,KAAOC,EAAS,OAAOA,EAAOD,EAAI,EAAIE,CACxC"}
1
+ {"version":3,"file":"labels.cjs","names":["TRADING_LABELS","fill","template","key","values","match"],"sources":["../../../../../charts/src/engine/trading/labels.ts"],"sourcesContent":["// Built-in texts of the trading chart, per language (see ../locale.ts).\n\nimport type { LabelDictionary } from \"../locale\";\nimport type { TradingChartLabels } from \"./types\";\n\n/** Every text of the chart but the timeframe (taken from the options) */\nexport type TradingTexts = Required<Omit<TradingChartLabels, \"timeframe\">>;\n\nexport const TRADING_LABELS: LabelDictionary<TradingTexts> = {\n en: {\n open: \"O\",\n high: \"H\",\n low: \"L\",\n close: \"C\",\n change: \"\",\n volume: \"Vol\",\n limit: \"Limit\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alert\",\n scrollToRealtime: \"Scroll to the latest bar\",\n toggleIndicator: \"Show or hide {name}\",\n bars: \"{count} bars\",\n days: \"{count}d\",\n hours: \"{count}h\",\n minutes: \"{count}m\",\n chart: \"{symbol} price chart\",\n announcement: \"{time}: open {open}, high {high}, low {low}, close {close}\",\n ichimoku: \"Ichimoku\",\n supertrend: \"SuperTrend\",\n text: \"Text\",\n color: \"Color\",\n lineWidth: \"Line width\",\n lineStyle: \"Line style\",\n fill: \"Fill\",\n editText: \"Edit text\",\n lock: \"Lock\",\n remove: \"Delete\",\n target: \"Target {price} ({change})\",\n stop: \"Stop {price} ({change})\",\n riskReward: \"R:R {ratio}\",\n profit: \"P&L {value}\",\n long: \"Long\",\n short: \"Short\",\n replay: \"Replay · {time}\",\n replayHint: \"Click a bar to start the replay\",\n buyLimit: \"Buy limit {price}\",\n sellLimit: \"Sell limit {price}\",\n orderHint: \"Arrows move the price, Enter confirms, Escape cancels\",\n orderCancelHint: \"Delete cancels the order\",\n orderLine: \"{title} at {price}\",\n orderPlaced: \"Order placed at {price}\",\n orderCancelled: \"Order cancelled\",\n },\n zh: {\n open: \"开\",\n high: \"高\",\n low: \"低\",\n close: \"收\",\n change: \"涨跌幅\",\n volume: \"成交量\",\n limit: \"限价\",\n position: \"持仓\",\n takeProfit: \"止盈\",\n stopLoss: \"止损\",\n alert: \"预警\",\n scrollToRealtime: \"回到最新 K 线\",\n toggleIndicator: \"显示或隐藏 {name}\",\n bars: \"{count} 根 K 线\",\n days: \"{count}天\",\n hours: \"{count}小时\",\n minutes: \"{count}分\",\n chart: \"{symbol} 价格图表\",\n announcement: \"{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}\",\n ichimoku: \"一目均衡表\",\n supertrend: \"超级趋势\",\n text: \"文本\",\n color: \"颜色\",\n lineWidth: \"线宽\",\n lineStyle: \"线型\",\n fill: \"填充\",\n editText: \"编辑文本\",\n lock: \"锁定\",\n remove: \"删除\",\n target: \"止盈 {price}({change})\",\n stop: \"止损 {price}({change})\",\n riskReward: \"盈亏比 {ratio}\",\n profit: \"盈亏 {value}\",\n long: \"做多\",\n short: \"做空\",\n replay: \"回放 · {time}\",\n replayHint: \"点击一根 K 线开始回放\",\n buyLimit: \"限价买入 {price}\",\n sellLimit: \"限价卖出 {price}\",\n orderHint: \"方向键调整价格,回车确认,Esc 取消\",\n orderCancelHint: \"Delete 键撤销该订单\",\n orderLine: \"{title},价格 {price}\",\n orderPlaced: \"已在 {price} 下单\",\n orderCancelled: \"订单已取消\",\n },\n ja: {\n open: \"始\",\n high: \"高\",\n low: \"安\",\n close: \"終\",\n change: \"騰落率\",\n volume: \"出来高\",\n limit: \"指値\",\n position: \"建玉\",\n takeProfit: \"利確\",\n stopLoss: \"損切\",\n alert: \"アラート\",\n scrollToRealtime: \"最新の足へ移動\",\n toggleIndicator: \"{name} の表示を切り替え\",\n bars: \"{count} 本\",\n days: \"{count}日\",\n hours: \"{count}時間\",\n minutes: \"{count}分\",\n chart: \"{symbol} 価格チャート\",\n announcement: \"{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}\",\n ichimoku: \"一目均衡表\",\n supertrend: \"スーパートレンド\",\n text: \"テキスト\",\n color: \"色\",\n lineWidth: \"線の太さ\",\n lineStyle: \"線の種類\",\n fill: \"塗りつぶし\",\n editText: \"テキストを編集\",\n lock: \"ロック\",\n remove: \"削除\",\n target: \"利確 {price}({change})\",\n stop: \"損切 {price}({change})\",\n riskReward: \"リスクリワード {ratio}\",\n profit: \"損益 {value}\",\n long: \"ロング\",\n short: \"ショート\",\n replay: \"リプレイ · {time}\",\n replayHint: \"足をクリックしてリプレイを開始\",\n buyLimit: \"指値買い {price}\",\n sellLimit: \"指値売り {price}\",\n orderHint: \"矢印キーで価格を調整、Enter で確定、Esc で取消\",\n orderCancelHint: \"Delete キーで注文を取消\",\n orderLine: \"{title}、価格 {price}\",\n orderPlaced: \"{price} で注文しました\",\n orderCancelled: \"注文を取り消しました\",\n },\n fr: {\n open: \"O\",\n high: \"H\",\n low: \"B\",\n close: \"C\",\n change: \"Var.\",\n volume: \"Vol\",\n limit: \"Limite\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alerte\",\n scrollToRealtime: \"Revenir à la dernière bougie\",\n toggleIndicator: \"Afficher ou masquer {name}\",\n bars: \"{count} barres\",\n days: \"{count} j\",\n hours: \"{count} h\",\n minutes: \"{count} min\",\n chart: \"Graphique de cours {symbol}\",\n announcement:\n \"{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}\",\n ichimoku: \"Ichimoku\",\n supertrend: \"SuperTrend\",\n text: \"Texte\",\n color: \"Couleur\",\n lineWidth: \"Épaisseur\",\n lineStyle: \"Style de trait\",\n fill: \"Remplissage\",\n editText: \"Modifier le texte\",\n lock: \"Verrouiller\",\n remove: \"Supprimer\",\n target: \"Objectif {price} ({change})\",\n stop: \"Stop {price} ({change})\",\n riskReward: \"R/R {ratio}\",\n profit: \"P&L {value}\",\n long: \"Achat\",\n short: \"Vente\",\n replay: \"Relecture · {time}\",\n replayHint: \"Cliquez sur une barre pour lancer la relecture\",\n buyLimit: \"Achat limite {price}\",\n sellLimit: \"Vente limite {price}\",\n orderHint: \"Les flèches déplacent le prix, Entrée valide, Échap annule\",\n orderCancelHint: \"Suppr annule l’ordre\",\n orderLine: \"{title} à {price}\",\n orderPlaced: \"Ordre placé à {price}\",\n orderCancelled: \"Ordre annulé\",\n },\n};\n\n/** `\"{count} bars\"` -> `\"24 bars\"` */\nexport const fill = (\n template: string,\n values: Record<string, string | number>,\n): string =>\n template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n"],"mappings":"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"}
@@ -19,7 +19,32 @@ var e = {
19
19
  hours: "{count}h",
20
20
  minutes: "{count}m",
21
21
  chart: "{symbol} price chart",
22
- announcement: "{time}: open {open}, high {high}, low {low}, close {close}"
22
+ announcement: "{time}: open {open}, high {high}, low {low}, close {close}",
23
+ ichimoku: "Ichimoku",
24
+ supertrend: "SuperTrend",
25
+ text: "Text",
26
+ color: "Color",
27
+ lineWidth: "Line width",
28
+ lineStyle: "Line style",
29
+ fill: "Fill",
30
+ editText: "Edit text",
31
+ lock: "Lock",
32
+ remove: "Delete",
33
+ target: "Target {price} ({change})",
34
+ stop: "Stop {price} ({change})",
35
+ riskReward: "R:R {ratio}",
36
+ profit: "P&L {value}",
37
+ long: "Long",
38
+ short: "Short",
39
+ replay: "Replay · {time}",
40
+ replayHint: "Click a bar to start the replay",
41
+ buyLimit: "Buy limit {price}",
42
+ sellLimit: "Sell limit {price}",
43
+ orderHint: "Arrows move the price, Enter confirms, Escape cancels",
44
+ orderCancelHint: "Delete cancels the order",
45
+ orderLine: "{title} at {price}",
46
+ orderPlaced: "Order placed at {price}",
47
+ orderCancelled: "Order cancelled"
23
48
  },
24
49
  zh: {
25
50
  open: "开",
@@ -40,7 +65,32 @@ var e = {
40
65
  hours: "{count}小时",
41
66
  minutes: "{count}分",
42
67
  chart: "{symbol} 价格图表",
43
- announcement: "{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}"
68
+ announcement: "{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}",
69
+ ichimoku: "一目均衡表",
70
+ supertrend: "超级趋势",
71
+ text: "文本",
72
+ color: "颜色",
73
+ lineWidth: "线宽",
74
+ lineStyle: "线型",
75
+ fill: "填充",
76
+ editText: "编辑文本",
77
+ lock: "锁定",
78
+ remove: "删除",
79
+ target: "止盈 {price}({change})",
80
+ stop: "止损 {price}({change})",
81
+ riskReward: "盈亏比 {ratio}",
82
+ profit: "盈亏 {value}",
83
+ long: "做多",
84
+ short: "做空",
85
+ replay: "回放 · {time}",
86
+ replayHint: "点击一根 K 线开始回放",
87
+ buyLimit: "限价买入 {price}",
88
+ sellLimit: "限价卖出 {price}",
89
+ orderHint: "方向键调整价格,回车确认,Esc 取消",
90
+ orderCancelHint: "Delete 键撤销该订单",
91
+ orderLine: "{title},价格 {price}",
92
+ orderPlaced: "已在 {price} 下单",
93
+ orderCancelled: "订单已取消"
44
94
  },
45
95
  ja: {
46
96
  open: "始",
@@ -61,7 +111,32 @@ var e = {
61
111
  hours: "{count}時間",
62
112
  minutes: "{count}分",
63
113
  chart: "{symbol} 価格チャート",
64
- announcement: "{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}"
114
+ announcement: "{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}",
115
+ ichimoku: "一目均衡表",
116
+ supertrend: "スーパートレンド",
117
+ text: "テキスト",
118
+ color: "色",
119
+ lineWidth: "線の太さ",
120
+ lineStyle: "線の種類",
121
+ fill: "塗りつぶし",
122
+ editText: "テキストを編集",
123
+ lock: "ロック",
124
+ remove: "削除",
125
+ target: "利確 {price}({change})",
126
+ stop: "損切 {price}({change})",
127
+ riskReward: "リスクリワード {ratio}",
128
+ profit: "損益 {value}",
129
+ long: "ロング",
130
+ short: "ショート",
131
+ replay: "リプレイ · {time}",
132
+ replayHint: "足をクリックしてリプレイを開始",
133
+ buyLimit: "指値買い {price}",
134
+ sellLimit: "指値売り {price}",
135
+ orderHint: "矢印キーで価格を調整、Enter で確定、Esc で取消",
136
+ orderCancelHint: "Delete キーで注文を取消",
137
+ orderLine: "{title}、価格 {price}",
138
+ orderPlaced: "{price} で注文しました",
139
+ orderCancelled: "注文を取り消しました"
65
140
  },
66
141
  fr: {
67
142
  open: "O",
@@ -82,7 +157,32 @@ var e = {
82
157
  hours: "{count} h",
83
158
  minutes: "{count} min",
84
159
  chart: "Graphique de cours {symbol}",
85
- announcement: "{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}"
160
+ announcement: "{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}",
161
+ ichimoku: "Ichimoku",
162
+ supertrend: "SuperTrend",
163
+ text: "Texte",
164
+ color: "Couleur",
165
+ lineWidth: "Épaisseur",
166
+ lineStyle: "Style de trait",
167
+ fill: "Remplissage",
168
+ editText: "Modifier le texte",
169
+ lock: "Verrouiller",
170
+ remove: "Supprimer",
171
+ target: "Objectif {price} ({change})",
172
+ stop: "Stop {price} ({change})",
173
+ riskReward: "R/R {ratio}",
174
+ profit: "P&L {value}",
175
+ long: "Achat",
176
+ short: "Vente",
177
+ replay: "Relecture · {time}",
178
+ replayHint: "Cliquez sur une barre pour lancer la relecture",
179
+ buyLimit: "Achat limite {price}",
180
+ sellLimit: "Vente limite {price}",
181
+ orderHint: "Les flèches déplacent le prix, Entrée valide, Échap annule",
182
+ orderCancelHint: "Suppr annule l’ordre",
183
+ orderLine: "{title} à {price}",
184
+ orderPlaced: "Ordre placé à {price}",
185
+ orderCancelled: "Ordre annulé"
86
186
  }
87
187
  }, t = (e, t) => e.replace(/\{(\w+)\}/g, (e, n) => n in t ? String(t[n]) : e);
88
188
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"labels.js","names":["TRADING_LABELS","fill","template","key","values","match"],"sources":["../../../../../charts/src/engine/trading/labels.ts"],"sourcesContent":["// Built-in texts of the trading chart, per language (see ../locale.ts).\n\nimport type { LabelDictionary } from \"../locale\";\nimport type { TradingChartLabels } from \"./types\";\n\n/** Every text of the chart but the timeframe (taken from the options) */\nexport type TradingTexts = Required<Omit<TradingChartLabels, \"timeframe\">>;\n\nexport const TRADING_LABELS: LabelDictionary<TradingTexts> = {\n en: {\n open: \"O\",\n high: \"H\",\n low: \"L\",\n close: \"C\",\n change: \"\",\n volume: \"Vol\",\n limit: \"Limit\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alert\",\n scrollToRealtime: \"Scroll to the latest bar\",\n toggleIndicator: \"Show or hide {name}\",\n bars: \"{count} bars\",\n days: \"{count}d\",\n hours: \"{count}h\",\n minutes: \"{count}m\",\n chart: \"{symbol} price chart\",\n announcement: \"{time}: open {open}, high {high}, low {low}, close {close}\",\n },\n zh: {\n open: \"开\",\n high: \"高\",\n low: \"低\",\n close: \"收\",\n change: \"涨跌幅\",\n volume: \"成交量\",\n limit: \"限价\",\n position: \"持仓\",\n takeProfit: \"止盈\",\n stopLoss: \"止损\",\n alert: \"预警\",\n scrollToRealtime: \"回到最新 K 线\",\n toggleIndicator: \"显示或隐藏 {name}\",\n bars: \"{count} 根 K 线\",\n days: \"{count}天\",\n hours: \"{count}小时\",\n minutes: \"{count}分\",\n chart: \"{symbol} 价格图表\",\n announcement: \"{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}\",\n },\n ja: {\n open: \"始\",\n high: \"高\",\n low: \"安\",\n close: \"終\",\n change: \"騰落率\",\n volume: \"出来高\",\n limit: \"指値\",\n position: \"建玉\",\n takeProfit: \"利確\",\n stopLoss: \"損切\",\n alert: \"アラート\",\n scrollToRealtime: \"最新の足へ移動\",\n toggleIndicator: \"{name} の表示を切り替え\",\n bars: \"{count} 本\",\n days: \"{count}日\",\n hours: \"{count}時間\",\n minutes: \"{count}分\",\n chart: \"{symbol} 価格チャート\",\n announcement: \"{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}\",\n },\n fr: {\n open: \"O\",\n high: \"H\",\n low: \"B\",\n close: \"C\",\n change: \"Var.\",\n volume: \"Vol\",\n limit: \"Limite\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alerte\",\n scrollToRealtime: \"Revenir à la dernière bougie\",\n toggleIndicator: \"Afficher ou masquer {name}\",\n bars: \"{count} barres\",\n days: \"{count} j\",\n hours: \"{count} h\",\n minutes: \"{count} min\",\n chart: \"Graphique de cours {symbol}\",\n announcement:\n \"{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}\",\n },\n};\n\n/** `\"{count} bars\"` -> `\"24 bars\"` */\nexport const fill = (\n template: string,\n values: Record<string, string | number>,\n): string =>\n template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n"],"mappings":";AAQA,IAAaA,IAAgD;CAC3D,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cAAc;CAChB;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cAAc;CAChB;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cAAc;CAChB;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cACE;CACJ;AACF,GAGaC,KACX,GACA,MAEAC,EAAS,QAAQ,eAAe,GAAO,MACrCC,KAAOC,IAAS,OAAOA,EAAOD,EAAI,IAAIE,CACxC"}
1
+ {"version":3,"file":"labels.js","names":["TRADING_LABELS","fill","template","key","values","match"],"sources":["../../../../../charts/src/engine/trading/labels.ts"],"sourcesContent":["// Built-in texts of the trading chart, per language (see ../locale.ts).\n\nimport type { LabelDictionary } from \"../locale\";\nimport type { TradingChartLabels } from \"./types\";\n\n/** Every text of the chart but the timeframe (taken from the options) */\nexport type TradingTexts = Required<Omit<TradingChartLabels, \"timeframe\">>;\n\nexport const TRADING_LABELS: LabelDictionary<TradingTexts> = {\n en: {\n open: \"O\",\n high: \"H\",\n low: \"L\",\n close: \"C\",\n change: \"\",\n volume: \"Vol\",\n limit: \"Limit\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alert\",\n scrollToRealtime: \"Scroll to the latest bar\",\n toggleIndicator: \"Show or hide {name}\",\n bars: \"{count} bars\",\n days: \"{count}d\",\n hours: \"{count}h\",\n minutes: \"{count}m\",\n chart: \"{symbol} price chart\",\n announcement: \"{time}: open {open}, high {high}, low {low}, close {close}\",\n ichimoku: \"Ichimoku\",\n supertrend: \"SuperTrend\",\n text: \"Text\",\n color: \"Color\",\n lineWidth: \"Line width\",\n lineStyle: \"Line style\",\n fill: \"Fill\",\n editText: \"Edit text\",\n lock: \"Lock\",\n remove: \"Delete\",\n target: \"Target {price} ({change})\",\n stop: \"Stop {price} ({change})\",\n riskReward: \"R:R {ratio}\",\n profit: \"P&L {value}\",\n long: \"Long\",\n short: \"Short\",\n replay: \"Replay · {time}\",\n replayHint: \"Click a bar to start the replay\",\n buyLimit: \"Buy limit {price}\",\n sellLimit: \"Sell limit {price}\",\n orderHint: \"Arrows move the price, Enter confirms, Escape cancels\",\n orderCancelHint: \"Delete cancels the order\",\n orderLine: \"{title} at {price}\",\n orderPlaced: \"Order placed at {price}\",\n orderCancelled: \"Order cancelled\",\n },\n zh: {\n open: \"开\",\n high: \"高\",\n low: \"低\",\n close: \"收\",\n change: \"涨跌幅\",\n volume: \"成交量\",\n limit: \"限价\",\n position: \"持仓\",\n takeProfit: \"止盈\",\n stopLoss: \"止损\",\n alert: \"预警\",\n scrollToRealtime: \"回到最新 K 线\",\n toggleIndicator: \"显示或隐藏 {name}\",\n bars: \"{count} 根 K 线\",\n days: \"{count}天\",\n hours: \"{count}小时\",\n minutes: \"{count}分\",\n chart: \"{symbol} 价格图表\",\n announcement: \"{time}:开盘 {open},最高 {high},最低 {low},收盘 {close}\",\n ichimoku: \"一目均衡表\",\n supertrend: \"超级趋势\",\n text: \"文本\",\n color: \"颜色\",\n lineWidth: \"线宽\",\n lineStyle: \"线型\",\n fill: \"填充\",\n editText: \"编辑文本\",\n lock: \"锁定\",\n remove: \"删除\",\n target: \"止盈 {price}({change})\",\n stop: \"止损 {price}({change})\",\n riskReward: \"盈亏比 {ratio}\",\n profit: \"盈亏 {value}\",\n long: \"做多\",\n short: \"做空\",\n replay: \"回放 · {time}\",\n replayHint: \"点击一根 K 线开始回放\",\n buyLimit: \"限价买入 {price}\",\n sellLimit: \"限价卖出 {price}\",\n orderHint: \"方向键调整价格,回车确认,Esc 取消\",\n orderCancelHint: \"Delete 键撤销该订单\",\n orderLine: \"{title},价格 {price}\",\n orderPlaced: \"已在 {price} 下单\",\n orderCancelled: \"订单已取消\",\n },\n ja: {\n open: \"始\",\n high: \"高\",\n low: \"安\",\n close: \"終\",\n change: \"騰落率\",\n volume: \"出来高\",\n limit: \"指値\",\n position: \"建玉\",\n takeProfit: \"利確\",\n stopLoss: \"損切\",\n alert: \"アラート\",\n scrollToRealtime: \"最新の足へ移動\",\n toggleIndicator: \"{name} の表示を切り替え\",\n bars: \"{count} 本\",\n days: \"{count}日\",\n hours: \"{count}時間\",\n minutes: \"{count}分\",\n chart: \"{symbol} 価格チャート\",\n announcement: \"{time}:始値 {open}、高値 {high}、安値 {low}、終値 {close}\",\n ichimoku: \"一目均衡表\",\n supertrend: \"スーパートレンド\",\n text: \"テキスト\",\n color: \"色\",\n lineWidth: \"線の太さ\",\n lineStyle: \"線の種類\",\n fill: \"塗りつぶし\",\n editText: \"テキストを編集\",\n lock: \"ロック\",\n remove: \"削除\",\n target: \"利確 {price}({change})\",\n stop: \"損切 {price}({change})\",\n riskReward: \"リスクリワード {ratio}\",\n profit: \"損益 {value}\",\n long: \"ロング\",\n short: \"ショート\",\n replay: \"リプレイ · {time}\",\n replayHint: \"足をクリックしてリプレイを開始\",\n buyLimit: \"指値買い {price}\",\n sellLimit: \"指値売り {price}\",\n orderHint: \"矢印キーで価格を調整、Enter で確定、Esc で取消\",\n orderCancelHint: \"Delete キーで注文を取消\",\n orderLine: \"{title}、価格 {price}\",\n orderPlaced: \"{price} で注文しました\",\n orderCancelled: \"注文を取り消しました\",\n },\n fr: {\n open: \"O\",\n high: \"H\",\n low: \"B\",\n close: \"C\",\n change: \"Var.\",\n volume: \"Vol\",\n limit: \"Limite\",\n position: \"Position\",\n takeProfit: \"TP\",\n stopLoss: \"SL\",\n alert: \"Alerte\",\n scrollToRealtime: \"Revenir à la dernière bougie\",\n toggleIndicator: \"Afficher ou masquer {name}\",\n bars: \"{count} barres\",\n days: \"{count} j\",\n hours: \"{count} h\",\n minutes: \"{count} min\",\n chart: \"Graphique de cours {symbol}\",\n announcement:\n \"{time} : ouverture {open}, plus haut {high}, plus bas {low}, clôture {close}\",\n ichimoku: \"Ichimoku\",\n supertrend: \"SuperTrend\",\n text: \"Texte\",\n color: \"Couleur\",\n lineWidth: \"Épaisseur\",\n lineStyle: \"Style de trait\",\n fill: \"Remplissage\",\n editText: \"Modifier le texte\",\n lock: \"Verrouiller\",\n remove: \"Supprimer\",\n target: \"Objectif {price} ({change})\",\n stop: \"Stop {price} ({change})\",\n riskReward: \"R/R {ratio}\",\n profit: \"P&L {value}\",\n long: \"Achat\",\n short: \"Vente\",\n replay: \"Relecture · {time}\",\n replayHint: \"Cliquez sur une barre pour lancer la relecture\",\n buyLimit: \"Achat limite {price}\",\n sellLimit: \"Vente limite {price}\",\n orderHint: \"Les flèches déplacent le prix, Entrée valide, Échap annule\",\n orderCancelHint: \"Suppr annule l’ordre\",\n orderLine: \"{title} à {price}\",\n orderPlaced: \"Ordre placé à {price}\",\n orderCancelled: \"Ordre annulé\",\n },\n};\n\n/** `\"{count} bars\"` -> `\"24 bars\"` */\nexport const fill = (\n template: string,\n values: Record<string, string | number>,\n): string =>\n template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n"],"mappings":";AAQA,IAAaA,IAAgD;CAC3D,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cAAc;EACd,UAAU;EACV,YAAY;EACZ,MAAM;EACN,OAAO;EACP,WAAW;EACX,WAAW;EACX,MAAM;EACN,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,UAAU;EACV,WAAW;EACX,WAAW;EACX,iBAAiB;EACjB,WAAW;EACX,aAAa;EACb,gBAAgB;CAClB;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cAAc;EACd,UAAU;EACV,YAAY;EACZ,MAAM;EACN,OAAO;EACP,WAAW;EACX,WAAW;EACX,MAAM;EACN,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,UAAU;EACV,WAAW;EACX,WAAW;EACX,iBAAiB;EACjB,WAAW;EACX,aAAa;EACb,gBAAgB;CAClB;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cAAc;EACd,UAAU;EACV,YAAY;EACZ,MAAM;EACN,OAAO;EACP,WAAW;EACX,WAAW;EACX,MAAM;EACN,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,UAAU;EACV,WAAW;EACX,WAAW;EACX,iBAAiB;EACjB,WAAW;EACX,aAAa;EACb,gBAAgB;CAClB;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,UAAU;EACV,OAAO;EACP,kBAAkB;EAClB,iBAAiB;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,SAAS;EACT,OAAO;EACP,cACE;EACF,UAAU;EACV,YAAY;EACZ,MAAM;EACN,OAAO;EACP,WAAW;EACX,WAAW;EACX,MAAM;EACN,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,MAAM;EACN,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,UAAU;EACV,WAAW;EACX,WAAW;EACX,iBAAiB;EACjB,WAAW;EACX,aAAa;EACb,gBAAgB;CAClB;AACF,GAGaC,KACX,GACA,MAEAC,EAAS,QAAQ,eAAe,GAAO,MACrCC,KAAOC,IAAS,OAAOA,EAAOD,EAAI,IAAIE,CACxC"}
@@ -1,2 +1,2 @@
1
- var e=[`time`,`open`,`high`,`low`,`close`,`volume`],t=e=>!Array.isArray(e),n=e=>t(e)?Math.min(e.time.length,e.open.length,e.high.length,e.low.length,e.close.length):e.length,r=e=>({time:new Float64Array(e),open:new Float64Array(e),high:new Float64Array(e),low:new Float64Array(e),close:new Float64Array(e),volume:new Float64Array(e)}),i=()=>({...r(16),length:0,capacity:16,hasVolume:!1}),a=(t,n)=>{if(n<=t.capacity)return;let i=t.capacity;for(;i<n;)i*=2;let a=r(i);for(let n of e)a[n].set(t[n].subarray(0,t.length));Object.assign(t,a),t.capacity=i},o=(e,n,r,i)=>{if(t(n)){for(let t=0;t<i;t++)e.time[r+t]=n.time[t],e.open[r+t]=n.open[t],e.high[r+t]=n.high[t],e.low[r+t]=n.low[t],e.close[r+t]=n.close[t];let t=n.volume;if(t){for(let n=0;n<i;n++){let i=t[n];e.volume[r+n]=Number.isFinite(i)?i:0}e.hasVolume=!0}else e.volume.fill(0,r,r+i);return}for(let t=0;t<i;t++)s(e,r+t,n[t])},s=(e,t,n)=>{e.time[t]=n.time,e.open[t]=n.open,e.high[t]=n.high,e.low[t]=n.low,e.close[t]=n.close;let r=n.volume;r!==void 0&&Number.isFinite(r)?(e.volume[t]=r,e.hasVolume=!0):e.volume[t]=0},c=(e,t)=>{let r=n(t);e.length=0,e.hasVolume=!1,a(e,r),o(e,t,0,r),e.length=r},l=(e,t)=>{let r=n(t),i=-1;for(let n=0;n<r;n++){let r=d(e,u(t,n));r>=0&&(i<0||r<i)&&(i=r)}return i},u=(e,n)=>t(e)?{time:e.time[n],open:e.open[n],high:e.high[n],low:e.low[n],close:e.close[n],...e.volume?{volume:e.volume[n]}:{}}:e[n],d=(e,t)=>{let n=e.length;if(!Number.isFinite(t.time))return-1;if(n>0){let r=e.time[n-1];if(t.time<r)return-1;if(t.time===r)return s(e,n-1,t),n-1}return a(e,n+1),s(e,n,t),e.length=n+1,n},f=(r,i)=>{let s=n(i),c=r.length?r.time[0]:1/0,l=0,u=t(i)?i.time:null;for(;l<s&&(u?u[l]:i[l].time)<c;)l++;if(!l)return 0;let d=r.length,f={time:r.time.slice(0,d),open:r.open.slice(0,d),high:r.high.slice(0,d),low:r.low.slice(0,d),close:r.close.slice(0,d),volume:r.volume.slice(0,d)};r.length=0,a(r,d+l),o(r,i,0,l);for(let t of e)r[t].set(f[t],l);return r.length=d+l,l},p=(e,t)=>({time:e.time[t],open:e.open[t],high:e.high[t],low:e.low[t],close:e.close[t],volume:e.volume[t]}),m=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t]<n?r=t+1:i=t}return r},h=(e,t,n)=>{let r=m(e,t,n);return r<t&&e[r]===n?r:Math.max(0,r-1)},g=()=>({levels:[]}),_=(t,n,i,a)=>{let o=2**a,s=Math.ceil(i/o),c=t.levels[a];if(!c||c.time.length<s){let n={...r(Math.max(16,Math.ceil(s*1.5))),size:o,valid:0};if(c){for(let t of e)n[t].set(c[t].subarray(0,c.valid));n.valid=c.valid}c=n,t.levels[a]=c}if(c.valid>=s)return c;let l=a>1?_(t,n,i,a-1):n,u=a>1?Math.ceil(i/(o/2)):i,d=Math.max(0,Math.min(c.valid,s-1));for(let e=d;e<s;e++){let t=e*2,n=t+1;c.time[e]=l.time[t],c.open[e]=l.open[t],n<u?(c.high[e]=Math.max(l.high[t],l.high[n]),c.low[e]=Math.min(l.low[t],l.low[n]),c.close[e]=l.close[n],c.volume[e]=l.volume[t]+l.volume[n]):(c.high[e]=l.high[t],c.low[e]=l.low[t],c.close[e]=l.close[t],c.volume[e]=l.volume[t])}return c.valid=i%o===0?s:s-1,c};exports.appendBars=l,exports.barAt=u,exports.createPyramid=g,exports.createStore=i,exports.indexOfTime=h,exports.inputLength=n,exports.lowerBoundTime=m,exports.prependBars=f,exports.pyramidLevel=_,exports.readBar=p,exports.setBars=c,exports.updateBar=d;
1
+ var e=[`time`,`open`,`high`,`low`,`close`,`volume`],t=e=>!Array.isArray(e),n=e=>t(e)?Math.min(e.time.length,e.open.length,e.high.length,e.low.length,e.close.length):e.length,r=e=>({time:new Float64Array(e),open:new Float64Array(e),high:new Float64Array(e),low:new Float64Array(e),close:new Float64Array(e),volume:new Float64Array(e)}),i=()=>({...r(16),length:0,capacity:16,hasVolume:!1}),a=(t,n)=>{if(n<=t.capacity)return;let i=t.capacity;for(;i<n;)i*=2;let a=r(i);for(let n of e)a[n].set(t[n].subarray(0,t.length));Object.assign(t,a),t.capacity=i},o=(e,n,r,i)=>{if(t(n)){for(let t=0;t<i;t++)e.time[r+t]=n.time[t],e.open[r+t]=n.open[t],e.high[r+t]=n.high[t],e.low[r+t]=n.low[t],e.close[r+t]=n.close[t];let t=n.volume;if(t){for(let n=0;n<i;n++){let i=t[n];e.volume[r+n]=Number.isFinite(i)?i:0}e.hasVolume=!0}else e.volume.fill(0,r,r+i);return}for(let t=0;t<i;t++)s(e,r+t,n[t])},s=(e,t,n)=>{e.time[t]=n.time,e.open[t]=n.open,e.high[t]=n.high,e.low[t]=n.low,e.close[t]=n.close;let r=n.volume;r!==void 0&&Number.isFinite(r)?(e.volume[t]=r,e.hasVolume=!0):e.volume[t]=0},c=(e,t)=>{let r=n(t);e.length=0,e.hasVolume=!1,a(e,r),o(e,t,0,r),e.length=r},l=(e,t)=>{let r=n(t),i=-1;for(let n=0;n<r;n++){let r=d(e,u(t,n));r>=0&&(i<0||r<i)&&(i=r)}return i},u=(e,n)=>t(e)?{time:e.time[n],open:e.open[n],high:e.high[n],low:e.low[n],close:e.close[n],...e.volume?{volume:e.volume[n]}:{}}:e[n],d=(e,t)=>{let n=e.length;if(!Number.isFinite(t.time))return-1;if(n>0){let r=e.time[n-1];if(t.time<r)return-1;if(t.time===r)return s(e,n-1,t),n-1}return a(e,n+1),s(e,n,t),e.length=n+1,n},f=(r,i)=>{let s=n(i),c=r.length?r.time[0]:1/0,l=0,u=t(i)?i.time:null;for(;l<s&&(u?u[l]:i[l].time)<c;)l++;if(!l)return 0;let d=r.length,f={time:r.time.slice(0,d),open:r.open.slice(0,d),high:r.high.slice(0,d),low:r.low.slice(0,d),close:r.close.slice(0,d),volume:r.volume.slice(0,d)};r.length=0,a(r,d+l),o(r,i,0,l);for(let t of e)r[t].set(f[t],l);return r.length=d+l,l},p=(e,t)=>({time:e.time[t],open:e.open[t],high:e.high[t],low:e.low[t],close:e.close[t],volume:e.volume[t]}),m=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t]<n?r=t+1:i=t}return r},h=(e,t,n)=>{let r=m(e,t,n);return r<t&&e[r]===n?r:Math.max(0,r-1)},g=()=>({levels:[]}),_=(t,n,i,a)=>{let o=2**a,s=Math.ceil(i/o),c=t.levels[a];if(!c||c.time.length<s){let n={...r(Math.max(16,Math.ceil(s*1.5))),size:o,valid:0};if(c){for(let t of e)n[t].set(c[t].subarray(0,c.valid));n.valid=c.valid}c=n,t.levels[a]=c}if(c.valid>=s)return c;let l=a>1?_(t,n,i,a-1):n,u=a>1?Math.ceil(i/(o/2)):i,d=Math.max(0,Math.min(c.valid,s-1));for(let e=d;e<s;e++){let t=e*2,n=t+1;c.time[e]=l.time[t],c.open[e]=l.open[t],n<u?(c.high[e]=Math.max(l.high[t],l.high[n]),c.low[e]=Math.min(l.low[t],l.low[n]),c.close[e]=l.close[n],c.volume[e]=l.volume[t]+l.volume[n]):(c.high[e]=l.high[t],c.low[e]=l.low[t],c.close[e]=l.close[t],c.volume[e]=l.volume[t])}return c.valid=i%o===0?s:s-1,c},v=()=>({levels:[]}),y=(e,t)=>{for(let n of e.levels)n&&(n.valid=Math.min(n.valid,Math.floor(t/n.size)))},b=(e,t)=>Number.isFinite(e)?Number.isFinite(t)?e<t?e:t:e:t,x=(e,t)=>Number.isFinite(e)?Number.isFinite(t)?e>t?e:t:e:t,S=(e,t,n,r)=>{let i=2**r,a=Math.ceil(n/i),o=e.levels[r];if(!o||o.min.length<a){let t=Math.max(16,Math.ceil(a*1.5)),n={size:i,min:new Float64Array(t),max:new Float64Array(t),last:new Float64Array(t),valid:0};o&&(n.min.set(o.min.subarray(0,o.valid)),n.max.set(o.max.subarray(0,o.valid)),n.last.set(o.last.subarray(0,o.valid)),n.valid=o.valid),o=n,e.levels[r]=o}if(o.valid>=a)return o;let s=r>1?S(e,t,n,r-1):null,c=r>1?Math.ceil(n/(i/2)):n,l=Math.max(0,Math.min(o.valid,a-1));for(let e=l;e<a;e++){let n=e*2,r=n+1,i=r<c,a=s?s.min[n]:t[n],l=s?s.max[n]:t[n],u=s?s.last[n]:t[n],d=i?s?s.min[r]:t[r]:NaN,f=i?s?s.max[r]:t[r]:NaN,p=i?s?s.last[r]:t[r]:NaN;o.min[e]=b(a,d),o.max[e]=x(l,f),o.last[e]=Number.isFinite(p)?p:u}return o.valid=n%i===0?a:a-1,o};exports.appendBars=l,exports.barAt=u,exports.createPyramid=g,exports.createRangePyramid=v,exports.createStore=i,exports.indexOfTime=h,exports.inputLength=n,exports.invalidateRangePyramid=y,exports.lowerBoundTime=m,exports.prependBars=f,exports.pyramidLevel=_,exports.rangeLevel=S,exports.readBar=p,exports.setBars=c,exports.updateBar=d;
2
2
  //# sourceMappingURL=store.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.cjs","names":["KEYS","isColumns","bars","inputLength","allocate","capacity","createStore","reserve","size","store","next","key","write","i","count","at","volume","v","writeBar","bar","setBars","n","appendBars","first","updateBar","barAt","last","prependBars","time","length","previous","readBar","columns","lowerBoundTime","lo","hi","mid","value","indexOfTime","createPyramid","pyramidLevel","k","groups","level","pyramid","prev","src","prevCount","from","g","a","b"],"sources":["../../../../../charts/src/engine/trading/store.ts"],"sourcesContent":["// Bars in growable Float64Array columns, and a pyramid of aggregated\n// levels (2, 4, 8, ... bars per group) drawn when the chart is zoomed out\n// so far that a bar is narrower than a pixel: a million bars cost the\n// same to draw as a thousand.\n\nimport type { TradingBar, TradingBarColumns, TradingBarsInput } from \"./types\";\n\n/** OHLCV columns; only the first `length` entries are meaningful */\nexport interface OhlcColumns {\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n volume: Float64Array;\n}\n\nexport interface BarStore extends OhlcColumns {\n length: number;\n /** Size of the columns */\n capacity: number;\n /** Some bar has a volume */\n hasVolume: boolean;\n}\n\nconst KEYS = [\"time\", \"open\", \"high\", \"low\", \"close\", \"volume\"] as const;\n\nconst isColumns = (bars: TradingBarsInput): bars is TradingBarColumns =>\n !Array.isArray(bars);\n\nexport const inputLength = (bars: TradingBarsInput): number =>\n isColumns(bars)\n ? Math.min(\n bars.time.length,\n bars.open.length,\n bars.high.length,\n bars.low.length,\n bars.close.length,\n )\n : bars.length;\n\nconst allocate = (capacity: number): OhlcColumns => ({\n time: new Float64Array(capacity),\n open: new Float64Array(capacity),\n high: new Float64Array(capacity),\n low: new Float64Array(capacity),\n close: new Float64Array(capacity),\n volume: new Float64Array(capacity),\n});\n\nexport const createStore = (): BarStore => ({\n ...allocate(16),\n length: 0,\n capacity: 16,\n hasVolume: false,\n});\n\n/** Grows the columns to hold at least `size` bars (doubling) */\nconst reserve = (store: BarStore, size: number) => {\n if (size <= store.capacity) return;\n let capacity = store.capacity;\n while (capacity < size) capacity *= 2;\n const next = allocate(capacity);\n for (const key of KEYS) next[key].set(store[key].subarray(0, store.length));\n Object.assign(store, next);\n store.capacity = capacity;\n};\n\n/** Writes `count` bars of `bars` at `at` */\nconst write = (\n store: BarStore,\n bars: TradingBarsInput,\n at: number,\n count: number,\n) => {\n if (isColumns(bars)) {\n for (let i = 0; i < count; i++) {\n store.time[at + i] = bars.time[i];\n store.open[at + i] = bars.open[i];\n store.high[at + i] = bars.high[i];\n store.low[at + i] = bars.low[i];\n store.close[at + i] = bars.close[i];\n }\n const volume = bars.volume;\n if (volume) {\n for (let i = 0; i < count; i++) {\n const v = volume[i];\n store.volume[at + i] = Number.isFinite(v) ? v : 0;\n }\n store.hasVolume = true;\n } else {\n store.volume.fill(0, at, at + count);\n }\n return;\n }\n for (let i = 0; i < count; i++) writeBar(store, at + i, bars[i]);\n};\n\nconst writeBar = (store: BarStore, i: number, bar: TradingBar) => {\n store.time[i] = bar.time;\n store.open[i] = bar.open;\n store.high[i] = bar.high;\n store.low[i] = bar.low;\n store.close[i] = bar.close;\n const v = bar.volume;\n if (v !== undefined && Number.isFinite(v)) {\n store.volume[i] = v;\n store.hasVolume = true;\n } else {\n store.volume[i] = 0;\n }\n};\n\n/** Replaces every bar */\nexport const setBars = (store: BarStore, bars: TradingBarsInput): void => {\n const n = inputLength(bars);\n store.length = 0;\n store.hasVolume = false;\n reserve(store, n);\n write(store, bars, 0, n);\n store.length = n;\n};\n\n/**\n * Appends the bars newer than the last one (a bar at the time of the last\n * one replaces it). Returns the index of the first changed bar, or -1.\n */\nexport const appendBars = (store: BarStore, bars: TradingBarsInput): number => {\n const n = inputLength(bars);\n let first = -1;\n for (let i = 0; i < n; i++) {\n const at = updateBar(store, barAt(bars, i));\n if (at >= 0 && (first < 0 || at < first)) first = at;\n }\n return first;\n};\n\n/** The `i`-th bar of an input */\nexport const barAt = (bars: TradingBarsInput, i: number): TradingBar => {\n if (!isColumns(bars)) return bars[i];\n return {\n time: bars.time[i],\n open: bars.open[i],\n high: bars.high[i],\n low: bars.low[i],\n close: bars.close[i],\n ...(bars.volume ? { volume: bars.volume[i] } : {}),\n };\n};\n\n/**\n * Streams a bar: replaces the last bar at the same time, appends a newer\n * one. Returns its index; -1 (ignored) when older than the last bar.\n */\nexport const updateBar = (store: BarStore, bar: TradingBar): number => {\n const n = store.length;\n if (!Number.isFinite(bar.time)) return -1;\n if (n > 0) {\n const last = store.time[n - 1];\n if (bar.time < last) return -1;\n if (bar.time === last) {\n writeBar(store, n - 1, bar);\n return n - 1;\n }\n }\n reserve(store, n + 1);\n writeBar(store, n, bar);\n store.length = n + 1;\n return n;\n};\n\n/** Inserts the bars older than the first one; returns how many were added */\nexport const prependBars = (\n store: BarStore,\n bars: TradingBarsInput,\n): number => {\n const n = inputLength(bars);\n const first = store.length ? store.time[0] : Infinity;\n // keep only the bars strictly older than the current first bar\n let count = 0;\n const time = isColumns(bars) ? bars.time : null;\n while (\n count < n &&\n (time ? time[count] : (bars as readonly TradingBar[])[count].time) < first\n ) {\n count++;\n }\n if (!count) return 0;\n const length = store.length;\n const previous: OhlcColumns = {\n time: store.time.slice(0, length),\n open: store.open.slice(0, length),\n high: store.high.slice(0, length),\n low: store.low.slice(0, length),\n close: store.close.slice(0, length),\n volume: store.volume.slice(0, length),\n };\n store.length = 0;\n reserve(store, length + count);\n write(store, bars, 0, count);\n for (const key of KEYS) store[key].set(previous[key], count);\n store.length = length + count;\n return count;\n};\n\n/** Bar at an index as an object */\nexport const readBar = (columns: OhlcColumns, i: number): TradingBar => ({\n time: columns.time[i],\n open: columns.open[i],\n high: columns.high[i],\n low: columns.low[i],\n close: columns.close[i],\n volume: columns.volume[i],\n});\n\n/** First index whose time is >= `time` (binary search) */\nexport const lowerBoundTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = n;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (time[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/**\n * Index of the bar containing `time`: the last bar opening at or before it\n * (0 before the first bar)\n */\nexport const indexOfTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n const i = lowerBoundTime(time, n, value);\n if (i < n && time[i] === value) return i;\n return Math.max(0, i - 1);\n};\n\n// ---------------------------------------------------------------- pyramid\n\n/** Bars aggregated `size` by `size`, aligned on index 0 */\nexport interface LodLevel extends OhlcColumns {\n size: number;\n /** Groups up to date */\n valid: number;\n}\n\n/** Aggregated levels, built lazily; level k groups 2^k bars */\nexport interface Pyramid {\n levels: (LodLevel | undefined)[];\n}\n\nexport const createPyramid = (): Pyramid => ({ levels: [] });\n\n/** Marks the groups containing bars from `from` on as stale */\nexport const invalidatePyramid = (pyramid: Pyramid, from: number): void => {\n for (const level of pyramid.levels) {\n if (level)\n level.valid = Math.min(level.valid, Math.floor(from / level.size));\n }\n};\n\n/**\n * Level `k` (k >= 1) of `src` (the first `n` bars), computed from level\n * k - 1 for the stale groups only\n */\nexport const pyramidLevel = (\n pyramid: Pyramid,\n src: OhlcColumns,\n n: number,\n k: number,\n): LodLevel => {\n const size = 2 ** k;\n const groups = Math.ceil(n / size);\n let level = pyramid.levels[k];\n if (!level || level.time.length < groups) {\n const capacity = Math.max(16, Math.ceil(groups * 1.5));\n const next: LodLevel = { ...allocate(capacity), size, valid: 0 };\n if (level) {\n for (const key of KEYS)\n next[key].set(level[key].subarray(0, level.valid));\n next.valid = level.valid;\n }\n level = next;\n pyramid.levels[k] = level;\n }\n if (level.valid >= groups) return level;\n // the source of level k: level k - 1 (pairs) or the bars (k = 1)\n const prev = k > 1 ? pyramidLevel(pyramid, src, n, k - 1) : src;\n const prevCount = k > 1 ? Math.ceil(n / (size / 2)) : n;\n // the last group of a level may be partial: always recompute it\n const from = Math.max(0, Math.min(level.valid, groups - 1));\n for (let g = from; g < groups; g++) {\n const a = g * 2;\n const b = a + 1;\n level.time[g] = prev.time[a];\n level.open[g] = prev.open[a];\n if (b < prevCount) {\n level.high[g] = Math.max(prev.high[a], prev.high[b]);\n level.low[g] = Math.min(prev.low[a], prev.low[b]);\n level.close[g] = prev.close[b];\n level.volume[g] = prev.volume[a] + prev.volume[b];\n } else {\n level.high[g] = prev.high[a];\n level.low[g] = prev.low[a];\n level.close[g] = prev.close[a];\n level.volume[g] = prev.volume[a];\n }\n }\n // complete groups stay valid; the partial last one is redone next time\n level.valid = n % size === 0 ? groups : groups - 1;\n return level;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"store.cjs","names":["KEYS","isColumns","bars","inputLength","allocate","capacity","createStore","reserve","size","store","next","key","write","i","count","at","volume","v","writeBar","bar","setBars","n","appendBars","first","updateBar","barAt","last","prependBars","time","length","previous","readBar","columns","lowerBoundTime","lo","hi","mid","value","indexOfTime","createPyramid","pyramidLevel","k","groups","level","pyramid","prev","src","prevCount","from","g","a","b","createRangePyramid","invalidateRangePyramid","lower","upper","rangeLevel","values","has","minA","maxA","lastA","minB","maxB","lastB"],"sources":["../../../../../charts/src/engine/trading/store.ts"],"sourcesContent":["// Bars in growable Float64Array columns, and a pyramid of aggregated\n// levels (2, 4, 8, ... bars per group) drawn when the chart is zoomed out\n// so far that a bar is narrower than a pixel: a million bars cost the\n// same to draw as a thousand.\n\nimport type { TradingBar, TradingBarColumns, TradingBarsInput } from \"./types\";\n\n/** OHLCV columns; only the first `length` entries are meaningful */\nexport interface OhlcColumns {\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n volume: Float64Array;\n}\n\nexport interface BarStore extends OhlcColumns {\n length: number;\n /** Size of the columns */\n capacity: number;\n /** Some bar has a volume */\n hasVolume: boolean;\n}\n\nconst KEYS = [\"time\", \"open\", \"high\", \"low\", \"close\", \"volume\"] as const;\n\nconst isColumns = (bars: TradingBarsInput): bars is TradingBarColumns =>\n !Array.isArray(bars);\n\nexport const inputLength = (bars: TradingBarsInput): number =>\n isColumns(bars)\n ? Math.min(\n bars.time.length,\n bars.open.length,\n bars.high.length,\n bars.low.length,\n bars.close.length,\n )\n : bars.length;\n\nconst allocate = (capacity: number): OhlcColumns => ({\n time: new Float64Array(capacity),\n open: new Float64Array(capacity),\n high: new Float64Array(capacity),\n low: new Float64Array(capacity),\n close: new Float64Array(capacity),\n volume: new Float64Array(capacity),\n});\n\nexport const createStore = (): BarStore => ({\n ...allocate(16),\n length: 0,\n capacity: 16,\n hasVolume: false,\n});\n\n/** Grows the columns to hold at least `size` bars (doubling) */\nconst reserve = (store: BarStore, size: number) => {\n if (size <= store.capacity) return;\n let capacity = store.capacity;\n while (capacity < size) capacity *= 2;\n const next = allocate(capacity);\n for (const key of KEYS) next[key].set(store[key].subarray(0, store.length));\n Object.assign(store, next);\n store.capacity = capacity;\n};\n\n/** Writes `count` bars of `bars` at `at` */\nconst write = (\n store: BarStore,\n bars: TradingBarsInput,\n at: number,\n count: number,\n) => {\n if (isColumns(bars)) {\n for (let i = 0; i < count; i++) {\n store.time[at + i] = bars.time[i];\n store.open[at + i] = bars.open[i];\n store.high[at + i] = bars.high[i];\n store.low[at + i] = bars.low[i];\n store.close[at + i] = bars.close[i];\n }\n const volume = bars.volume;\n if (volume) {\n for (let i = 0; i < count; i++) {\n const v = volume[i];\n store.volume[at + i] = Number.isFinite(v) ? v : 0;\n }\n store.hasVolume = true;\n } else {\n store.volume.fill(0, at, at + count);\n }\n return;\n }\n for (let i = 0; i < count; i++) writeBar(store, at + i, bars[i]);\n};\n\nconst writeBar = (store: BarStore, i: number, bar: TradingBar) => {\n store.time[i] = bar.time;\n store.open[i] = bar.open;\n store.high[i] = bar.high;\n store.low[i] = bar.low;\n store.close[i] = bar.close;\n const v = bar.volume;\n if (v !== undefined && Number.isFinite(v)) {\n store.volume[i] = v;\n store.hasVolume = true;\n } else {\n store.volume[i] = 0;\n }\n};\n\n/** Replaces every bar */\nexport const setBars = (store: BarStore, bars: TradingBarsInput): void => {\n const n = inputLength(bars);\n store.length = 0;\n store.hasVolume = false;\n reserve(store, n);\n write(store, bars, 0, n);\n store.length = n;\n};\n\n/**\n * Appends the bars newer than the last one (a bar at the time of the last\n * one replaces it). Returns the index of the first changed bar, or -1.\n */\nexport const appendBars = (store: BarStore, bars: TradingBarsInput): number => {\n const n = inputLength(bars);\n let first = -1;\n for (let i = 0; i < n; i++) {\n const at = updateBar(store, barAt(bars, i));\n if (at >= 0 && (first < 0 || at < first)) first = at;\n }\n return first;\n};\n\n/** The `i`-th bar of an input */\nexport const barAt = (bars: TradingBarsInput, i: number): TradingBar => {\n if (!isColumns(bars)) return bars[i];\n return {\n time: bars.time[i],\n open: bars.open[i],\n high: bars.high[i],\n low: bars.low[i],\n close: bars.close[i],\n ...(bars.volume ? { volume: bars.volume[i] } : {}),\n };\n};\n\n/**\n * Streams a bar: replaces the last bar at the same time, appends a newer\n * one. Returns its index; -1 (ignored) when older than the last bar.\n */\nexport const updateBar = (store: BarStore, bar: TradingBar): number => {\n const n = store.length;\n if (!Number.isFinite(bar.time)) return -1;\n if (n > 0) {\n const last = store.time[n - 1];\n if (bar.time < last) return -1;\n if (bar.time === last) {\n writeBar(store, n - 1, bar);\n return n - 1;\n }\n }\n reserve(store, n + 1);\n writeBar(store, n, bar);\n store.length = n + 1;\n return n;\n};\n\n/** Inserts the bars older than the first one; returns how many were added */\nexport const prependBars = (\n store: BarStore,\n bars: TradingBarsInput,\n): number => {\n const n = inputLength(bars);\n const first = store.length ? store.time[0] : Infinity;\n // keep only the bars strictly older than the current first bar\n let count = 0;\n const time = isColumns(bars) ? bars.time : null;\n while (\n count < n &&\n (time ? time[count] : (bars as readonly TradingBar[])[count].time) < first\n ) {\n count++;\n }\n if (!count) return 0;\n const length = store.length;\n const previous: OhlcColumns = {\n time: store.time.slice(0, length),\n open: store.open.slice(0, length),\n high: store.high.slice(0, length),\n low: store.low.slice(0, length),\n close: store.close.slice(0, length),\n volume: store.volume.slice(0, length),\n };\n store.length = 0;\n reserve(store, length + count);\n write(store, bars, 0, count);\n for (const key of KEYS) store[key].set(previous[key], count);\n store.length = length + count;\n return count;\n};\n\n/** Bar at an index as an object */\nexport const readBar = (columns: OhlcColumns, i: number): TradingBar => ({\n time: columns.time[i],\n open: columns.open[i],\n high: columns.high[i],\n low: columns.low[i],\n close: columns.close[i],\n volume: columns.volume[i],\n});\n\n/** First index whose time is >= `time` (binary search) */\nexport const lowerBoundTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = n;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (time[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/**\n * Index of the bar containing `time`: the last bar opening at or before it\n * (0 before the first bar)\n */\nexport const indexOfTime = (\n time: Float64Array,\n n: number,\n value: number,\n): number => {\n const i = lowerBoundTime(time, n, value);\n if (i < n && time[i] === value) return i;\n return Math.max(0, i - 1);\n};\n\n// ---------------------------------------------------------------- pyramid\n\n/** Bars aggregated `size` by `size`, aligned on index 0 */\nexport interface LodLevel extends OhlcColumns {\n size: number;\n /** Groups up to date */\n valid: number;\n}\n\n/** Aggregated levels, built lazily; level k groups 2^k bars */\nexport interface Pyramid {\n levels: (LodLevel | undefined)[];\n}\n\nexport const createPyramid = (): Pyramid => ({ levels: [] });\n\n/** Marks the groups containing bars from `from` on as stale */\nexport const invalidatePyramid = (pyramid: Pyramid, from: number): void => {\n for (const level of pyramid.levels) {\n if (level)\n level.valid = Math.min(level.valid, Math.floor(from / level.size));\n }\n};\n\n/**\n * Level `k` (k >= 1) of `src` (the first `n` bars), computed from level\n * k - 1 for the stale groups only\n */\nexport const pyramidLevel = (\n pyramid: Pyramid,\n src: OhlcColumns,\n n: number,\n k: number,\n): LodLevel => {\n const size = 2 ** k;\n const groups = Math.ceil(n / size);\n let level = pyramid.levels[k];\n if (!level || level.time.length < groups) {\n const capacity = Math.max(16, Math.ceil(groups * 1.5));\n const next: LodLevel = { ...allocate(capacity), size, valid: 0 };\n if (level) {\n for (const key of KEYS)\n next[key].set(level[key].subarray(0, level.valid));\n next.valid = level.valid;\n }\n level = next;\n pyramid.levels[k] = level;\n }\n if (level.valid >= groups) return level;\n // the source of level k: level k - 1 (pairs) or the bars (k = 1)\n const prev = k > 1 ? pyramidLevel(pyramid, src, n, k - 1) : src;\n const prevCount = k > 1 ? Math.ceil(n / (size / 2)) : n;\n // the last group of a level may be partial: always recompute it\n const from = Math.max(0, Math.min(level.valid, groups - 1));\n for (let g = from; g < groups; g++) {\n const a = g * 2;\n const b = a + 1;\n level.time[g] = prev.time[a];\n level.open[g] = prev.open[a];\n if (b < prevCount) {\n level.high[g] = Math.max(prev.high[a], prev.high[b]);\n level.low[g] = Math.min(prev.low[a], prev.low[b]);\n level.close[g] = prev.close[b];\n level.volume[g] = prev.volume[a] + prev.volume[b];\n } else {\n level.high[g] = prev.high[a];\n level.low[g] = prev.low[a];\n level.close[g] = prev.close[a];\n level.volume[g] = prev.volume[a];\n }\n }\n // complete groups stay valid; the partial last one is redone next time\n level.valid = n % size === 0 ? groups : groups - 1;\n return level;\n};\n\n// ---------------------------------------------------------- value ranges\n\n/** Lowest, highest and last finite value of each group of 2^k values */\nexport interface RangeLevel {\n size: number;\n min: Float64Array;\n max: Float64Array;\n last: Float64Array;\n /** Groups up to date */\n valid: number;\n}\n\n/**\n * Aggregated levels of a column of indicator values: a zoomed-out chart\n * draws the range of each group (min / max decimation), so spikes stay\n * visible instead of being sampled away\n */\nexport interface RangePyramid {\n levels: (RangeLevel | undefined)[];\n}\n\nexport const createRangePyramid = (): RangePyramid => ({ levels: [] });\n\nexport const invalidateRangePyramid = (\n pyramid: RangePyramid,\n from: number,\n): void => {\n for (const level of pyramid.levels) {\n if (level)\n level.valid = Math.min(level.valid, Math.floor(from / level.size));\n }\n};\n\nconst lower = (a: number, b: number) =>\n !Number.isFinite(a) ? b : !Number.isFinite(b) ? a : a < b ? a : b;\nconst upper = (a: number, b: number) =>\n !Number.isFinite(a) ? b : !Number.isFinite(b) ? a : a > b ? a : b;\n\n/** Level `k` (k >= 1) of the first `n` values, updated for the stale groups only */\nexport const rangeLevel = (\n pyramid: RangePyramid,\n values: Float64Array,\n n: number,\n k: number,\n): RangeLevel => {\n const size = 2 ** k;\n const groups = Math.ceil(n / size);\n let level = pyramid.levels[k];\n if (!level || level.min.length < groups) {\n const capacity = Math.max(16, Math.ceil(groups * 1.5));\n const next: RangeLevel = {\n size,\n min: new Float64Array(capacity),\n max: new Float64Array(capacity),\n last: new Float64Array(capacity),\n valid: 0,\n };\n if (level) {\n next.min.set(level.min.subarray(0, level.valid));\n next.max.set(level.max.subarray(0, level.valid));\n next.last.set(level.last.subarray(0, level.valid));\n next.valid = level.valid;\n }\n level = next;\n pyramid.levels[k] = level;\n }\n if (level.valid >= groups) return level;\n const prev = k > 1 ? rangeLevel(pyramid, values, n, k - 1) : null;\n const prevCount = k > 1 ? Math.ceil(n / (size / 2)) : n;\n const from = Math.max(0, Math.min(level.valid, groups - 1));\n for (let g = from; g < groups; g++) {\n const a = g * 2;\n const b = a + 1;\n const has = b < prevCount;\n const minA = prev ? prev.min[a] : values[a];\n const maxA = prev ? prev.max[a] : values[a];\n const lastA = prev ? prev.last[a] : values[a];\n const minB = has ? (prev ? prev.min[b] : values[b]) : NaN;\n const maxB = has ? (prev ? prev.max[b] : values[b]) : NaN;\n const lastB = has ? (prev ? prev.last[b] : values[b]) : NaN;\n level.min[g] = lower(minA, minB);\n level.max[g] = upper(maxA, maxB);\n level.last[g] = Number.isFinite(lastB) ? lastB : lastA;\n }\n level.valid = n % size === 0 ? groups : groups - 1;\n return level;\n};\n"],"mappings":"AAyBA,IAAMA,EAAO,CAAC,OAAQ,OAAQ,OAAQ,MAAO,QAAS,QAAQ,EAExDC,EAAa,GACjB,CAAC,MAAM,QAAQC,CAAI,EAERC,EAAe,GAC1BF,EAAUC,CAAI,EACV,KAAK,IACHA,EAAK,KAAK,OACVA,EAAK,KAAK,OACVA,EAAK,KAAK,OACVA,EAAK,IAAI,OACTA,EAAK,MAAM,MACb,EACAA,EAAK,OAELE,EAAY,IAAmC,CACnD,KAAM,IAAI,aAAaC,CAAQ,EAC/B,KAAM,IAAI,aAAaA,CAAQ,EAC/B,KAAM,IAAI,aAAaA,CAAQ,EAC/B,IAAK,IAAI,aAAaA,CAAQ,EAC9B,MAAO,IAAI,aAAaA,CAAQ,EAChC,OAAQ,IAAI,aAAaA,CAAQ,CACnC,GAEaC,OAA+B,CAC1C,GAAGF,EAAS,EAAE,EACd,OAAQ,EACR,SAAU,GACV,UAAW,EACb,GAGMG,GAAW,EAAiB,IAAiB,CACjD,GAAIC,GAAQC,EAAM,SAAU,OAC5B,IAAIJ,EAAWI,EAAM,SACrB,KAAOJ,EAAWG,GAAM,GAAY,EACpC,IAAME,EAAON,EAASC,CAAQ,EAC9B,IAAK,IAAMM,KAAOX,EAAMU,EAAKC,EAAI,CAAC,IAAIF,EAAME,EAAI,CAAC,SAAS,EAAGF,EAAM,MAAM,CAAC,EAC1E,OAAO,OAAOA,EAAOC,CAAI,EACzB,EAAM,SAAWL,CACnB,EAGMO,GACJ,EACA,EACA,EACA,IACG,CACH,GAAIX,EAAUC,CAAI,EAAG,CACnB,IAAK,IAAIW,EAAI,EAAGA,EAAIC,EAAO,IACzB,EAAM,KAAKC,EAAKF,GAAKX,EAAK,KAAKW,GAC/B,EAAM,KAAKE,EAAKF,GAAKX,EAAK,KAAKW,GAC/B,EAAM,KAAKE,EAAKF,GAAKX,EAAK,KAAKW,GAC/B,EAAM,IAAIE,EAAKF,GAAKX,EAAK,IAAIW,GAC7B,EAAM,MAAME,EAAKF,GAAKX,EAAK,MAAMW,GAEnC,IAAMG,EAASd,EAAK,OACpB,GAAIc,EAAQ,CACV,IAAK,IAAIH,EAAI,EAAGA,EAAIC,EAAO,IAAK,CAC9B,IAAMG,EAAID,EAAOH,GACjB,EAAM,OAAOE,EAAKF,GAAK,OAAO,SAASI,CAAC,EAAIA,EAAI,CAClD,CACA,EAAM,UAAY,EACpB,MACER,EAAM,OAAO,KAAK,EAAGM,EAAIA,EAAKD,CAAK,EAErC,MACF,CACA,IAAK,IAAID,EAAI,EAAGA,EAAIC,EAAO,IAAKI,EAAST,EAAOM,EAAKF,EAAGX,EAAKW,EAAE,CACjE,EAEMK,GAAY,EAAiB,EAAW,IAAoB,CAChE,EAAM,KAAKL,GAAKM,EAAI,KACpB,EAAM,KAAKN,GAAKM,EAAI,KACpB,EAAM,KAAKN,GAAKM,EAAI,KACpB,EAAM,IAAIN,GAAKM,EAAI,IACnB,EAAM,MAAMN,GAAKM,EAAI,MACrB,IAAMF,EAAIE,EAAI,OACVF,IAAM,IAAA,IAAa,OAAO,SAASA,CAAC,GACtC,EAAM,OAAOJ,GAAKI,EAClB,EAAM,UAAY,IAElB,EAAM,OAAOJ,GAAK,CAEtB,EAGaO,GAAW,EAAiB,IAAiC,CACxE,IAAMC,EAAIlB,EAAYD,CAAI,EAC1B,EAAM,OAAS,EACf,EAAM,UAAY,GAClBK,EAAQE,EAAOY,CAAC,EAChBT,EAAMH,EAAOP,EAAM,EAAGmB,CAAC,EACvB,EAAM,OAASA,CACjB,EAMaC,GAAc,EAAiB,IAAmC,CAC7E,IAAMD,EAAIlB,EAAYD,CAAI,EACtBqB,EAAQ,GACZ,IAAK,IAAIV,EAAI,EAAGA,EAAIQ,EAAG,IAAK,CAC1B,IAAMN,EAAKS,EAAUf,EAAOgB,EAAMvB,EAAMW,CAAC,CAAC,EACtCE,GAAM,IAAMQ,EAAQ,GAAKR,EAAKQ,KAAQ,EAAQR,EACpD,CACA,OAAOQ,CACT,EAGaE,GAAS,EAAwB,IACvCxB,EAAUC,CAAI,EACZ,CACL,KAAMA,EAAK,KAAKW,GAChB,KAAMX,EAAK,KAAKW,GAChB,KAAMX,EAAK,KAAKW,GAChB,IAAKX,EAAK,IAAIW,GACd,MAAOX,EAAK,MAAMW,GAClB,GAAIX,EAAK,OAAS,CAAE,OAAQA,EAAK,OAAOW,EAAG,EAAI,CAAC,CAClD,EAR6BX,EAAKW,GAevBW,GAAa,EAAiB,IAA4B,CACrE,IAAM,EAAIf,EAAM,OAChB,GAAI,CAAC,OAAO,SAASU,EAAI,IAAI,EAAG,MAAO,GACvC,GAAI,EAAI,EAAG,CACT,IAAMO,EAAOjB,EAAM,KAAK,EAAI,GAC5B,GAAIU,EAAI,KAAOO,EAAM,MAAO,GAC5B,GAAIP,EAAI,OAASO,EAEf,OADAR,EAAST,EAAO,EAAI,EAAGU,CAAG,EACnB,EAAI,CAEf,CAIA,OAHAZ,EAAQE,EAAO,EAAI,CAAC,EACpBS,EAAST,EAAO,EAAGU,CAAG,EACtB,EAAM,OAAS,EAAI,EACZ,CACT,EAGaQ,GACX,EACA,IACW,CACX,IAAMN,EAAIlB,EAAYD,CAAI,EACpBqB,EAAQd,EAAM,OAASA,EAAM,KAAK,GAAK,IAEzCK,EAAQ,EACNc,EAAO3B,EAAUC,CAAI,EAAIA,EAAK,KAAO,KAC3C,KACEY,EAAQO,IACPO,EAAOA,EAAKd,GAAUZ,EAA+BY,EAAM,CAAC,MAAQS,GAErE,IAEF,GAAI,CAACT,EAAO,MAAO,GACnB,IAAMe,EAASpB,EAAM,OACfqB,EAAwB,CAC5B,KAAMrB,EAAM,KAAK,MAAM,EAAGoB,CAAM,EAChC,KAAMpB,EAAM,KAAK,MAAM,EAAGoB,CAAM,EAChC,KAAMpB,EAAM,KAAK,MAAM,EAAGoB,CAAM,EAChC,IAAKpB,EAAM,IAAI,MAAM,EAAGoB,CAAM,EAC9B,MAAOpB,EAAM,MAAM,MAAM,EAAGoB,CAAM,EAClC,OAAQpB,EAAM,OAAO,MAAM,EAAGoB,CAAM,CACtC,EACA,EAAM,OAAS,EACftB,EAAQE,EAAOoB,EAASf,CAAK,EAC7BF,EAAMH,EAAOP,EAAM,EAAGY,CAAK,EAC3B,IAAK,IAAMH,KAAOX,EAAMS,EAAME,EAAI,CAAC,IAAImB,EAASnB,GAAMG,CAAK,EAE3D,MADA,GAAM,OAASe,EAASf,EACjBA,CACT,EAGaiB,GAAW,EAAsB,KAA2B,CACvE,KAAMC,EAAQ,KAAKnB,GACnB,KAAMmB,EAAQ,KAAKnB,GACnB,KAAMmB,EAAQ,KAAKnB,GACnB,IAAKmB,EAAQ,IAAInB,GACjB,MAAOmB,EAAQ,MAAMnB,GACrB,OAAQmB,EAAQ,OAAOnB,EACzB,GAGaoB,GACX,EACA,EACA,IACW,CACX,IAAIC,EAAK,EACLC,EAAKd,EACT,KAAOa,EAAKC,GAAI,CACd,IAAMC,EAAOF,EAAKC,IAAQ,EACtBP,EAAKQ,GAAOC,EAAO,EAAKD,EAAM,EAC7B,EAAKA,CACZ,CACA,OAAOF,CACT,EAMaI,GACX,EACA,EACA,IACW,CACX,IAAMzB,EAAIoB,EAAeL,EAAMP,EAAGgB,CAAK,EAEvC,OADIxB,EAAIQ,GAAKO,EAAKf,KAAOwB,EAAcxB,EAChC,KAAK,IAAI,EAAGA,EAAI,CAAC,CAC1B,EAgBa0B,OAAgC,CAAE,OAAQ,CAAC,CAAE,GAc7CC,GACX,EACA,EACA,EACA,IACa,CACb,IAAMhC,EAAO,GAAKiC,EACZC,EAAS,KAAK,KAAKrB,EAAIb,CAAI,EAC7BmC,EAAQC,EAAQ,OAAOH,GAC3B,GAAI,CAACE,GAASA,EAAM,KAAK,OAASD,EAAQ,CAExC,IAAMhC,EAAiB,CAAE,GAAGN,EADX,KAAK,IAAI,GAAI,KAAK,KAAKsC,EAAS,GAAG,CACf,CAAQ,EAAG,OAAM,MAAO,CAAE,EAC/D,GAAIC,EAAO,CACT,IAAK,IAAMhC,KAAOX,EAChBU,EAAKC,EAAI,CAAC,IAAIgC,EAAMhC,EAAI,CAAC,SAAS,EAAGgC,EAAM,KAAK,CAAC,EACnD,EAAK,MAAQA,EAAM,KACrB,CACA,EAAQjC,EACR,EAAQ,OAAO+B,GAAKE,CACtB,CACA,GAAIA,EAAM,OAASD,EAAQ,OAAOC,EAElC,IAAME,EAAOJ,EAAI,EAAID,EAAaI,EAASE,EAAKzB,EAAGoB,EAAI,CAAC,EAAIK,EACtDC,EAAYN,EAAI,EAAI,KAAK,KAAKpB,GAAKb,EAAO,EAAE,EAAIa,EAEhD2B,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIL,EAAM,MAAOD,EAAS,CAAC,CAAC,EAC1D,IAAK,IAAIO,EAAID,EAAMC,EAAIP,EAAQ,IAAK,CAClC,IAAMQ,EAAID,EAAI,EACRE,EAAID,EAAI,EACd,EAAM,KAAKD,GAAKJ,EAAK,KAAKK,GAC1B,EAAM,KAAKD,GAAKJ,EAAK,KAAKK,GACtBC,EAAIJ,GACN,EAAM,KAAKE,GAAK,KAAK,IAAIJ,EAAK,KAAKK,GAAIL,EAAK,KAAKM,EAAE,EACnD,EAAM,IAAIF,GAAK,KAAK,IAAIJ,EAAK,IAAIK,GAAIL,EAAK,IAAIM,EAAE,EAChD,EAAM,MAAMF,GAAKJ,EAAK,MAAMM,GAC5B,EAAM,OAAOF,GAAKJ,EAAK,OAAOK,GAAKL,EAAK,OAAOM,KAE/C,EAAM,KAAKF,GAAKJ,EAAK,KAAKK,GAC1B,EAAM,IAAID,GAAKJ,EAAK,IAAIK,GACxB,EAAM,MAAMD,GAAKJ,EAAK,MAAMK,GAC5B,EAAM,OAAOD,GAAKJ,EAAK,OAAOK,GAElC,CAGA,MADA,GAAM,MAAQ7B,EAAIb,IAAS,EAAIkC,EAASA,EAAS,EAC1CC,CACT,EAuBaS,OAA0C,CAAE,OAAQ,CAAC,CAAE,GAEvDC,GACX,EACA,IACS,CACT,IAAK,IAAMV,KAASC,EAAQ,OACtBD,IACF,EAAM,MAAQ,KAAK,IAAIA,EAAM,MAAO,KAAK,MAAMK,EAAOL,EAAM,IAAI,CAAC,EAEvE,EAEMW,GAAS,EAAW,IACvB,OAAO,SAASJ,CAAC,EAAS,OAAO,SAASC,CAAC,EAAQD,EAAIC,EAAID,EAAIC,EAAhBD,EAA1BC,EAClBI,GAAS,EAAW,IACvB,OAAO,SAASL,CAAC,EAAS,OAAO,SAASC,CAAC,EAAQD,EAAIC,EAAID,EAAIC,EAAhBD,EAA1BC,EAGXK,GACX,EACA,EACA,EACA,IACe,CACf,IAAMhD,EAAO,GAAKiC,EACZC,EAAS,KAAK,KAAK,EAAIlC,CAAI,EAC7BmC,EAAQC,EAAQ,OAAOH,GAC3B,GAAI,CAACE,GAASA,EAAM,IAAI,OAASD,EAAQ,CACvC,IAAMrC,EAAW,KAAK,IAAI,GAAI,KAAK,KAAKqC,EAAS,GAAG,CAAC,EAC/ChC,EAAmB,CACvB,OACA,IAAK,IAAI,aAAaL,CAAQ,EAC9B,IAAK,IAAI,aAAaA,CAAQ,EAC9B,KAAM,IAAI,aAAaA,CAAQ,EAC/B,MAAO,CACT,EACIsC,IACFjC,EAAK,IAAI,IAAIiC,EAAM,IAAI,SAAS,EAAGA,EAAM,KAAK,CAAC,EAC/CjC,EAAK,IAAI,IAAIiC,EAAM,IAAI,SAAS,EAAGA,EAAM,KAAK,CAAC,EAC/CjC,EAAK,KAAK,IAAIiC,EAAM,KAAK,SAAS,EAAGA,EAAM,KAAK,CAAC,EACjD,EAAK,MAAQA,EAAM,OAErB,EAAQjC,EACR,EAAQ,OAAO+B,GAAKE,CACtB,CACA,GAAIA,EAAM,OAASD,EAAQ,OAAOC,EAClC,IAAME,EAAOJ,EAAI,EAAIe,EAAWZ,EAASa,EAAQ,EAAGhB,EAAI,CAAC,EAAI,KACvDM,EAAYN,EAAI,EAAI,KAAK,KAAK,GAAKjC,EAAO,EAAE,EAAI,EAChDwC,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIL,EAAM,MAAOD,EAAS,CAAC,CAAC,EAC1D,IAAK,IAAIO,EAAID,EAAMC,EAAIP,EAAQ,IAAK,CAClC,IAAMQ,EAAID,EAAI,EACRE,EAAID,EAAI,EACRQ,EAAMP,EAAIJ,EACVY,EAAOd,EAAOA,EAAK,IAAIK,GAAKO,EAAOP,GACnCU,EAAOf,EAAOA,EAAK,IAAIK,GAAKO,EAAOP,GACnCW,EAAQhB,EAAOA,EAAK,KAAKK,GAAKO,EAAOP,GACrCY,EAAOJ,EAAOb,EAAOA,EAAK,IAAIM,GAAKM,EAAON,GAAM,IAChDY,EAAOL,EAAOb,EAAOA,EAAK,IAAIM,GAAKM,EAAON,GAAM,IAChDa,EAAQN,EAAOb,EAAOA,EAAK,KAAKM,GAAKM,EAAON,GAAM,IACxD,EAAM,IAAIF,GAAKK,EAAMK,EAAMG,CAAI,EAC/B,EAAM,IAAIb,GAAKM,EAAMK,EAAMG,CAAI,EAC/B,EAAM,KAAKd,GAAK,OAAO,SAASe,CAAK,EAAIA,EAAQH,CACnD,CAEA,MADA,GAAM,MAAQ,EAAIrD,IAAS,EAAIkC,EAASA,EAAS,EAC1CC,CACT"}