@continuumdao/continuum-node-sdk 1.3.37 → 1.3.39

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 (445) hide show
  1. package/dist/agent-host-catalog.json +11 -0
  2. package/dist/core/chart/analysis/analysis-agent-view.d.ts.map +1 -1
  3. package/dist/core/chart/analysis/analysis-agent-view.js +68 -11
  4. package/dist/core/chart/analysis/analysis-agent-view.js.map +1 -1
  5. package/dist/core/chart/analysis/analysis-catalog.d.ts.map +1 -1
  6. package/dist/core/chart/analysis/analysis-catalog.js +59 -1
  7. package/dist/core/chart/analysis/analysis-catalog.js.map +1 -1
  8. package/dist/core/chart/analysis/analyze-tools.d.ts +228 -11
  9. package/dist/core/chart/analysis/analyze-tools.d.ts.map +1 -1
  10. package/dist/core/chart/analysis/analyze-tools.js +51 -55
  11. package/dist/core/chart/analysis/analyze-tools.js.map +1 -1
  12. package/dist/core/chart/analysis/bollinger-analyze-tools.d.ts +5 -0
  13. package/dist/core/chart/analysis/bollinger-analyze-tools.d.ts.map +1 -1
  14. package/dist/core/chart/analysis/bollinger-analyze-tools.js +9 -0
  15. package/dist/core/chart/analysis/bollinger-analyze-tools.js.map +1 -1
  16. package/dist/core/chart/analysis/chart-patterns-drawings-tools.d.ts +121 -0
  17. package/dist/core/chart/analysis/chart-patterns-drawings-tools.d.ts.map +1 -1
  18. package/dist/core/chart/analysis/chart-patterns-drawings-tools.js +69 -5
  19. package/dist/core/chart/analysis/chart-patterns-drawings-tools.js.map +1 -1
  20. package/dist/core/chart/analysis/chart-patterns-tools.d.ts +114 -0
  21. package/dist/core/chart/analysis/chart-patterns-tools.d.ts.map +1 -1
  22. package/dist/core/chart/analysis/chart-patterns-tools.js +10 -1
  23. package/dist/core/chart/analysis/chart-patterns-tools.js.map +1 -1
  24. package/dist/core/chart/analysis/divergence/detect.d.ts +21 -0
  25. package/dist/core/chart/analysis/divergence/detect.d.ts.map +1 -0
  26. package/dist/core/chart/analysis/divergence/detect.js +223 -0
  27. package/dist/core/chart/analysis/divergence/detect.js.map +1 -0
  28. package/dist/core/chart/analysis/divergence/index.d.ts +4 -0
  29. package/dist/core/chart/analysis/divergence/index.d.ts.map +1 -0
  30. package/dist/core/chart/analysis/divergence/index.js +4 -0
  31. package/dist/core/chart/analysis/divergence/index.js.map +1 -0
  32. package/dist/core/chart/analysis/divergence/peaks.d.ts +11 -0
  33. package/dist/core/chart/analysis/divergence/peaks.d.ts.map +1 -0
  34. package/dist/core/chart/analysis/divergence/peaks.js +108 -0
  35. package/dist/core/chart/analysis/divergence/peaks.js.map +1 -0
  36. package/dist/core/chart/analysis/divergence/types.d.ts +30 -0
  37. package/dist/core/chart/analysis/divergence/types.d.ts.map +1 -0
  38. package/dist/core/chart/analysis/divergence/types.js +2 -0
  39. package/dist/core/chart/analysis/divergence/types.js.map +1 -0
  40. package/dist/core/chart/analysis/divergence-analyze-tools.d.ts +258 -0
  41. package/dist/core/chart/analysis/divergence-analyze-tools.d.ts.map +1 -0
  42. package/dist/core/chart/analysis/divergence-analyze-tools.js +316 -0
  43. package/dist/core/chart/analysis/divergence-analyze-tools.js.map +1 -0
  44. package/dist/core/chart/analysis/divergence-drawings-tools.d.ts +459 -0
  45. package/dist/core/chart/analysis/divergence-drawings-tools.d.ts.map +1 -0
  46. package/dist/core/chart/analysis/divergence-drawings-tools.js +392 -0
  47. package/dist/core/chart/analysis/divergence-drawings-tools.js.map +1 -0
  48. package/dist/core/chart/analysis/divergence-highlight.d.ts +19 -0
  49. package/dist/core/chart/analysis/divergence-highlight.d.ts.map +1 -0
  50. package/dist/core/chart/analysis/divergence-highlight.js +39 -0
  51. package/dist/core/chart/analysis/divergence-highlight.js.map +1 -0
  52. package/dist/core/chart/analysis/donchian-analyze-tools.d.ts +117 -0
  53. package/dist/core/chart/analysis/donchian-analyze-tools.d.ts.map +1 -0
  54. package/dist/core/chart/analysis/donchian-analyze-tools.js +220 -0
  55. package/dist/core/chart/analysis/donchian-analyze-tools.js.map +1 -0
  56. package/dist/core/chart/analysis/donchian-highlight.d.ts +31 -0
  57. package/dist/core/chart/analysis/donchian-highlight.d.ts.map +1 -0
  58. package/dist/core/chart/analysis/donchian-highlight.js +41 -0
  59. package/dist/core/chart/analysis/donchian-highlight.js.map +1 -0
  60. package/dist/core/chart/analysis/elliott-wave-drawings-tools.d.ts +2 -0
  61. package/dist/core/chart/analysis/elliott-wave-drawings-tools.d.ts.map +1 -1
  62. package/dist/core/chart/analysis/elliott-wave-drawings-tools.js +12 -2
  63. package/dist/core/chart/analysis/elliott-wave-drawings-tools.js.map +1 -1
  64. package/dist/core/chart/analysis/elliott-waves-analyze-tools.d.ts +45 -0
  65. package/dist/core/chart/analysis/elliott-waves-analyze-tools.d.ts.map +1 -1
  66. package/dist/core/chart/analysis/elliott-waves-analyze-tools.js +4 -1
  67. package/dist/core/chart/analysis/elliott-waves-analyze-tools.js.map +1 -1
  68. package/dist/core/chart/analysis/ichimoku-analyze-tools.d.ts +128 -0
  69. package/dist/core/chart/analysis/ichimoku-analyze-tools.d.ts.map +1 -0
  70. package/dist/core/chart/analysis/ichimoku-analyze-tools.js +245 -0
  71. package/dist/core/chart/analysis/ichimoku-analyze-tools.js.map +1 -0
  72. package/dist/core/chart/analysis/ichimoku-highlight.d.ts +36 -0
  73. package/dist/core/chart/analysis/ichimoku-highlight.d.ts.map +1 -0
  74. package/dist/core/chart/analysis/ichimoku-highlight.js +40 -0
  75. package/dist/core/chart/analysis/ichimoku-highlight.js.map +1 -0
  76. package/dist/core/chart/analysis/key-fib-drawings-tools.d.ts +20 -6
  77. package/dist/core/chart/analysis/key-fib-drawings-tools.d.ts.map +1 -1
  78. package/dist/core/chart/analysis/key-fib-drawings-tools.js +47 -20
  79. package/dist/core/chart/analysis/key-fib-drawings-tools.js.map +1 -1
  80. package/dist/core/chart/analysis/key-level-drawings-shared.d.ts +8 -12
  81. package/dist/core/chart/analysis/key-level-drawings-shared.d.ts.map +1 -1
  82. package/dist/core/chart/analysis/key-level-drawings-shared.js +15 -37
  83. package/dist/core/chart/analysis/key-level-drawings-shared.js.map +1 -1
  84. package/dist/core/chart/analysis/key-level-drawings-tools.d.ts +23 -0
  85. package/dist/core/chart/analysis/key-level-drawings-tools.d.ts.map +1 -1
  86. package/dist/core/chart/analysis/key-level-drawings-tools.js +53 -6
  87. package/dist/core/chart/analysis/key-level-drawings-tools.js.map +1 -1
  88. package/dist/core/chart/analysis/key-level-menu-summary.d.ts +15 -22
  89. package/dist/core/chart/analysis/key-level-menu-summary.d.ts.map +1 -1
  90. package/dist/core/chart/analysis/key-level-menu-summary.js +63 -124
  91. package/dist/core/chart/analysis/key-level-menu-summary.js.map +1 -1
  92. package/dist/core/chart/analysis/key-levels-dataset.d.ts +1 -0
  93. package/dist/core/chart/analysis/key-levels-dataset.d.ts.map +1 -1
  94. package/dist/core/chart/analysis/key-levels-dataset.js +4 -7
  95. package/dist/core/chart/analysis/key-levels-dataset.js.map +1 -1
  96. package/dist/core/chart/analysis/liquidity-depth-analyze-tools.d.ts +124 -0
  97. package/dist/core/chart/analysis/liquidity-depth-analyze-tools.d.ts.map +1 -0
  98. package/dist/core/chart/analysis/liquidity-depth-analyze-tools.js +185 -0
  99. package/dist/core/chart/analysis/liquidity-depth-analyze-tools.js.map +1 -0
  100. package/dist/core/chart/analysis/liquidity-depth-drawings-tools.d.ts +1447 -0
  101. package/dist/core/chart/analysis/liquidity-depth-drawings-tools.d.ts.map +1 -0
  102. package/dist/core/chart/analysis/liquidity-depth-drawings-tools.js +161 -0
  103. package/dist/core/chart/analysis/liquidity-depth-drawings-tools.js.map +1 -0
  104. package/dist/core/chart/analysis/moving-averages-analyze-tools.d.ts +4 -0
  105. package/dist/core/chart/analysis/moving-averages-analyze-tools.d.ts.map +1 -1
  106. package/dist/core/chart/analysis/moving-averages-analyze-tools.js +3 -0
  107. package/dist/core/chart/analysis/moving-averages-analyze-tools.js.map +1 -1
  108. package/dist/core/chart/analysis/supertrend-analyze-tools.d.ts +116 -0
  109. package/dist/core/chart/analysis/supertrend-analyze-tools.d.ts.map +1 -0
  110. package/dist/core/chart/analysis/supertrend-analyze-tools.js +216 -0
  111. package/dist/core/chart/analysis/supertrend-analyze-tools.js.map +1 -0
  112. package/dist/core/chart/analysis/supertrend-highlight.d.ts +25 -0
  113. package/dist/core/chart/analysis/supertrend-highlight.d.ts.map +1 -0
  114. package/dist/core/chart/analysis/supertrend-highlight.js +37 -0
  115. package/dist/core/chart/analysis/supertrend-highlight.js.map +1 -0
  116. package/dist/core/chart/analysis/trade-setups/bollinger-trade-setup.d.ts +8 -1
  117. package/dist/core/chart/analysis/trade-setups/bollinger-trade-setup.d.ts.map +1 -1
  118. package/dist/core/chart/analysis/trade-setups/bollinger-trade-setup.js +13 -2
  119. package/dist/core/chart/analysis/trade-setups/bollinger-trade-setup.js.map +1 -1
  120. package/dist/core/chart/analysis/trade-setups/build-trade.d.ts +3 -4
  121. package/dist/core/chart/analysis/trade-setups/build-trade.d.ts.map +1 -1
  122. package/dist/core/chart/analysis/trade-setups/build-trade.js +55 -76
  123. package/dist/core/chart/analysis/trade-setups/build-trade.js.map +1 -1
  124. package/dist/core/chart/analysis/trade-setups/chart-data-purpose.d.ts.map +1 -1
  125. package/dist/core/chart/analysis/trade-setups/chart-data-purpose.js +18 -1
  126. package/dist/core/chart/analysis/trade-setups/chart-data-purpose.js.map +1 -1
  127. package/dist/core/chart/analysis/trade-setups/chart-pattern-trade-setup.d.ts +9 -0
  128. package/dist/core/chart/analysis/trade-setups/chart-pattern-trade-setup.d.ts.map +1 -1
  129. package/dist/core/chart/analysis/trade-setups/chart-pattern-trade-setup.js +71 -9
  130. package/dist/core/chart/analysis/trade-setups/chart-pattern-trade-setup.js.map +1 -1
  131. package/dist/core/chart/analysis/trade-setups/divergence-trade-setup.d.ts +84 -0
  132. package/dist/core/chart/analysis/trade-setups/divergence-trade-setup.d.ts.map +1 -0
  133. package/dist/core/chart/analysis/trade-setups/divergence-trade-setup.js +194 -0
  134. package/dist/core/chart/analysis/trade-setups/divergence-trade-setup.js.map +1 -0
  135. package/dist/core/chart/analysis/trade-setups/donchian-trade-setup.d.ts +137 -0
  136. package/dist/core/chart/analysis/trade-setups/donchian-trade-setup.d.ts.map +1 -0
  137. package/dist/core/chart/analysis/trade-setups/donchian-trade-setup.js +436 -0
  138. package/dist/core/chart/analysis/trade-setups/donchian-trade-setup.js.map +1 -0
  139. package/dist/core/chart/analysis/trade-setups/elliott-waves-trade-setup.d.ts +5 -1
  140. package/dist/core/chart/analysis/trade-setups/elliott-waves-trade-setup.d.ts.map +1 -1
  141. package/dist/core/chart/analysis/trade-setups/elliott-waves-trade-setup.js +9 -1
  142. package/dist/core/chart/analysis/trade-setups/elliott-waves-trade-setup.js.map +1 -1
  143. package/dist/core/chart/analysis/trade-setups/ichimoku-trade-setup.d.ts +159 -0
  144. package/dist/core/chart/analysis/trade-setups/ichimoku-trade-setup.d.ts.map +1 -0
  145. package/dist/core/chart/analysis/trade-setups/ichimoku-trade-setup.js +407 -0
  146. package/dist/core/chart/analysis/trade-setups/ichimoku-trade-setup.js.map +1 -0
  147. package/dist/core/chart/analysis/trade-setups/index.d.ts +9 -0
  148. package/dist/core/chart/analysis/trade-setups/index.d.ts.map +1 -1
  149. package/dist/core/chart/analysis/trade-setups/index.js +9 -0
  150. package/dist/core/chart/analysis/trade-setups/index.js.map +1 -1
  151. package/dist/core/chart/analysis/trade-setups/key-level-fib-retrace-trade-setup.d.ts +9 -41
  152. package/dist/core/chart/analysis/trade-setups/key-level-fib-retrace-trade-setup.d.ts.map +1 -1
  153. package/dist/core/chart/analysis/trade-setups/key-level-fib-retrace-trade-setup.js +36 -238
  154. package/dist/core/chart/analysis/trade-setups/key-level-fib-retrace-trade-setup.js.map +1 -1
  155. package/dist/core/chart/analysis/trade-setups/key-levels-trade-setup.d.ts +4 -8
  156. package/dist/core/chart/analysis/trade-setups/key-levels-trade-setup.d.ts.map +1 -1
  157. package/dist/core/chart/analysis/trade-setups/key-levels-trade-setup.js +3 -30
  158. package/dist/core/chart/analysis/trade-setups/key-levels-trade-setup.js.map +1 -1
  159. package/dist/core/chart/analysis/trade-setups/moving-averages-trade-setup.d.ts +3 -0
  160. package/dist/core/chart/analysis/trade-setups/moving-averages-trade-setup.d.ts.map +1 -1
  161. package/dist/core/chart/analysis/trade-setups/moving-averages-trade-setup.js +10 -4
  162. package/dist/core/chart/analysis/trade-setups/moving-averages-trade-setup.js.map +1 -1
  163. package/dist/core/chart/analysis/trade-setups/pattern-limit-entry.d.ts.map +1 -1
  164. package/dist/core/chart/analysis/trade-setups/pattern-limit-entry.js +8 -4
  165. package/dist/core/chart/analysis/trade-setups/pattern-limit-entry.js.map +1 -1
  166. package/dist/core/chart/analysis/trade-setups/shared.d.ts +13 -1
  167. package/dist/core/chart/analysis/trade-setups/shared.d.ts.map +1 -1
  168. package/dist/core/chart/analysis/trade-setups/shared.js +39 -0
  169. package/dist/core/chart/analysis/trade-setups/shared.js.map +1 -1
  170. package/dist/core/chart/analysis/trade-setups/supertrend-trade-setup.d.ts +124 -0
  171. package/dist/core/chart/analysis/trade-setups/supertrend-trade-setup.d.ts.map +1 -0
  172. package/dist/core/chart/analysis/trade-setups/supertrend-trade-setup.js +312 -0
  173. package/dist/core/chart/analysis/trade-setups/supertrend-trade-setup.js.map +1 -0
  174. package/dist/core/chart/analysis/trade-setups/trade-desk-defaults.d.ts +18 -1
  175. package/dist/core/chart/analysis/trade-setups/trade-desk-defaults.d.ts.map +1 -1
  176. package/dist/core/chart/analysis/trade-setups/trade-desk-defaults.js +28 -2
  177. package/dist/core/chart/analysis/trade-setups/trade-desk-defaults.js.map +1 -1
  178. package/dist/core/chart/analysis/trade-setups/trade-desk-universal-input.d.ts +46 -0
  179. package/dist/core/chart/analysis/trade-setups/trade-desk-universal-input.d.ts.map +1 -1
  180. package/dist/core/chart/analysis/trade-setups/trade-desk-universal-input.js +55 -0
  181. package/dist/core/chart/analysis/trade-setups/trade-desk-universal-input.js.map +1 -1
  182. package/dist/core/chart/analysis/trade-setups/trade-idea-list.d.ts +32 -0
  183. package/dist/core/chart/analysis/trade-setups/trade-idea-list.d.ts.map +1 -1
  184. package/dist/core/chart/analysis/trade-setups/trade-idea-list.js +222 -0
  185. package/dist/core/chart/analysis/trade-setups/trade-idea-list.js.map +1 -1
  186. package/dist/core/chart/analysis/trade-setups/trade-idea.d.ts +39 -0
  187. package/dist/core/chart/analysis/trade-setups/trade-idea.d.ts.map +1 -1
  188. package/dist/core/chart/analysis/trade-setups/trade-idea.js +159 -10
  189. package/dist/core/chart/analysis/trade-setups/trade-idea.js.map +1 -1
  190. package/dist/core/chart/analysis/trade-setups/trade-position-overlay.d.ts +37 -0
  191. package/dist/core/chart/analysis/trade-setups/trade-position-overlay.d.ts.map +1 -0
  192. package/dist/core/chart/analysis/trade-setups/trade-position-overlay.js +113 -0
  193. package/dist/core/chart/analysis/trade-setups/trade-position-overlay.js.map +1 -0
  194. package/dist/core/chart/analysis/trade-setups/trade-price-offsets.d.ts +42 -0
  195. package/dist/core/chart/analysis/trade-setups/trade-price-offsets.d.ts.map +1 -0
  196. package/dist/core/chart/analysis/trade-setups/trade-price-offsets.js +116 -0
  197. package/dist/core/chart/analysis/trade-setups/trade-price-offsets.js.map +1 -0
  198. package/dist/core/chart/analysis/trade-setups/trade-purpose-format.d.ts +2 -2
  199. package/dist/core/chart/analysis/trade-setups/trade-purpose-format.d.ts.map +1 -1
  200. package/dist/core/chart/analysis/trade-setups/trade-purpose-format.js +2 -6
  201. package/dist/core/chart/analysis/trade-setups/trade-purpose-format.js.map +1 -1
  202. package/dist/core/chart/analysis/trade-setups/trade-ratio.d.ts +54 -0
  203. package/dist/core/chart/analysis/trade-setups/trade-ratio.d.ts.map +1 -0
  204. package/dist/core/chart/analysis/trade-setups/trade-ratio.js +126 -0
  205. package/dist/core/chart/analysis/trade-setups/trade-ratio.js.map +1 -0
  206. package/dist/core/chart/analysis/trade-setups/trade-setup-selection.d.ts +42 -8
  207. package/dist/core/chart/analysis/trade-setups/trade-setup-selection.d.ts.map +1 -1
  208. package/dist/core/chart/analysis/trade-setups/trade-setup-selection.js +72 -17
  209. package/dist/core/chart/analysis/trade-setups/trade-setup-selection.js.map +1 -1
  210. package/dist/core/chart/analysis/trade-setups/trend-structure-trade-setup.d.ts +45 -0
  211. package/dist/core/chart/analysis/trade-setups/trend-structure-trade-setup.d.ts.map +1 -1
  212. package/dist/core/chart/analysis/trade-setups/trend-structure-trade-setup.js +121 -12
  213. package/dist/core/chart/analysis/trade-setups/trend-structure-trade-setup.js.map +1 -1
  214. package/dist/core/chart/analysis/trade-setups/z-score-trade-setup.d.ts +92 -0
  215. package/dist/core/chart/analysis/trade-setups/z-score-trade-setup.d.ts.map +1 -0
  216. package/dist/core/chart/analysis/trade-setups/z-score-trade-setup.js +201 -0
  217. package/dist/core/chart/analysis/trade-setups/z-score-trade-setup.js.map +1 -0
  218. package/dist/core/chart/analysis/trend-line-drawings-tools.d.ts +14 -0
  219. package/dist/core/chart/analysis/trend-line-drawings-tools.d.ts.map +1 -1
  220. package/dist/core/chart/analysis/trend-line-drawings-tools.js +87 -16
  221. package/dist/core/chart/analysis/trend-line-drawings-tools.js.map +1 -1
  222. package/dist/core/chart/analysis/trend-line-menu-summary.d.ts +5 -0
  223. package/dist/core/chart/analysis/trend-line-menu-summary.d.ts.map +1 -1
  224. package/dist/core/chart/analysis/trend-line-menu-summary.js +8 -0
  225. package/dist/core/chart/analysis/trend-line-menu-summary.js.map +1 -1
  226. package/dist/core/chart/analysis/z-score-analyze-tools.d.ts +115 -0
  227. package/dist/core/chart/analysis/z-score-analyze-tools.d.ts.map +1 -0
  228. package/dist/core/chart/analysis/z-score-analyze-tools.js +242 -0
  229. package/dist/core/chart/analysis/z-score-analyze-tools.js.map +1 -0
  230. package/dist/core/chart/analysis/z-score-highlight.d.ts +29 -0
  231. package/dist/core/chart/analysis/z-score-highlight.d.ts.map +1 -0
  232. package/dist/core/chart/analysis/z-score-highlight.js +39 -0
  233. package/dist/core/chart/analysis/z-score-highlight.js.map +1 -0
  234. package/dist/core/chart/apply-chart-drawings.d.ts +4 -0
  235. package/dist/core/chart/apply-chart-drawings.d.ts.map +1 -1
  236. package/dist/core/chart/apply-chart-drawings.js +10 -2
  237. package/dist/core/chart/apply-chart-drawings.js.map +1 -1
  238. package/dist/core/chart/chart-pattern-session-store.d.ts.map +1 -1
  239. package/dist/core/chart/chart-pattern-session-store.js +1 -0
  240. package/dist/core/chart/chart-pattern-session-store.js.map +1 -1
  241. package/dist/core/chart/customization-catalog.d.ts +1 -0
  242. package/dist/core/chart/customization-catalog.d.ts.map +1 -1
  243. package/dist/core/chart/customization-catalog.js +107 -6
  244. package/dist/core/chart/customization-catalog.js.map +1 -1
  245. package/dist/core/chart/depth/average.d.ts +24 -0
  246. package/dist/core/chart/depth/average.d.ts.map +1 -0
  247. package/dist/core/chart/depth/average.js +104 -0
  248. package/dist/core/chart/depth/average.js.map +1 -0
  249. package/dist/core/chart/depth/binance-fetch.d.ts +7 -0
  250. package/dist/core/chart/depth/binance-fetch.d.ts.map +1 -0
  251. package/dist/core/chart/depth/binance-fetch.js +35 -0
  252. package/dist/core/chart/depth/binance-fetch.js.map +1 -0
  253. package/dist/core/chart/depth/coinbase-fetch.d.ts +7 -0
  254. package/dist/core/chart/depth/coinbase-fetch.d.ts.map +1 -0
  255. package/dist/core/chart/depth/coinbase-fetch.js +39 -0
  256. package/dist/core/chart/depth/coinbase-fetch.js.map +1 -0
  257. package/dist/core/chart/depth/index.d.ts +9 -0
  258. package/dist/core/chart/depth/index.d.ts.map +1 -0
  259. package/dist/core/chart/depth/index.js +9 -0
  260. package/dist/core/chart/depth/index.js.map +1 -0
  261. package/dist/core/chart/depth/levels.d.ts +23 -0
  262. package/dist/core/chart/depth/levels.d.ts.map +1 -0
  263. package/dist/core/chart/depth/levels.js +68 -0
  264. package/dist/core/chart/depth/levels.js.map +1 -0
  265. package/dist/core/chart/depth/normalize.d.ts +22 -0
  266. package/dist/core/chart/depth/normalize.d.ts.map +1 -0
  267. package/dist/core/chart/depth/normalize.js +130 -0
  268. package/dist/core/chart/depth/normalize.js.map +1 -0
  269. package/dist/core/chart/depth/sampler.d.ts +19 -0
  270. package/dist/core/chart/depth/sampler.d.ts.map +1 -0
  271. package/dist/core/chart/depth/sampler.js +146 -0
  272. package/dist/core/chart/depth/sampler.js.map +1 -0
  273. package/dist/core/chart/depth/schemas.d.ts +71 -0
  274. package/dist/core/chart/depth/schemas.d.ts.map +1 -0
  275. package/dist/core/chart/depth/schemas.js +52 -0
  276. package/dist/core/chart/depth/schemas.js.map +1 -0
  277. package/dist/core/chart/depth/symbol-from-fetch.d.ts +12 -0
  278. package/dist/core/chart/depth/symbol-from-fetch.d.ts.map +1 -0
  279. package/dist/core/chart/depth/symbol-from-fetch.js +125 -0
  280. package/dist/core/chart/depth/symbol-from-fetch.js.map +1 -0
  281. package/dist/core/chart/display-downsample.d.ts.map +1 -1
  282. package/dist/core/chart/display-downsample.js +4 -14
  283. package/dist/core/chart/display-downsample.js.map +1 -1
  284. package/dist/core/chart/fetch-agent-view.d.ts.map +1 -1
  285. package/dist/core/chart/fetch-agent-view.js +6 -1
  286. package/dist/core/chart/fetch-agent-view.js.map +1 -1
  287. package/dist/core/chart/fetch-metadata.d.ts +2 -1
  288. package/dist/core/chart/fetch-metadata.d.ts.map +1 -1
  289. package/dist/core/chart/fetch-metadata.js +29 -3
  290. package/dist/core/chart/fetch-metadata.js.map +1 -1
  291. package/dist/core/chart/index.d.ts +1 -1
  292. package/dist/core/chart/index.d.ts.map +1 -1
  293. package/dist/core/chart/index.js +1 -1
  294. package/dist/core/chart/index.js.map +1 -1
  295. package/dist/core/chart/liquidity-depth-profile-replay.d.ts +7 -0
  296. package/dist/core/chart/liquidity-depth-profile-replay.d.ts.map +1 -0
  297. package/dist/core/chart/liquidity-depth-profile-replay.js +28 -0
  298. package/dist/core/chart/liquidity-depth-profile-replay.js.map +1 -0
  299. package/dist/core/chart/live/binding-extract.d.ts.map +1 -1
  300. package/dist/core/chart/live/binding-extract.js +66 -1
  301. package/dist/core/chart/live/binding-extract.js.map +1 -1
  302. package/dist/core/chart/live/fetch-tick.d.ts.map +1 -1
  303. package/dist/core/chart/live/fetch-tick.js +45 -1
  304. package/dist/core/chart/live/fetch-tick.js.map +1 -1
  305. package/dist/core/chart/live/index.d.ts +1 -1
  306. package/dist/core/chart/live/index.d.ts.map +1 -1
  307. package/dist/core/chart/live/index.js +1 -1
  308. package/dist/core/chart/live/index.js.map +1 -1
  309. package/dist/core/chart/live/schemas.d.ts +2 -0
  310. package/dist/core/chart/live/schemas.d.ts.map +1 -1
  311. package/dist/core/chart/live/schemas.js +2 -0
  312. package/dist/core/chart/live/schemas.js.map +1 -1
  313. package/dist/core/chart/overlay-schemas.d.ts +760 -0
  314. package/dist/core/chart/overlay-schemas.d.ts.map +1 -1
  315. package/dist/core/chart/overlay-schemas.js +211 -0
  316. package/dist/core/chart/overlay-schemas.js.map +1 -1
  317. package/dist/core/chart/overlays.d.ts +3 -0
  318. package/dist/core/chart/overlays.d.ts.map +1 -1
  319. package/dist/core/chart/overlays.js +779 -18
  320. package/dist/core/chart/overlays.js.map +1 -1
  321. package/dist/core/chart/point-normalize.d.ts.map +1 -1
  322. package/dist/core/chart/point-normalize.js +1 -0
  323. package/dist/core/chart/point-normalize.js.map +1 -1
  324. package/dist/core/chart/prepare-from-rows.d.ts +1513 -0
  325. package/dist/core/chart/prepare-from-rows.d.ts.map +1 -1
  326. package/dist/core/chart/prepare-from-rows.js +17 -2
  327. package/dist/core/chart/prepare-from-rows.js.map +1 -1
  328. package/dist/core/chart/prepare.d.ts.map +1 -1
  329. package/dist/core/chart/prepare.js +10 -2
  330. package/dist/core/chart/prepare.js.map +1 -1
  331. package/dist/core/chart/schemas.d.ts +815 -2
  332. package/dist/core/chart/schemas.d.ts.map +1 -1
  333. package/dist/core/chart/schemas.js +6 -2
  334. package/dist/core/chart/schemas.js.map +1 -1
  335. package/dist/core/chart/trade-position-replay.d.ts +19 -0
  336. package/dist/core/chart/trade-position-replay.d.ts.map +1 -0
  337. package/dist/core/chart/trade-position-replay.js +48 -0
  338. package/dist/core/chart/trade-position-replay.js.map +1 -0
  339. package/dist/core/chart-patterns/drawing-spec.d.ts.map +1 -1
  340. package/dist/core/chart-patterns/drawing-spec.js +7 -0
  341. package/dist/core/chart-patterns/drawing-spec.js.map +1 -1
  342. package/dist/core/chart-patterns/measured-move.d.ts.map +1 -1
  343. package/dist/core/chart-patterns/measured-move.js +35 -3
  344. package/dist/core/chart-patterns/measured-move.js.map +1 -1
  345. package/dist/core/chart-patterns/patterns/flag-pennant-shared.d.ts +62 -0
  346. package/dist/core/chart-patterns/patterns/flag-pennant-shared.d.ts.map +1 -0
  347. package/dist/core/chart-patterns/patterns/flag-pennant-shared.js +141 -0
  348. package/dist/core/chart-patterns/patterns/flag-pennant-shared.js.map +1 -0
  349. package/dist/core/chart-patterns/patterns/flag.d.ts.map +1 -1
  350. package/dist/core/chart-patterns/patterns/flag.js +77 -51
  351. package/dist/core/chart-patterns/patterns/flag.js.map +1 -1
  352. package/dist/core/chart-patterns/patterns/pennant.d.ts.map +1 -1
  353. package/dist/core/chart-patterns/patterns/pennant.js +74 -53
  354. package/dist/core/chart-patterns/patterns/pennant.js.map +1 -1
  355. package/dist/core/chart-patterns/recommendation.d.ts +7 -0
  356. package/dist/core/chart-patterns/recommendation.d.ts.map +1 -1
  357. package/dist/core/chart-patterns/recommendation.js +17 -0
  358. package/dist/core/chart-patterns/recommendation.js.map +1 -1
  359. package/dist/core/chart-patterns/scan.d.ts.map +1 -1
  360. package/dist/core/chart-patterns/scan.js +8 -3
  361. package/dist/core/chart-patterns/scan.js.map +1 -1
  362. package/dist/core/chart-patterns/types.d.ts +13 -0
  363. package/dist/core/chart-patterns/types.d.ts.map +1 -1
  364. package/dist/core/coinbase/candles.d.ts +7 -0
  365. package/dist/core/coinbase/candles.d.ts.map +1 -0
  366. package/dist/core/coinbase/candles.js +52 -0
  367. package/dist/core/coinbase/candles.js.map +1 -0
  368. package/dist/core/coinbase/client.d.ts +24 -0
  369. package/dist/core/coinbase/client.d.ts.map +1 -0
  370. package/dist/core/coinbase/client.js +86 -0
  371. package/dist/core/coinbase/client.js.map +1 -0
  372. package/dist/core/coinbase/credentials.d.ts +11 -0
  373. package/dist/core/coinbase/credentials.d.ts.map +1 -0
  374. package/dist/core/coinbase/credentials.js +47 -0
  375. package/dist/core/coinbase/credentials.js.map +1 -0
  376. package/dist/core/coinbase/granularity.d.ts +20 -0
  377. package/dist/core/coinbase/granularity.d.ts.map +1 -0
  378. package/dist/core/coinbase/granularity.js +69 -0
  379. package/dist/core/coinbase/granularity.js.map +1 -0
  380. package/dist/core/coinbase/index.d.ts +8 -0
  381. package/dist/core/coinbase/index.d.ts.map +1 -0
  382. package/dist/core/coinbase/index.js +8 -0
  383. package/dist/core/coinbase/index.js.map +1 -0
  384. package/dist/core/coinbase/jwt.d.ts +13 -0
  385. package/dist/core/coinbase/jwt.d.ts.map +1 -0
  386. package/dist/core/coinbase/jwt.js +41 -0
  387. package/dist/core/coinbase/jwt.js.map +1 -0
  388. package/dist/core/coinbase/public-api.d.ts +38 -0
  389. package/dist/core/coinbase/public-api.d.ts.map +1 -0
  390. package/dist/core/coinbase/public-api.js +203 -0
  391. package/dist/core/coinbase/public-api.js.map +1 -0
  392. package/dist/core/coinbase/schemas.d.ts +133 -0
  393. package/dist/core/coinbase/schemas.d.ts.map +1 -0
  394. package/dist/core/coinbase/schemas.js +105 -0
  395. package/dist/core/coinbase/schemas.js.map +1 -0
  396. package/dist/core/coinmarketcap/schemas.d.ts +8 -8
  397. package/dist/core/ta/calculate.d.ts.map +1 -1
  398. package/dist/core/ta/calculate.js +39 -0
  399. package/dist/core/ta/calculate.js.map +1 -1
  400. package/dist/core/ta/catalog.d.ts.map +1 -1
  401. package/dist/core/ta/catalog.js +2 -1
  402. package/dist/core/ta/catalog.js.map +1 -1
  403. package/dist/mcp/agent-host-catalog.d.ts +1 -1
  404. package/dist/mcp/agent-host-catalog.d.ts.map +1 -1
  405. package/dist/mcp/agent-host-catalog.js +1 -0
  406. package/dist/mcp/agent-host-catalog.js.map +1 -1
  407. package/dist/mcp/chart.d.ts.map +1 -1
  408. package/dist/mcp/chart.js +97 -9
  409. package/dist/mcp/chart.js.map +1 -1
  410. package/dist/mcp/coinbase-public/register.d.ts +6 -0
  411. package/dist/mcp/coinbase-public/register.d.ts.map +1 -0
  412. package/dist/mcp/coinbase-public/register.js +57 -0
  413. package/dist/mcp/coinbase-public/register.js.map +1 -0
  414. package/dist/mcp/coinmarketcap-public/register.d.ts.map +1 -1
  415. package/dist/mcp/coinmarketcap-public/register.js +8 -3
  416. package/dist/mcp/coinmarketcap-public/register.js.map +1 -1
  417. package/dist/mcp/deferred/optional-endpoint-groups.d.ts +1 -1
  418. package/dist/mcp/deferred/optional-endpoint-groups.d.ts.map +1 -1
  419. package/dist/mcp/deferred/optional-endpoint-groups.js +8 -0
  420. package/dist/mcp/deferred/optional-endpoint-groups.js.map +1 -1
  421. package/dist/mcp/deferred/tool-group-map.d.ts.map +1 -1
  422. package/dist/mcp/deferred/tool-group-map.js +10 -0
  423. package/dist/mcp/deferred/tool-group-map.js.map +1 -1
  424. package/dist/mcp/ohlcv-session-wrapper.d.ts.map +1 -1
  425. package/dist/mcp/ohlcv-session-wrapper.js +22 -1
  426. package/dist/mcp/ohlcv-session-wrapper.js.map +1 -1
  427. package/dist/mcp/resources/chart-analysis.md +11 -0
  428. package/dist/mcp/resources/chart.md +19 -9
  429. package/dist/mcp/resources/coinbase-public.md +31 -0
  430. package/dist/mcp/server/index.js +3 -0
  431. package/dist/mcp/server/index.js.map +1 -1
  432. package/dist/mcp/trade-tools.d.ts.map +1 -1
  433. package/dist/mcp/trade-tools.js +6 -1
  434. package/dist/mcp/trade-tools.js.map +1 -1
  435. package/package.json +2 -2
  436. package/dist/core/agent/mcp-servers-catalog.d.ts +0 -15
  437. package/dist/core/agent/mcp-servers-catalog.d.ts.map +0 -1
  438. package/dist/core/agent/mcp-servers-catalog.js +0 -125
  439. package/dist/core/agent/mcp-servers-catalog.js.map +0 -1
  440. package/dist/core/agent/webhooks-catalog.d.ts +0 -10
  441. package/dist/core/agent/webhooks-catalog.d.ts.map +0 -1
  442. package/dist/core/agent/webhooks-catalog.js +0 -19
  443. package/dist/core/agent/webhooks-catalog.js.map +0 -1
  444. package/dist/mcp/resources/trade-defaults-skill.md +0 -69
  445. package/dist/mcp/ta/resources/indicators.md +0 -86
@@ -1,11 +1,34 @@
1
1
  import { calculateTechnicalIndicator } from '../ta/calculate.js';
2
2
  import { PATTERN_OVERLAY_STYLE } from '../chart-patterns/drawing-spec.js';
3
3
  import { fibLevelShowsAxisLabel } from './analysis/key-level-fib-label.js';
4
+ import { chartTimeKey } from './volume-direction.js';
5
+ import { coerceFiniteNumber } from './point-normalize.js';
4
6
  const DEFAULT_MA_PERIOD = 20;
5
7
  const DEFAULT_BOLLINGER_PERIOD = 20;
6
8
  const DEFAULT_BOLLINGER_STD_DEV = 2;
7
9
  const DEFAULT_BOLLINGER_FILL_COLOR = '#6366f133';
10
+ /** Analysis/overlay desk default (aligned with TA catalog donchianchannels). */
11
+ const DEFAULT_DONCHIAN_PERIOD = 20;
12
+ const DEFAULT_DONCHIAN_FILL_COLOR = '#0ea5e933';
13
+ const DEFAULT_SUPERTREND_PERIOD = 10;
14
+ const DEFAULT_SUPERTREND_MULTIPLIER = 3;
15
+ const SUPERTREND_UP_COLOR = '#22c55e';
16
+ const SUPERTREND_DOWN_COLOR = '#ef4444';
17
+ /** Cap colored ST segments so total chart series stay under the expand limit. */
18
+ const MAX_SUPERTREND_SEGMENTS = 10;
19
+ const DEFAULT_ICHIMOKU_CONVERSION = 9;
20
+ const DEFAULT_ICHIMOKU_BASE = 26;
21
+ const DEFAULT_ICHIMOKU_SPAN = 52;
22
+ const DEFAULT_ICHIMOKU_DISPLACEMENT = 26;
23
+ const ICHIMOKU_TENKAN_COLOR = '#3b82f6';
24
+ const ICHIMOKU_KIJUN_COLOR = '#ef4444';
25
+ const ICHIMOKU_CHIKOU_COLOR = '#a855f7';
26
+ const ICHIMOKU_CLOUD_BULL_COLOR = '#22c55e33';
27
+ const ICHIMOKU_CLOUD_BEAR_COLOR = '#ef444433';
8
28
  const DEFAULT_RSI_PERIOD = 14;
29
+ const DEFAULT_ZSCORE_PERIOD = 20;
30
+ const DEFAULT_ZSCORE_ENTRY = 2;
31
+ const DEFAULT_ZSCORE_EXIT = 0.5;
9
32
  const MACD_HIST_UP = '#22c55e';
10
33
  const MACD_HIST_DOWN = '#ef4444';
11
34
  const ALL_FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];
@@ -16,8 +39,13 @@ function findSourceSeries(seriesList, sourceSeriesId) {
16
39
  }
17
40
  const times = [];
18
41
  const closes = [];
42
+ const highs = [];
43
+ const lows = [];
44
+ const volumes = [];
19
45
  let high = Number.NEGATIVE_INFINITY;
20
46
  let low = Number.POSITIVE_INFINITY;
47
+ let hasOhlc = false;
48
+ let hasRowVolume = true;
21
49
  for (const row of source.data) {
22
50
  const time = row.time;
23
51
  if (time == null) {
@@ -35,8 +63,18 @@ function findSourceSeries(seriesList, sourceSeriesId) {
35
63
  }
36
64
  times.push(time);
37
65
  closes.push(close);
66
+ highs.push(rowHigh);
67
+ lows.push(rowLow);
68
+ hasOhlc = true;
38
69
  high = Math.max(high, rowHigh);
39
70
  low = Math.min(low, rowLow);
71
+ const vol = coerceFiniteNumber(row.volume ?? row.volumeUSD ?? row.volumeUsd ?? row.v);
72
+ if (vol == null || vol < 0) {
73
+ hasRowVolume = false;
74
+ }
75
+ else {
76
+ volumes.push(vol);
77
+ }
40
78
  continue;
41
79
  }
42
80
  if (source.type === 'line' || source.type === 'area') {
@@ -48,6 +86,7 @@ function findSourceSeries(seriesList, sourceSeriesId) {
48
86
  closes.push(value);
49
87
  high = Math.max(high, value);
50
88
  low = Math.min(low, value);
89
+ hasRowVolume = false;
51
90
  }
52
91
  }
53
92
  if (times.length === 0) {
@@ -59,7 +98,77 @@ function findSourceSeries(seriesList, sourceSeriesId) {
59
98
  if (!Number.isFinite(high) || !Number.isFinite(low)) {
60
99
  return { ok: false, reason: `Overlay source "${sourceSeriesId}" has invalid high/low range.` };
61
100
  }
62
- return { ok: true, data: { times, closes, high, low } };
101
+ return {
102
+ ok: true,
103
+ data: {
104
+ times,
105
+ closes,
106
+ ...(hasOhlc ? { highs, lows } : {}),
107
+ ...(hasRowVolume && volumes.length === times.length ? { volumes } : {}),
108
+ high,
109
+ low,
110
+ },
111
+ };
112
+ }
113
+ function volumeByTimeFromSeriesList(seriesList) {
114
+ const map = new Map();
115
+ const histograms = seriesList.filter(s => s.type === 'histogram');
116
+ const preferred = histograms.find(s => s.id === 'volume') ??
117
+ histograms.find(s => /volume/i.test(s.label ?? '')) ??
118
+ histograms[0];
119
+ if (!preferred) {
120
+ return map;
121
+ }
122
+ for (const row of preferred.data) {
123
+ const time = row.time;
124
+ const value = coerceFiniteNumber(row.value);
125
+ if (time == null || value == null || value < 0) {
126
+ continue;
127
+ }
128
+ map.set(chartTimeKey(time), value);
129
+ }
130
+ return map;
131
+ }
132
+ function findSourceSeriesWithVolume(seriesList, sourceSeriesId, options) {
133
+ const sourceResult = findSourceSeries(seriesList, sourceSeriesId);
134
+ if (!sourceResult.ok) {
135
+ return sourceResult;
136
+ }
137
+ const source = sourceResult.data;
138
+ if (options?.requireOhlc && (!source.highs || !source.lows)) {
139
+ return {
140
+ ok: false,
141
+ reason: `Overlay source "${sourceSeriesId}" must be a candlestick series (high/low required).`,
142
+ };
143
+ }
144
+ let volumes = source.volumes;
145
+ if (!volumes || volumes.length !== source.times.length) {
146
+ const volByTime = volumeByTimeFromSeriesList(seriesList);
147
+ const aligned = [];
148
+ for (const time of source.times) {
149
+ const vol = volByTime.get(chartTimeKey(time));
150
+ if (vol == null) {
151
+ return {
152
+ ok: false,
153
+ reason: `Overlay needs volume for "${sourceSeriesId}" — add a volume histogram series ` +
154
+ `(or per-bar volume on candles). CoinGecko OHLC-only feeds have no volume.`,
155
+ };
156
+ }
157
+ aligned.push(vol);
158
+ }
159
+ volumes = aligned;
160
+ }
161
+ const highs = source.highs ?? source.closes;
162
+ const lows = source.lows ?? source.closes;
163
+ return {
164
+ ok: true,
165
+ data: {
166
+ ...source,
167
+ highs,
168
+ lows,
169
+ volumes,
170
+ },
171
+ };
63
172
  }
64
173
  function primaryTimeSpan(seriesList) {
65
174
  const primary = seriesList.find(s => s.type === 'candlestick' || s.type === 'line');
@@ -252,6 +361,405 @@ function computeBollingerOverlay(overlay, source) {
252
361
  ],
253
362
  };
254
363
  }
364
+ function computeDonchianOverlay(overlay, source) {
365
+ const period = overlay.period ?? DEFAULT_DONCHIAN_PERIOD;
366
+ const highs = source.highs;
367
+ const lows = source.lows;
368
+ if (!highs?.length || !lows?.length || highs.length !== source.closes.length) {
369
+ return {
370
+ ok: false,
371
+ reason: 'Donchian overlay requires a candlestick source series with high/low.',
372
+ };
373
+ }
374
+ const result = calculateTechnicalIndicator({
375
+ indicator: 'donchianchannels',
376
+ params: { period },
377
+ input: { high: highs, low: lows, close: source.closes },
378
+ options: { maxPoints: highs.length },
379
+ });
380
+ if (!result.ok) {
381
+ return result;
382
+ }
383
+ const rows = result.data.result;
384
+ if (!Array.isArray(rows) || rows.length === 0) {
385
+ return { ok: false, reason: 'Overlay donchian returned no data.' };
386
+ }
387
+ const upper = [];
388
+ const middle = [];
389
+ const lower = [];
390
+ const bandFill = [];
391
+ const aligned = alignObjectIndicatorRows(source.times, rows, result.data.warmupCount);
392
+ for (const { time, row } of aligned) {
393
+ const u = pickNumber(row, ['upper', 'Upper']);
394
+ const m = pickNumber(row, ['middle', 'Middle']);
395
+ const l = pickNumber(row, ['lower', 'Lower']);
396
+ if (u != null) {
397
+ upper.push({ time, value: u });
398
+ }
399
+ if (m != null) {
400
+ middle.push({ time, value: m });
401
+ }
402
+ if (l != null) {
403
+ lower.push({ time, value: l });
404
+ }
405
+ if (u != null && l != null) {
406
+ bandFill.push({ time, upper: u, lower: l });
407
+ }
408
+ }
409
+ if (middle.length === 0) {
410
+ return {
411
+ ok: false,
412
+ reason: `Overlay donchian(${period}) has no points after warmup.`,
413
+ };
414
+ }
415
+ const prefix = overlay.id ?? `dc${period}_${overlay.sourceSeriesId}`;
416
+ const baseStyle = overlay.style ?? { lineWidth: 1 };
417
+ const showFill = overlay.fill !== false;
418
+ const fillColor = overlay.style?.color ?? DEFAULT_DONCHIAN_FILL_COLOR;
419
+ const seriesOut = [];
420
+ if (showFill && bandFill.length > 0) {
421
+ seriesOut.push({
422
+ id: `${prefix}_fill`,
423
+ type: 'band',
424
+ label: `DC fill (${period})`,
425
+ data: bandFill,
426
+ priceScaleId: overlay.priceScaleId ?? 'right',
427
+ overlay: overlay.overlay ?? true,
428
+ lastValueVisible: false,
429
+ style: { color: fillColor, lineWidth: 1 },
430
+ });
431
+ }
432
+ return {
433
+ ok: true,
434
+ data: [
435
+ ...seriesOut,
436
+ {
437
+ id: `${prefix}_upper`,
438
+ type: 'line',
439
+ label: `DC upper (${period})`,
440
+ data: upper,
441
+ priceScaleId: overlay.priceScaleId ?? 'right',
442
+ overlay: overlay.overlay ?? true,
443
+ style: { ...baseStyle, lineStyle: 'dashed' },
444
+ },
445
+ {
446
+ id: `${prefix}_middle`,
447
+ type: 'line',
448
+ label: `DC middle (${period})`,
449
+ data: middle,
450
+ priceScaleId: overlay.priceScaleId ?? 'right',
451
+ overlay: overlay.overlay ?? true,
452
+ style: { ...baseStyle, lineStyle: 'solid' },
453
+ },
454
+ {
455
+ id: `${prefix}_lower`,
456
+ type: 'line',
457
+ label: `DC lower (${period})`,
458
+ data: lower,
459
+ priceScaleId: overlay.priceScaleId ?? 'right',
460
+ overlay: overlay.overlay ?? true,
461
+ style: { ...baseStyle, lineStyle: 'dashed' },
462
+ },
463
+ ],
464
+ };
465
+ }
466
+ function computeSupertrendOverlay(overlay, source) {
467
+ const period = overlay.period ?? DEFAULT_SUPERTREND_PERIOD;
468
+ const multiplier = overlay.multiplier ?? DEFAULT_SUPERTREND_MULTIPLIER;
469
+ const highs = source.highs;
470
+ const lows = source.lows;
471
+ if (!highs?.length || !lows?.length || highs.length !== source.closes.length) {
472
+ return {
473
+ ok: false,
474
+ reason: 'Supertrend overlay requires a candlestick source series with high/low.',
475
+ };
476
+ }
477
+ const result = calculateTechnicalIndicator({
478
+ indicator: 'supertrend',
479
+ params: { period, multiplier },
480
+ input: { high: highs, low: lows, close: source.closes },
481
+ options: { maxPoints: highs.length },
482
+ });
483
+ if (!result.ok) {
484
+ return result;
485
+ }
486
+ const rows = result.data.result;
487
+ if (!Array.isArray(rows) || rows.length === 0) {
488
+ return { ok: false, reason: 'Overlay supertrend returned no data.' };
489
+ }
490
+ const aligned = alignObjectIndicatorRows(source.times, rows, result.data.warmupCount);
491
+ const points = [];
492
+ for (const { time, row } of aligned) {
493
+ const value = pickNumber(row, ['supertrend', 'SuperTrend', 'Supertrend']);
494
+ const direction = pickNumber(row, ['direction', 'Direction']);
495
+ if (value == null || direction == null || !Number.isFinite(value)) {
496
+ continue;
497
+ }
498
+ points.push({ time, value, direction: direction >= 0 ? 1 : -1 });
499
+ }
500
+ if (points.length === 0) {
501
+ return {
502
+ ok: false,
503
+ reason: `Overlay supertrend(${period}, ${multiplier}) has no points after warmup.`,
504
+ };
505
+ }
506
+ const segments = [];
507
+ for (const pt of points) {
508
+ const last = segments[segments.length - 1];
509
+ if (!last || last.direction !== pt.direction) {
510
+ segments.push({ direction: pt.direction, data: [{ time: pt.time, value: pt.value }] });
511
+ }
512
+ else {
513
+ last.data.push({ time: pt.time, value: pt.value });
514
+ }
515
+ }
516
+ const kept = segments.length > MAX_SUPERTREND_SEGMENTS
517
+ ? segments.slice(segments.length - MAX_SUPERTREND_SEGMENTS)
518
+ : segments;
519
+ const prefix = overlay.id ?? `st${period}x${multiplier}_${overlay.sourceSeriesId}`;
520
+ const lineWidth = overlay.style?.lineWidth ?? 2;
521
+ const seriesOut = kept.map((seg, i) => ({
522
+ id: `${prefix}_seg${i}`,
523
+ type: 'line',
524
+ label: i === kept.length - 1 ? `Supertrend (${period}, ${multiplier})` : `ST seg ${i + 1}`,
525
+ data: seg.data,
526
+ priceScaleId: overlay.priceScaleId ?? 'right',
527
+ overlay: overlay.overlay ?? true,
528
+ lastValueVisible: i === kept.length - 1,
529
+ style: {
530
+ lineWidth,
531
+ lineStyle: 'solid',
532
+ color: seg.direction >= 0 ? SUPERTREND_UP_COLOR : SUPERTREND_DOWN_COLOR,
533
+ },
534
+ }));
535
+ return { ok: true, data: seriesOut };
536
+ }
537
+ function medianBarIntervalSec(times) {
538
+ const secs = [];
539
+ for (const t of times) {
540
+ const s = chartTimeSec(t);
541
+ if (s != null) {
542
+ secs.push(s);
543
+ }
544
+ }
545
+ if (secs.length < 2) {
546
+ return null;
547
+ }
548
+ const deltas = [];
549
+ for (let i = 1; i < secs.length; i++) {
550
+ const d = secs[i] - secs[i - 1];
551
+ if (d > 0) {
552
+ deltas.push(d);
553
+ }
554
+ }
555
+ if (deltas.length === 0) {
556
+ return null;
557
+ }
558
+ deltas.sort((a, b) => a - b);
559
+ return deltas[Math.floor(deltas.length / 2)];
560
+ }
561
+ function extendChartTime(last, intervalSec, steps) {
562
+ const sec = chartTimeSec(last);
563
+ if (sec == null || typeof last !== 'number') {
564
+ // Business-day charts: fall back to unix seconds from last if possible.
565
+ if (sec == null) {
566
+ return last;
567
+ }
568
+ return sec + intervalSec * steps;
569
+ }
570
+ return last + intervalSec * steps;
571
+ }
572
+ function computeIchimokuOverlay(overlay, source) {
573
+ const conversionPeriod = overlay.conversionPeriod ?? DEFAULT_ICHIMOKU_CONVERSION;
574
+ const basePeriod = overlay.basePeriod ?? DEFAULT_ICHIMOKU_BASE;
575
+ const spanPeriod = overlay.spanPeriod ?? DEFAULT_ICHIMOKU_SPAN;
576
+ const displacement = overlay.displacement ?? DEFAULT_ICHIMOKU_DISPLACEMENT;
577
+ const highs = source.highs;
578
+ const lows = source.lows;
579
+ if (!highs?.length || !lows?.length || highs.length !== source.closes.length) {
580
+ return {
581
+ ok: false,
582
+ reason: 'Ichimoku overlay requires a candlestick source series with high/low.',
583
+ };
584
+ }
585
+ const result = calculateTechnicalIndicator({
586
+ indicator: 'ichimokukinkouhyou',
587
+ params: { conversionPeriod, basePeriod, spanPeriod, displacement },
588
+ input: { high: highs, low: lows, close: source.closes },
589
+ options: { maxPoints: highs.length },
590
+ });
591
+ if (!result.ok) {
592
+ return result;
593
+ }
594
+ const rows = result.data.result;
595
+ if (!Array.isArray(rows) || rows.length === 0) {
596
+ return { ok: false, reason: 'Overlay ichimoku returned no data.' };
597
+ }
598
+ const aligned = alignObjectIndicatorRows(source.times, rows, result.data.warmupCount);
599
+ const tenkan = [];
600
+ const kijun = [];
601
+ const spanPoints = [];
602
+ const intervalSec = medianBarIntervalSec(source.times) ?? 3600;
603
+ const alignOffset = rows.length < source.times.length ? source.times.length - rows.length : 0;
604
+ for (let i = 0; i < aligned.length; i++) {
605
+ const { time, row } = aligned[i];
606
+ const conversion = pickNumber(row, ['conversion', 'Conversion', 'tenkan', 'Tenkan']);
607
+ const base = pickNumber(row, ['base', 'Base', 'kijun', 'Kijun']);
608
+ const spanA = pickNumber(row, ['spanA', 'SpanA', 'senkouA', 'SenkouA']);
609
+ const spanB = pickNumber(row, ['spanB', 'SpanB', 'senkouB', 'SenkouB']);
610
+ if (conversion != null) {
611
+ tenkan.push({ time, value: conversion });
612
+ }
613
+ if (base != null) {
614
+ kijun.push({ time, value: base });
615
+ }
616
+ if (spanA != null && spanB != null) {
617
+ const sourceIndex = alignOffset + i;
618
+ const targetIndex = sourceIndex + displacement;
619
+ let cloudTime;
620
+ if (targetIndex >= 0 && targetIndex < source.times.length) {
621
+ cloudTime = source.times[targetIndex];
622
+ }
623
+ else if (source.times.length > 0 && targetIndex >= source.times.length) {
624
+ const last = source.times[source.times.length - 1];
625
+ const stepsBeyond = targetIndex - (source.times.length - 1);
626
+ cloudTime = extendChartTime(last, intervalSec, stepsBeyond);
627
+ }
628
+ else {
629
+ continue;
630
+ }
631
+ spanPoints.push({ time: cloudTime, spanA, spanB });
632
+ }
633
+ }
634
+ if (tenkan.length === 0 && kijun.length === 0) {
635
+ return {
636
+ ok: false,
637
+ reason: `Overlay ichimoku(${conversionPeriod}/${basePeriod}/${spanPeriod}) has no points after warmup.`,
638
+ };
639
+ }
640
+ const prefix = overlay.id ?? `ichi_${overlay.sourceSeriesId}`;
641
+ const priceScaleId = overlay.priceScaleId ?? 'right';
642
+ const isOverlay = overlay.overlay ?? true;
643
+ const showFill = overlay.fill !== false;
644
+ const showChikou = overlay.chikou !== false;
645
+ const seriesOut = [];
646
+ if (showFill && spanPoints.length > 0) {
647
+ const bullBands = [];
648
+ const bearBands = [];
649
+ for (const pt of spanPoints) {
650
+ const upper = Math.max(pt.spanA, pt.spanB);
651
+ const lower = Math.min(pt.spanA, pt.spanB);
652
+ const bandPt = { time: pt.time, upper, lower };
653
+ if (pt.spanA >= pt.spanB) {
654
+ bullBands.push(bandPt);
655
+ }
656
+ else {
657
+ bearBands.push(bandPt);
658
+ }
659
+ }
660
+ if (bullBands.length > 0) {
661
+ seriesOut.push({
662
+ id: `${prefix}_cloud_bull`,
663
+ type: 'band',
664
+ label: 'Ichimoku cloud (bull)',
665
+ data: bullBands,
666
+ priceScaleId,
667
+ overlay: isOverlay,
668
+ lastValueVisible: false,
669
+ style: { color: ICHIMOKU_CLOUD_BULL_COLOR, lineWidth: 1 },
670
+ });
671
+ }
672
+ if (bearBands.length > 0) {
673
+ seriesOut.push({
674
+ id: `${prefix}_cloud_bear`,
675
+ type: 'band',
676
+ label: 'Ichimoku cloud (bear)',
677
+ data: bearBands,
678
+ priceScaleId,
679
+ overlay: isOverlay,
680
+ lastValueVisible: false,
681
+ style: { color: ICHIMOKU_CLOUD_BEAR_COLOR, lineWidth: 1 },
682
+ });
683
+ }
684
+ }
685
+ if (tenkan.length > 0) {
686
+ seriesOut.push({
687
+ id: `${prefix}_tenkan`,
688
+ type: 'line',
689
+ label: `Tenkan (${conversionPeriod})`,
690
+ data: tenkan,
691
+ priceScaleId,
692
+ overlay: isOverlay,
693
+ style: { color: ICHIMOKU_TENKAN_COLOR, lineWidth: 1, lineStyle: 'solid' },
694
+ });
695
+ }
696
+ if (kijun.length > 0) {
697
+ seriesOut.push({
698
+ id: `${prefix}_kijun`,
699
+ type: 'line',
700
+ label: `Kijun (${basePeriod})`,
701
+ data: kijun,
702
+ priceScaleId,
703
+ overlay: isOverlay,
704
+ style: { color: ICHIMOKU_KIJUN_COLOR, lineWidth: 1, lineStyle: 'solid' },
705
+ });
706
+ }
707
+ // Senkou outline lines (forward-displaced).
708
+ const spanALine = [];
709
+ const spanBLine = [];
710
+ for (const pt of spanPoints) {
711
+ spanALine.push({ time: pt.time, value: pt.spanA });
712
+ spanBLine.push({ time: pt.time, value: pt.spanB });
713
+ }
714
+ if (spanALine.length > 0) {
715
+ seriesOut.push({
716
+ id: `${prefix}_spanA`,
717
+ type: 'line',
718
+ label: 'Senkou A',
719
+ data: spanALine,
720
+ priceScaleId,
721
+ overlay: isOverlay,
722
+ lastValueVisible: false,
723
+ style: { color: '#22c55e', lineWidth: 1, lineStyle: 'dashed' },
724
+ });
725
+ }
726
+ if (spanBLine.length > 0) {
727
+ seriesOut.push({
728
+ id: `${prefix}_spanB`,
729
+ type: 'line',
730
+ label: 'Senkou B',
731
+ data: spanBLine,
732
+ priceScaleId,
733
+ overlay: isOverlay,
734
+ lastValueVisible: false,
735
+ style: { color: '#ef4444', lineWidth: 1, lineStyle: 'dashed' },
736
+ });
737
+ }
738
+ if (showChikou && displacement > 0 && source.closes.length > displacement) {
739
+ const chikou = [];
740
+ for (let i = displacement; i < source.closes.length; i++) {
741
+ const close = source.closes[i];
742
+ const time = source.times[i - displacement];
743
+ if (time == null || !Number.isFinite(close)) {
744
+ continue;
745
+ }
746
+ chikou.push({ time, value: close });
747
+ }
748
+ if (chikou.length > 0) {
749
+ seriesOut.push({
750
+ id: `${prefix}_chikou`,
751
+ type: 'line',
752
+ label: `Chikou (${displacement})`,
753
+ data: chikou,
754
+ priceScaleId,
755
+ overlay: isOverlay,
756
+ lastValueVisible: false,
757
+ style: { color: ICHIMOKU_CHIKOU_COLOR, lineWidth: 1, lineStyle: 'dotted' },
758
+ });
759
+ }
760
+ }
761
+ return { ok: true, data: seriesOut };
762
+ }
255
763
  function horizontalLineData(timeStart, timeEnd, value) {
256
764
  return [
257
765
  { time: timeStart, value },
@@ -795,6 +1303,103 @@ function oscillatorPaneId(overlay, index) {
795
1303
  const base = overlay.id ?? `${overlay.type}_${index}`;
796
1304
  return `osc_${base.replace(/[^a-zA-Z0-9_-]/g, '_')}`;
797
1305
  }
1306
+ function isOscillatorOverlayType(type) {
1307
+ return (type === 'rsi' ||
1308
+ type === 'zscore' ||
1309
+ type === 'macd' ||
1310
+ type === 'stochasticrsi' ||
1311
+ type === 'obv' ||
1312
+ type === 'ad' ||
1313
+ type === 'adosc');
1314
+ }
1315
+ /** Resolve pane ids for oscillator overlays in the same order expandChartOverlays uses. */
1316
+ export function resolveOscillatorPaneIds(overlays) {
1317
+ const out = {};
1318
+ if (!overlays?.length) {
1319
+ return out;
1320
+ }
1321
+ let oscillatorIndex = 0;
1322
+ for (const overlay of overlays) {
1323
+ if (isOscillatorOverlayType(overlay.type)) {
1324
+ const paneId = oscillatorPaneId(overlay, oscillatorIndex++);
1325
+ if (out[overlay.type] == null) {
1326
+ out[overlay.type] = paneId;
1327
+ }
1328
+ }
1329
+ }
1330
+ return out;
1331
+ }
1332
+ function divergenceSegmentStyle(kind, base) {
1333
+ const bullish = kind === 'regular_bullish' || kind === 'hidden_bullish';
1334
+ const hidden = kind === 'hidden_bullish' || kind === 'hidden_bearish';
1335
+ return {
1336
+ color: bullish ? '#3b82f6' : '#ef4444',
1337
+ lineWidth: 2,
1338
+ lineStyle: hidden ? 'dashed' : 'solid',
1339
+ ...base,
1340
+ };
1341
+ }
1342
+ function chartTimeToUnix(time) {
1343
+ if (typeof time === 'number' && Number.isFinite(time)) {
1344
+ return time;
1345
+ }
1346
+ if (time && typeof time === 'object' && 'year' in time) {
1347
+ return Math.floor(Date.UTC(time.year, time.month - 1, time.day) / 1000);
1348
+ }
1349
+ return null;
1350
+ }
1351
+ function computeDivergenceOverlay(overlay, paneByOsc) {
1352
+ const prefix = overlay.id ?? 'divergence';
1353
+ const seriesOut = [];
1354
+ for (let i = 0; i < overlay.segments.length; i++) {
1355
+ const seg = overlay.segments[i];
1356
+ const paneId = seg.oscillatorPaneId ?? paneByOsc[seg.oscillator];
1357
+ if (!paneId) {
1358
+ return {
1359
+ ok: false,
1360
+ reason: `Divergence segment needs ${seg.oscillator} pane — ensure that oscillator overlay is present.`,
1361
+ };
1362
+ }
1363
+ const style = divergenceSegmentStyle(seg.kind, overlay.style);
1364
+ const pA = chartTimeToUnix(seg.price.pointA.time);
1365
+ const pB = chartTimeToUnix(seg.price.pointB.time);
1366
+ const oA = chartTimeToUnix(seg.oscillatorLine.pointA.time);
1367
+ const oB = chartTimeToUnix(seg.oscillatorLine.pointB.time);
1368
+ if (pA == null || pB == null || oA == null || oB == null) {
1369
+ return { ok: false, reason: 'Divergence segment has invalid times.' };
1370
+ }
1371
+ const label = seg.label?.trim() || seg.kind.replace(/_/g, ' ');
1372
+ seriesOut.push({
1373
+ id: `${prefix}_price_${i}`,
1374
+ type: 'line',
1375
+ label: `${label} (price)`,
1376
+ data: [
1377
+ { time: pA, value: seg.price.pointA.price },
1378
+ { time: pB, value: seg.price.pointB.price },
1379
+ ],
1380
+ priceScaleId: 'right',
1381
+ overlay: true,
1382
+ style,
1383
+ });
1384
+ seriesOut.push({
1385
+ id: `${prefix}_osc_${i}`,
1386
+ type: 'line',
1387
+ label: `${label} (${seg.oscillator})`,
1388
+ data: [
1389
+ { time: oA, value: seg.oscillatorLine.pointA.value },
1390
+ { time: oB, value: seg.oscillatorLine.pointB.value },
1391
+ ],
1392
+ priceScaleId: 'right',
1393
+ overlay: true,
1394
+ paneId,
1395
+ style,
1396
+ });
1397
+ }
1398
+ if (!seriesOut.length) {
1399
+ return { ok: false, reason: 'divergence produced no drawable geometry.' };
1400
+ }
1401
+ return { ok: true, data: seriesOut };
1402
+ }
798
1403
  function tagSeriesPane(series, paneId) {
799
1404
  return series.map(s => ({ ...s, paneId }));
800
1405
  }
@@ -844,6 +1449,80 @@ function computeRsiOverlay(overlay, source, paneId) {
844
1449
  ], paneId),
845
1450
  };
846
1451
  }
1452
+ function computeZScoreOverlay(overlay, source, paneId) {
1453
+ const period = overlay.period ?? DEFAULT_ZSCORE_PERIOD;
1454
+ const entryZ = overlay.entryZ ?? DEFAULT_ZSCORE_ENTRY;
1455
+ const exitZ = overlay.exitZ ?? DEFAULT_ZSCORE_EXIT;
1456
+ const smaResult = calculateTechnicalIndicator({
1457
+ indicator: 'sma',
1458
+ params: { period },
1459
+ input: { values: source.closes },
1460
+ options: { maxPoints: source.closes.length },
1461
+ });
1462
+ if (!smaResult.ok) {
1463
+ return smaResult;
1464
+ }
1465
+ const sdResult = calculateTechnicalIndicator({
1466
+ indicator: 'sd',
1467
+ params: { period },
1468
+ input: { values: source.closes },
1469
+ options: { maxPoints: source.closes.length },
1470
+ });
1471
+ if (!sdResult.ok) {
1472
+ return sdResult;
1473
+ }
1474
+ const smaAligned = alignNumericIndicator(source.times, smaResult.data.result, smaResult.data.warmupCount);
1475
+ const sdAligned = alignNumericIndicator(source.times, sdResult.data.result, sdResult.data.warmupCount);
1476
+ const sdByTime = new Map(sdAligned.map(p => [String(p.time), p.value]));
1477
+ const zLine = [];
1478
+ for (let i = 0; i < source.closes.length; i++) {
1479
+ const time = source.times[i];
1480
+ const close = source.closes[i];
1481
+ const smaPoint = smaAligned.find(p => p.time === time);
1482
+ const sd = sdByTime.get(String(time));
1483
+ if (smaPoint == null || sd == null || !Number.isFinite(sd) || sd <= 0) {
1484
+ continue;
1485
+ }
1486
+ zLine.push({ time, value: (close - smaPoint.value) / sd });
1487
+ }
1488
+ if (zLine.length === 0) {
1489
+ return { ok: false, reason: `Overlay zscore(${period}) has no points after warmup.` };
1490
+ }
1491
+ const prefix = overlay.id ?? `zscore${period}_${overlay.sourceSeriesId}`;
1492
+ const guide = (level, idSuffix, label, dashed = true) => ({
1493
+ id: `${prefix}_${idSuffix}`,
1494
+ type: 'line',
1495
+ label,
1496
+ data: zLine.map(p => ({ time: p.time, value: level })),
1497
+ priceScaleId: 'right',
1498
+ overlay: true,
1499
+ lastValueVisible: false,
1500
+ style: {
1501
+ lineStyle: dashed ? 'dashed' : 'dotted',
1502
+ lineWidth: 1,
1503
+ color: '#94a3b8',
1504
+ },
1505
+ });
1506
+ const seriesOut = [
1507
+ {
1508
+ id: `${prefix}_z`,
1509
+ type: 'line',
1510
+ label: overlay.label ?? `Z(${period})`,
1511
+ data: zLine,
1512
+ priceScaleId: 'right',
1513
+ overlay: true,
1514
+ style: overlay.style ?? { lineStyle: 'solid', lineWidth: 2, color: '#7c3aed' },
1515
+ },
1516
+ guide(0, 'zero', 'Z=0', false),
1517
+ guide(entryZ, 'entry_pos', `+${entryZ}`),
1518
+ guide(-entryZ, 'entry_neg', `−${entryZ}`),
1519
+ ];
1520
+ if (exitZ > 0) {
1521
+ seriesOut.push(guide(exitZ, 'exit_pos', `+${exitZ}`));
1522
+ seriesOut.push(guide(-exitZ, 'exit_neg', `−${exitZ}`));
1523
+ }
1524
+ return { ok: true, data: tagSeriesPane(seriesOut, paneId) };
1525
+ }
847
1526
  function computeMacdOverlay(overlay, source, paneId) {
848
1527
  const params = {
849
1528
  ...(overlay.fastPeriod != null ? { fastPeriod: overlay.fastPeriod } : {}),
@@ -922,6 +1601,59 @@ function computeMacdOverlay(overlay, source, paneId) {
922
1601
  ], paneId),
923
1602
  };
924
1603
  }
1604
+ function computeVolumeLineOverlay(overlay, source, paneId) {
1605
+ const indicator = overlay.type === 'ad' ? 'adl' : overlay.type === 'obv' ? 'obv' : 'adosc';
1606
+ const params = overlay.type === 'adosc'
1607
+ ? {
1608
+ ...(overlay.fastPeriod != null ? { fastPeriod: overlay.fastPeriod } : {}),
1609
+ ...(overlay.slowPeriod != null ? { slowPeriod: overlay.slowPeriod } : {}),
1610
+ }
1611
+ : {};
1612
+ const input = overlay.type === 'obv'
1613
+ ? { close: source.closes, volume: source.volumes }
1614
+ : {
1615
+ high: source.highs,
1616
+ low: source.lows,
1617
+ close: source.closes,
1618
+ volume: source.volumes,
1619
+ };
1620
+ const result = calculateTechnicalIndicator({
1621
+ indicator,
1622
+ params,
1623
+ input,
1624
+ options: { maxPoints: source.closes.length },
1625
+ });
1626
+ if (!result.ok) {
1627
+ return result;
1628
+ }
1629
+ const data = alignNumericIndicator(source.times, result.data.result, result.data.warmupCount);
1630
+ if (data.length === 0) {
1631
+ return {
1632
+ ok: false,
1633
+ reason: `Overlay ${overlay.type} has no points after warmup (need more history or volume).`,
1634
+ };
1635
+ }
1636
+ const defaultLabel = overlay.type === 'obv'
1637
+ ? 'OBV'
1638
+ : overlay.type === 'ad'
1639
+ ? 'A/D'
1640
+ : `ADOSC(${overlay.fastPeriod ?? 3},${overlay.slowPeriod ?? 10})`;
1641
+ const id = overlay.id ?? `${overlay.type}_${overlay.sourceSeriesId}`;
1642
+ return {
1643
+ ok: true,
1644
+ data: tagSeriesPane([
1645
+ {
1646
+ id,
1647
+ type: 'line',
1648
+ label: overlay.label ?? defaultLabel,
1649
+ data,
1650
+ priceScaleId: 'right',
1651
+ overlay: true,
1652
+ style: overlay.style ?? { lineStyle: 'solid', lineWidth: 2, color: '#0ea5e9' },
1653
+ },
1654
+ ], paneId),
1655
+ };
1656
+ }
925
1657
  function computeStochasticRsiOverlay(overlay, source, paneId) {
926
1658
  const params = {
927
1659
  ...(overlay.rsiPeriod != null ? { rsiPeriod: overlay.rsiPeriod } : {}),
@@ -1005,13 +1737,18 @@ export function expandChartOverlays(baseSeries, overlays) {
1005
1737
  }
1006
1738
  const expanded = [...baseSeries];
1007
1739
  let oscillatorIndex = 0;
1740
+ const paneByOsc = resolveOscillatorPaneIds(overlays);
1008
1741
  for (const overlay of overlays) {
1742
+ if (overlay.type === 'trade_position' || overlay.type === 'liquidity_depth_profile') {
1743
+ continue;
1744
+ }
1009
1745
  let overlaySeries;
1010
1746
  if (overlay.type === 'horizontal_levels' ||
1011
1747
  overlay.type === 'pivot_levels' ||
1012
1748
  overlay.type === 'trend_lines' ||
1013
1749
  overlay.type === 'chart_pattern' ||
1014
- overlay.type === 'elliott_waves') {
1750
+ overlay.type === 'elliott_waves' ||
1751
+ overlay.type === 'divergence') {
1015
1752
  const span = primaryTimeSpan(baseSeries);
1016
1753
  if (!span.ok) {
1017
1754
  return span;
@@ -1028,6 +1765,9 @@ export function expandChartOverlays(baseSeries, overlays) {
1028
1765
  else if (overlay.type === 'elliott_waves') {
1029
1766
  overlaySeries = computeElliottWavesOverlay(overlay, span.data.timeStart, span.data.timeEnd);
1030
1767
  }
1768
+ else if (overlay.type === 'divergence') {
1769
+ overlaySeries = computeDivergenceOverlay(overlay, paneByOsc);
1770
+ }
1031
1771
  else {
1032
1772
  overlaySeries = computeTrendLinesOverlay(overlay, span.data.timeStart, span.data.timeEnd);
1033
1773
  }
@@ -1054,25 +1794,37 @@ export function expandChartOverlays(baseSeries, overlays) {
1054
1794
  }
1055
1795
  overlaySeries = computeFibonacciOverlay(overlay, span.data.timeStart, span.data.timeEnd, range);
1056
1796
  }
1057
- else if (overlay.type === 'rsi' ||
1058
- overlay.type === 'macd' ||
1059
- overlay.type === 'stochasticrsi') {
1060
- const sourceResult = findSourceSeries(baseSeries, overlay.sourceSeriesId);
1061
- if (!sourceResult.ok) {
1062
- return sourceResult;
1063
- }
1797
+ else if (isOscillatorOverlayType(overlay.type)) {
1064
1798
  const paneId = oscillatorPaneId(overlay, oscillatorIndex++);
1065
- if (overlay.type === 'rsi') {
1066
- overlaySeries = computeRsiOverlay(overlay, sourceResult.data, paneId);
1067
- }
1068
- else if (overlay.type === 'macd') {
1069
- overlaySeries = computeMacdOverlay(overlay, sourceResult.data, paneId);
1070
- }
1071
- else if (overlay.type === 'stochasticrsi') {
1072
- overlaySeries = computeStochasticRsiOverlay(overlay, sourceResult.data, paneId);
1799
+ if (overlay.type === 'obv' ||
1800
+ overlay.type === 'ad' ||
1801
+ overlay.type === 'adosc') {
1802
+ const sourceResult = findSourceSeriesWithVolume(baseSeries, overlay.sourceSeriesId, { requireOhlc: overlay.type !== 'obv' });
1803
+ if (!sourceResult.ok) {
1804
+ return sourceResult;
1805
+ }
1806
+ overlaySeries = computeVolumeLineOverlay(overlay, sourceResult.data, paneId);
1073
1807
  }
1074
1808
  else {
1075
- return { ok: false, reason: `Unsupported oscillator overlay type.` };
1809
+ const sourceResult = findSourceSeries(baseSeries, overlay.sourceSeriesId);
1810
+ if (!sourceResult.ok) {
1811
+ return sourceResult;
1812
+ }
1813
+ if (overlay.type === 'rsi') {
1814
+ overlaySeries = computeRsiOverlay(overlay, sourceResult.data, paneId);
1815
+ }
1816
+ else if (overlay.type === 'zscore') {
1817
+ overlaySeries = computeZScoreOverlay(overlay, sourceResult.data, paneId);
1818
+ }
1819
+ else if (overlay.type === 'macd') {
1820
+ overlaySeries = computeMacdOverlay(overlay, sourceResult.data, paneId);
1821
+ }
1822
+ else if (overlay.type === 'stochasticrsi') {
1823
+ overlaySeries = computeStochasticRsiOverlay(overlay, sourceResult.data, paneId);
1824
+ }
1825
+ else {
1826
+ return { ok: false, reason: `Unsupported oscillator overlay type.` };
1827
+ }
1076
1828
  }
1077
1829
  }
1078
1830
  else {
@@ -1086,6 +1838,15 @@ export function expandChartOverlays(baseSeries, overlays) {
1086
1838
  else if (overlay.type === 'bollinger') {
1087
1839
  overlaySeries = computeBollingerOverlay(overlay, sourceResult.data);
1088
1840
  }
1841
+ else if (overlay.type === 'donchian') {
1842
+ overlaySeries = computeDonchianOverlay(overlay, sourceResult.data);
1843
+ }
1844
+ else if (overlay.type === 'supertrend') {
1845
+ overlaySeries = computeSupertrendOverlay(overlay, sourceResult.data);
1846
+ }
1847
+ else if (overlay.type === 'ichimoku') {
1848
+ overlaySeries = computeIchimokuOverlay(overlay, sourceResult.data);
1849
+ }
1089
1850
  else {
1090
1851
  return { ok: false, reason: `Unsupported overlay type.` };
1091
1852
  }