dexbot 1.4.20 → 1.4.22

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 (674) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +23 -13
  3. package/analysis/ama_fitting/analyze_ama_price_changes.ts +7 -3
  4. package/analysis/ama_fitting/analyze_lambda_vs_slow.ts +3 -3
  5. package/analysis/ama_fitting/calibrate_convergence_er.ts +8 -6
  6. package/analysis/ama_fitting/fetch_lp_candles.ts +8 -3
  7. package/analysis/ama_fitting/generate_unified_comparison_chart.ts +30 -67
  8. package/analysis/ama_fitting/optimizer_high_resolution.ts +22 -13
  9. package/analysis/ama_fitting/package.json +1 -1
  10. package/analysis/analyze_derivatives.ts +4 -4
  11. package/analysis/analyze_dynamic_weight.ts +21 -5
  12. package/analysis/analyze_kalman.ts +54 -25
  13. package/analysis/analyze_regime.ts +2 -2
  14. package/analysis/analyze_regime_windows.ts +27 -19
  15. package/analysis/analyze_risk_profile.ts +3 -3
  16. package/analysis/analyze_trade_heatmap.ts +3 -3
  17. package/analysis/analyze_volatility.ts +2 -2
  18. package/analysis/bot_fitting/README.md +93 -19
  19. package/analysis/bot_fitting/backtest_ama_sweep.ts +316 -199
  20. package/analysis/bot_fitting/backtest_bot_fitting.ts +520 -85
  21. package/analysis/bot_fitting/shared_utils.ts +16 -10
  22. package/analysis/bot_key_utils.ts +14 -11
  23. package/analysis/bot_usage/discover_bot_accounts.ts +5 -3
  24. package/analysis/bot_usage/kibana_bot_queries.ts +2 -257
  25. package/analysis/chart_css.ts +6 -4
  26. package/analysis/chart_ui.ts +0 -1
  27. package/analysis/chart_utils.ts +11 -2
  28. package/analysis/derivative_chart_generator.ts +2 -2
  29. package/analysis/math_utils.ts +1 -8
  30. package/analysis/price_sources.ts +8 -2
  31. package/analysis/resolve_source.ts +1 -1
  32. package/analysis/results/ama_sweep_results_lp_pool_133_1h.json +2455 -0
  33. package/analysis/results/bot_fitting_results_lp_pool_133_1h.json +218 -0
  34. package/analysis/trade_profitability.ts +61 -28
  35. package/analysis/tradingview/analyze_tradingview.ts +1 -1
  36. package/analysis/tradingview/h-bts_tradingview.html +1570 -0
  37. package/analysis/tradingview/t-bts_tradingview.html +1570 -0
  38. package/analysis/tradingview/tradingview_uplot_chart_generator.ts +302 -74
  39. package/analysis/trend_detection/DYNAMIC_WEIGHT_RESEARCH.md +1 -1
  40. package/analysis/trend_detection/derivative_analyzer.ts +12 -3
  41. package/analysis/trend_detection/dynamic_weight_chart_generator.ts +25 -27
  42. package/analysis/trend_detection/hurst_analyzer.ts +1 -1
  43. package/analysis/trend_detection/kalman_chart_generator.ts +42 -14
  44. package/analysis/trend_detection/package.json +1 -1
  45. package/analysis/trend_detection/regime_chart_generator.ts +39 -19
  46. package/analysis/trend_detection/tests/test_kalman_trend.ts +1 -1
  47. package/analysis/trend_detection/tests/test_kalman_velocity_smoothing.ts +1 -1
  48. package/analysis/trend_detection/volatility_chart_generator.ts +1 -1
  49. package/claw/ecosystem.config.cjs +2 -3
  50. package/claw/examples/memu_integration_example.ts +17 -17
  51. package/claw/index.ts +1 -1
  52. package/claw/modules/chain_actions.ts +51 -54
  53. package/claw/modules/chain_broadcast.ts +66 -104
  54. package/claw/modules/claw_bridge.ts +63 -83
  55. package/claw/modules/claw_catalog.ts +48 -17
  56. package/claw/modules/claw_infra.ts +1 -5
  57. package/claw/modules/claw_launcher.ts +48 -50
  58. package/claw/modules/claw_skill_md.ts +15 -21
  59. package/claw/modules/credit_runtime_adapter.ts +3 -19
  60. package/claw/modules/decision_loop.ts +9 -9
  61. package/claw/modules/dexbot_bridge.ts +8 -8
  62. package/claw/modules/dexbot_profiles.ts +5 -21
  63. package/claw/modules/feed_price_source.ts +1 -1
  64. package/claw/modules/honest_ecosystem.ts +24 -8
  65. package/claw/modules/kibana_price_source.ts +1 -1
  66. package/claw/modules/launcher_mode_detector.ts +1 -1
  67. package/claw/modules/launcher_paths.ts +1 -1
  68. package/claw/modules/liquidity_pools.ts +10 -3
  69. package/claw/modules/mcp_utils.ts +109 -0
  70. package/claw/modules/memu_bridge.ts +76 -54
  71. package/claw/modules/mpa_utils.ts +26 -3
  72. package/claw/modules/position_discovery.ts +17 -28
  73. package/claw/modules/position_health.ts +1 -1
  74. package/claw/modules/position_manager.ts +32 -41
  75. package/claw/modules/position_manager_watch.ts +3 -2
  76. package/claw/modules/short_mpa_strategy.ts +1 -9
  77. package/claw/modules/skill_utils.ts +5 -3
  78. package/claw/modules/utils.ts +9 -1
  79. package/claw/package.json +3 -3
  80. package/claw/runtimes/openclaw-plugin/index.ts +27 -10
  81. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  82. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  83. package/claw/scripts/claw_bridge.ts +1 -1
  84. package/claw/scripts/claw_mcp_server.ts +19 -78
  85. package/claw/scripts/honest_assets_report.ts +19 -84
  86. package/claw/scripts/memu_mcp_server.ts +57 -155
  87. package/claw/skills/launcher-ops/references/launcher-workflow.md +2 -2
  88. package/claw/tests/package.json +1 -1
  89. package/claw/tests/test_claw_bridge.ts +47 -19
  90. package/claw/tests/test_claw_catalog_and_credentials.ts +8 -4
  91. package/claw/tests/test_claw_chain_layer.ts +39 -19
  92. package/claw/tests/test_claw_data_flow.ts +28 -20
  93. package/claw/tests/test_claw_domain_logic.ts +25 -19
  94. package/claw/tests/test_claw_manifest_and_matrix.ts +23 -3
  95. package/claw/tests/test_claw_mcp_transport.ts +13 -8
  96. package/claw/tests/test_claw_regressions.ts +254 -128
  97. package/claw/tests/test_claw_skill_generation.ts +1 -1
  98. package/claw/tests/test_nullclaw_tmp_integration.ts +2 -3
  99. package/claw/tests/test_position_health.ts +1 -77
  100. package/claw/tests/test_position_manager.ts +20 -18
  101. package/claw/tests/test_position_manager_watch_health.ts +39 -43
  102. package/claw/tests/test_short_mpa_strategy.ts +20 -17
  103. package/claw/tsconfig.json +4 -3
  104. package/dist/analysis/ama_fitting/analyze_ama_price_changes.js +7 -3
  105. package/dist/analysis/ama_fitting/analyze_ama_price_changes.js.map +1 -1
  106. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js +3 -3
  107. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js.map +1 -1
  108. package/dist/analysis/ama_fitting/calibrate_convergence_er.js +8 -6
  109. package/dist/analysis/ama_fitting/calibrate_convergence_er.js.map +1 -1
  110. package/dist/analysis/ama_fitting/fetch_lp_candles.js +8 -3
  111. package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -1
  112. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts +2 -2
  113. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts.map +1 -1
  114. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js +31 -75
  115. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js.map +1 -1
  116. package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts.map +1 -1
  117. package/dist/analysis/ama_fitting/optimizer_high_resolution.js +21 -13
  118. package/dist/analysis/ama_fitting/optimizer_high_resolution.js.map +1 -1
  119. package/dist/analysis/analyze_derivatives.d.ts +0 -18
  120. package/dist/analysis/analyze_derivatives.d.ts.map +1 -1
  121. package/dist/analysis/analyze_derivatives.js +4 -4
  122. package/dist/analysis/analyze_derivatives.js.map +1 -1
  123. package/dist/analysis/analyze_dynamic_weight.d.ts +0 -11
  124. package/dist/analysis/analyze_dynamic_weight.d.ts.map +1 -1
  125. package/dist/analysis/analyze_dynamic_weight.js +19 -5
  126. package/dist/analysis/analyze_dynamic_weight.js.map +1 -1
  127. package/dist/analysis/analyze_kalman.d.ts +0 -10
  128. package/dist/analysis/analyze_kalman.d.ts.map +1 -1
  129. package/dist/analysis/analyze_kalman.js +51 -26
  130. package/dist/analysis/analyze_kalman.js.map +1 -1
  131. package/dist/analysis/analyze_regime.d.ts +0 -17
  132. package/dist/analysis/analyze_regime.d.ts.map +1 -1
  133. package/dist/analysis/analyze_regime.js +2 -2
  134. package/dist/analysis/analyze_regime.js.map +1 -1
  135. package/dist/analysis/analyze_regime_windows.d.ts +0 -16
  136. package/dist/analysis/analyze_regime_windows.d.ts.map +1 -1
  137. package/dist/analysis/analyze_regime_windows.js +28 -21
  138. package/dist/analysis/analyze_regime_windows.js.map +1 -1
  139. package/dist/analysis/analyze_risk_profile.js +3 -3
  140. package/dist/analysis/analyze_risk_profile.js.map +1 -1
  141. package/dist/analysis/analyze_trade_heatmap.js +3 -3
  142. package/dist/analysis/analyze_trade_heatmap.js.map +1 -1
  143. package/dist/analysis/analyze_volatility.d.ts +0 -19
  144. package/dist/analysis/analyze_volatility.d.ts.map +1 -1
  145. package/dist/analysis/analyze_volatility.js +2 -2
  146. package/dist/analysis/analyze_volatility.js.map +1 -1
  147. package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts +30 -14
  148. package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts.map +1 -1
  149. package/dist/analysis/bot_fitting/backtest_ama_sweep.js +330 -193
  150. package/dist/analysis/bot_fitting/backtest_ama_sweep.js.map +1 -1
  151. package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts +136 -1
  152. package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts.map +1 -1
  153. package/dist/analysis/bot_fitting/backtest_bot_fitting.js +527 -83
  154. package/dist/analysis/bot_fitting/backtest_bot_fitting.js.map +1 -1
  155. package/dist/analysis/bot_fitting/shared_utils.d.ts +2 -13
  156. package/dist/analysis/bot_fitting/shared_utils.d.ts.map +1 -1
  157. package/dist/analysis/bot_fitting/shared_utils.js +15 -9
  158. package/dist/analysis/bot_fitting/shared_utils.js.map +1 -1
  159. package/dist/analysis/bot_key_utils.d.ts +1 -1
  160. package/dist/analysis/bot_key_utils.d.ts.map +1 -1
  161. package/dist/analysis/bot_key_utils.js +14 -11
  162. package/dist/analysis/bot_key_utils.js.map +1 -1
  163. package/dist/analysis/bot_usage/discover_bot_accounts.js +5 -3
  164. package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
  165. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +1 -337
  166. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
  167. package/dist/analysis/bot_usage/kibana_bot_queries.js +2 -242
  168. package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -1
  169. package/dist/analysis/chart_css.d.ts +2 -14
  170. package/dist/analysis/chart_css.d.ts.map +1 -1
  171. package/dist/analysis/chart_css.js +6 -3
  172. package/dist/analysis/chart_css.js.map +1 -1
  173. package/dist/analysis/chart_ui.d.ts.map +1 -1
  174. package/dist/analysis/chart_ui.js.map +1 -1
  175. package/dist/analysis/chart_utils.d.ts.map +1 -1
  176. package/dist/analysis/chart_utils.js +15 -2
  177. package/dist/analysis/chart_utils.js.map +1 -1
  178. package/dist/analysis/derivative_chart_generator.js +2 -2
  179. package/dist/analysis/derivative_chart_generator.js.map +1 -1
  180. package/dist/analysis/math_utils.d.ts +3 -5
  181. package/dist/analysis/math_utils.d.ts.map +1 -1
  182. package/dist/analysis/math_utils.js +3 -5
  183. package/dist/analysis/math_utils.js.map +1 -1
  184. package/dist/analysis/price_sources.d.ts +1 -0
  185. package/dist/analysis/price_sources.d.ts.map +1 -1
  186. package/dist/analysis/price_sources.js +8 -2
  187. package/dist/analysis/price_sources.js.map +1 -1
  188. package/dist/analysis/resolve_source.d.ts.map +1 -1
  189. package/dist/analysis/resolve_source.js +1 -1
  190. package/dist/analysis/resolve_source.js.map +1 -1
  191. package/dist/analysis/trade_profitability.d.ts.map +1 -1
  192. package/dist/analysis/trade_profitability.js +58 -29
  193. package/dist/analysis/trade_profitability.js.map +1 -1
  194. package/dist/analysis/tradingview/analyze_tradingview.js +1 -1
  195. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
  196. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
  197. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +302 -74
  198. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
  199. package/dist/analysis/trend_detection/derivative_analyzer.d.ts +1 -0
  200. package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +1 -1
  201. package/dist/analysis/trend_detection/derivative_analyzer.js +12 -3
  202. package/dist/analysis/trend_detection/derivative_analyzer.js.map +1 -1
  203. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -1
  204. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +26 -27
  205. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -1
  206. package/dist/analysis/trend_detection/hurst_analyzer.d.ts +1 -1
  207. package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +1 -1
  208. package/dist/analysis/trend_detection/hurst_analyzer.js +1 -1
  209. package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -1
  210. package/dist/analysis/trend_detection/kalman_chart_generator.d.ts.map +1 -1
  211. package/dist/analysis/trend_detection/kalman_chart_generator.js +41 -13
  212. package/dist/analysis/trend_detection/kalman_chart_generator.js.map +1 -1
  213. package/dist/analysis/trend_detection/regime_chart_generator.d.ts.map +1 -1
  214. package/dist/analysis/trend_detection/regime_chart_generator.js +38 -19
  215. package/dist/analysis/trend_detection/regime_chart_generator.js.map +1 -1
  216. package/dist/analysis/trend_detection/tests/test_kalman_trend.js +1 -1
  217. package/dist/analysis/trend_detection/tests/test_kalman_trend.js.map +1 -1
  218. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js +1 -1
  219. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js.map +1 -1
  220. package/dist/analysis/trend_detection/volatility_chart_generator.js +1 -1
  221. package/dist/analysis/trend_detection/volatility_chart_generator.js.map +1 -1
  222. package/dist/bot.js +3 -3
  223. package/dist/bot.js.map +1 -1
  224. package/dist/credential-daemon.d.ts +1 -1
  225. package/dist/credential-daemon.js +2 -2
  226. package/dist/credential-daemon.js.map +1 -1
  227. package/dist/dexbot.d.ts.map +1 -1
  228. package/dist/dexbot.js +25 -22
  229. package/dist/dexbot.js.map +1 -1
  230. package/dist/market_adapter/ama_signal_runner.js +6 -4
  231. package/dist/market_adapter/ama_signal_runner.js.map +1 -1
  232. package/dist/market_adapter/candle_utils.d.ts +1 -3
  233. package/dist/market_adapter/candle_utils.d.ts.map +1 -1
  234. package/dist/market_adapter/candle_utils.js +1 -11
  235. package/dist/market_adapter/candle_utils.js.map +1 -1
  236. package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -1
  237. package/dist/market_adapter/core/asymmetric_bounds.js +33 -30
  238. package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -1
  239. package/dist/market_adapter/core/config_normalizers.d.ts.map +1 -1
  240. package/dist/market_adapter/core/config_normalizers.js +10 -1
  241. package/dist/market_adapter/core/config_normalizers.js.map +1 -1
  242. package/dist/market_adapter/core/kibana_candles.d.ts +18 -42
  243. package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -1
  244. package/dist/market_adapter/core/kibana_candles.js +101 -7
  245. package/dist/market_adapter/core/kibana_candles.js.map +1 -1
  246. package/dist/market_adapter/core/kibana_client.d.ts +1 -17
  247. package/dist/market_adapter/core/kibana_client.d.ts.map +1 -1
  248. package/dist/market_adapter/core/kibana_client.js +40 -7
  249. package/dist/market_adapter/core/kibana_client.js.map +1 -1
  250. package/dist/market_adapter/core/kibana_market_candles.d.ts +0 -27
  251. package/dist/market_adapter/core/kibana_market_candles.d.ts.map +1 -1
  252. package/dist/market_adapter/core/kibana_market_candles.js +1 -1
  253. package/dist/market_adapter/core/kibana_market_candles.js.map +1 -1
  254. package/dist/market_adapter/core/market_adapter_service.d.ts +22 -13
  255. package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -1
  256. package/dist/market_adapter/core/market_adapter_service.js +96 -38
  257. package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
  258. package/dist/market_adapter/core/signals/hurst_analyzer.d.ts +10 -1
  259. package/dist/market_adapter/core/signals/hurst_analyzer.d.ts.map +1 -1
  260. package/dist/market_adapter/core/signals/hurst_analyzer.js +28 -17
  261. package/dist/market_adapter/core/signals/hurst_analyzer.js.map +1 -1
  262. package/dist/market_adapter/core/signals/kalman_trend_analyzer.d.ts +5 -0
  263. package/dist/market_adapter/core/signals/kalman_trend_analyzer.d.ts.map +1 -1
  264. package/dist/market_adapter/core/signals/kalman_trend_analyzer.js +24 -24
  265. package/dist/market_adapter/core/signals/kalman_trend_analyzer.js.map +1 -1
  266. package/dist/market_adapter/core/signals/kalman_velocity_smoothing.d.ts.map +1 -1
  267. package/dist/market_adapter/core/signals/kalman_velocity_smoothing.js +5 -1
  268. package/dist/market_adapter/core/signals/kalman_velocity_smoothing.js.map +1 -1
  269. package/dist/market_adapter/core/signals/permutation_entropy_analyzer.d.ts.map +1 -1
  270. package/dist/market_adapter/core/signals/permutation_entropy_analyzer.js +20 -3
  271. package/dist/market_adapter/core/signals/permutation_entropy_analyzer.js.map +1 -1
  272. package/dist/market_adapter/core/strategies/ama.js +1 -1
  273. package/dist/market_adapter/core/strategies/ama.js.map +1 -1
  274. package/dist/market_adapter/core/strategies/ama_slope_model.d.ts +2 -2
  275. package/dist/market_adapter/core/strategies/ama_slope_model.d.ts.map +1 -1
  276. package/dist/market_adapter/core/strategies/ama_slope_model.js +16 -4
  277. package/dist/market_adapter/core/strategies/ama_slope_model.js.map +1 -1
  278. package/dist/market_adapter/core/strategies/atr/calculator.d.ts +4 -3
  279. package/dist/market_adapter/core/strategies/atr/calculator.d.ts.map +1 -1
  280. package/dist/market_adapter/core/strategies/atr/calculator.js +16 -8
  281. package/dist/market_adapter/core/strategies/atr/calculator.js.map +1 -1
  282. package/dist/market_adapter/core/strategies/collateral_manager.d.ts.map +1 -1
  283. package/dist/market_adapter/core/strategies/collateral_manager.js +8 -3
  284. package/dist/market_adapter/core/strategies/collateral_manager.js.map +1 -1
  285. package/dist/market_adapter/core/strategies/dynamic_weight_series.d.ts +40 -1
  286. package/dist/market_adapter/core/strategies/dynamic_weight_series.d.ts.map +1 -1
  287. package/dist/market_adapter/core/strategies/dynamic_weight_series.js +116 -2
  288. package/dist/market_adapter/core/strategies/dynamic_weight_series.js.map +1 -1
  289. package/dist/market_adapter/core/strategies/regime_gate.d.ts +1 -2
  290. package/dist/market_adapter/core/strategies/regime_gate.d.ts.map +1 -1
  291. package/dist/market_adapter/core/strategies/regime_gate.js +27 -21
  292. package/dist/market_adapter/core/strategies/regime_gate.js.map +1 -1
  293. package/dist/market_adapter/core/strategies/volatility_shift.d.ts.map +1 -1
  294. package/dist/market_adapter/core/strategies/volatility_shift.js +3 -0
  295. package/dist/market_adapter/core/strategies/volatility_shift.js.map +1 -1
  296. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +71 -57
  297. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -1
  298. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +0 -26
  299. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  300. package/dist/market_adapter/inputs/fetch_lp_data.js +72 -19
  301. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  302. package/dist/market_adapter/inputs/kibana_source.d.ts +5 -30
  303. package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -1
  304. package/dist/market_adapter/inputs/kibana_source.js +6 -3
  305. package/dist/market_adapter/inputs/kibana_source.js.map +1 -1
  306. package/dist/market_adapter/lp_chart_core.js +1 -1
  307. package/dist/market_adapter/lp_chart_core.js.map +1 -1
  308. package/dist/market_adapter/lp_chart_runner.d.ts +10 -1
  309. package/dist/market_adapter/lp_chart_runner.d.ts.map +1 -1
  310. package/dist/market_adapter/lp_chart_runner.js +2 -2
  311. package/dist/market_adapter/lp_chart_runner.js.map +1 -1
  312. package/dist/market_adapter/lp_chart_strategy_loader.d.ts +1 -2
  313. package/dist/market_adapter/lp_chart_strategy_loader.d.ts.map +1 -1
  314. package/dist/market_adapter/lp_chart_strategy_loader.js +5 -5
  315. package/dist/market_adapter/lp_chart_strategy_loader.js.map +1 -1
  316. package/dist/market_adapter/market_adapter.d.ts +1 -2
  317. package/dist/market_adapter/market_adapter.d.ts.map +1 -1
  318. package/dist/market_adapter/market_adapter.js +5 -7
  319. package/dist/market_adapter/market_adapter.js.map +1 -1
  320. package/dist/market_adapter/test_helpers.d.ts +3 -3
  321. package/dist/market_adapter/test_helpers.d.ts.map +1 -1
  322. package/dist/market_adapter/test_helpers.js +3 -3
  323. package/dist/market_adapter/test_helpers.js.map +1 -1
  324. package/dist/market_adapter/utils/adapter_client.js +1 -1
  325. package/dist/market_adapter/utils/adapter_client.js.map +1 -1
  326. package/dist/market_adapter/utils/atomic_write.js +1 -1
  327. package/dist/market_adapter/utils/atomic_write.js.map +1 -1
  328. package/dist/market_adapter/utils/chain.d.ts +0 -2
  329. package/dist/market_adapter/utils/chain.d.ts.map +1 -1
  330. package/dist/market_adapter/utils/chain.js +2 -3
  331. package/dist/market_adapter/utils/chain.js.map +1 -1
  332. package/dist/market_adapter/utils/data_discovery.d.ts.map +1 -1
  333. package/dist/market_adapter/utils/data_discovery.js +24 -8
  334. package/dist/market_adapter/utils/data_discovery.js.map +1 -1
  335. package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts.map +1 -1
  336. package/dist/market_adapter/utils/dynamic_grid_snapshot.js +2 -5
  337. package/dist/market_adapter/utils/dynamic_grid_snapshot.js.map +1 -1
  338. package/dist/market_adapter/utils/file_lock.d.ts +4 -1
  339. package/dist/market_adapter/utils/file_lock.d.ts.map +1 -1
  340. package/dist/market_adapter/utils/file_lock.js +89 -25
  341. package/dist/market_adapter/utils/file_lock.js.map +1 -1
  342. package/dist/market_adapter/utils/native_history.d.ts.map +1 -1
  343. package/dist/market_adapter/utils/native_history.js +5 -1
  344. package/dist/market_adapter/utils/native_history.js.map +1 -1
  345. package/dist/modules/account_bots.d.ts +3 -0
  346. package/dist/modules/account_bots.d.ts.map +1 -1
  347. package/dist/modules/account_bots.js +157 -47
  348. package/dist/modules/account_bots.js.map +1 -1
  349. package/dist/modules/account_orders.d.ts +1 -7
  350. package/dist/modules/account_orders.d.ts.map +1 -1
  351. package/dist/modules/account_orders.js +9 -17
  352. package/dist/modules/account_orders.js.map +1 -1
  353. package/dist/modules/authority_resolver.js +1 -1
  354. package/dist/modules/authority_resolver.js.map +1 -1
  355. package/dist/modules/bitshares-native/chain_client.js +1 -1
  356. package/dist/modules/bitshares-native/chain_client.js.map +1 -1
  357. package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts +0 -12
  358. package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts.map +1 -1
  359. package/dist/modules/bitshares-native/crypto/ecc.browser.js +1 -1
  360. package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -1
  361. package/dist/modules/bitshares-native/crypto/ecc_selector.js +1 -1
  362. package/dist/modules/bitshares-native/crypto/ecc_selector.js.map +1 -1
  363. package/dist/modules/bitshares-native/index.d.ts.map +1 -1
  364. package/dist/modules/bitshares-native/index.js +1 -1
  365. package/dist/modules/bitshares-native/index.js.map +1 -1
  366. package/dist/modules/bitshares-native/lru_cache.js +1 -1
  367. package/dist/modules/bitshares-native/lru_cache.js.map +1 -1
  368. package/dist/modules/bitshares-native/resolvers.d.ts +0 -2
  369. package/dist/modules/bitshares-native/resolvers.d.ts.map +1 -1
  370. package/dist/modules/bitshares-native/resolvers.js +18 -4
  371. package/dist/modules/bitshares-native/resolvers.js.map +1 -1
  372. package/dist/modules/bitshares-native/serial/chain_constants.js +1 -1
  373. package/dist/modules/bitshares-native/serial/chain_constants.js.map +1 -1
  374. package/dist/modules/bitshares-native/serial/index.d.ts.map +1 -1
  375. package/dist/modules/bitshares-native/serial/index.js +1 -1
  376. package/dist/modules/bitshares-native/serial/index.js.map +1 -1
  377. package/dist/modules/bitshares-native/serial/operations.js +1 -1
  378. package/dist/modules/bitshares-native/serial/operations.js.map +1 -1
  379. package/dist/modules/bitshares-native/serial/serializer.js +1 -1
  380. package/dist/modules/bitshares-native/serial/serializer.js.map +1 -1
  381. package/dist/modules/bitshares-native/serial/types.js +1 -1
  382. package/dist/modules/bitshares-native/serial/types.js.map +1 -1
  383. package/dist/modules/bitshares-native/signing_client.js +2 -2
  384. package/dist/modules/bitshares-native/signing_client.js.map +1 -1
  385. package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -1
  386. package/dist/modules/bitshares-native/subscriptions.js +5 -14
  387. package/dist/modules/bitshares-native/subscriptions.js.map +1 -1
  388. package/dist/modules/bitshares-native/transport.js +1 -1
  389. package/dist/modules/bitshares-native/transport.js.map +1 -1
  390. package/dist/modules/bitshares-native/tx/builder.js +1 -1
  391. package/dist/modules/bitshares-native/tx/builder.js.map +1 -1
  392. package/dist/modules/bitshares-native/tx/tx_cache.d.ts +3 -2
  393. package/dist/modules/bitshares-native/tx/tx_cache.d.ts.map +1 -1
  394. package/dist/modules/bitshares-native/tx/tx_cache.js +7 -4
  395. package/dist/modules/bitshares-native/tx/tx_cache.js.map +1 -1
  396. package/dist/modules/bitshares_client.d.ts +2 -14
  397. package/dist/modules/bitshares_client.d.ts.map +1 -1
  398. package/dist/modules/bitshares_client.js +32 -41
  399. package/dist/modules/bitshares_client.js.map +1 -1
  400. package/dist/modules/bot_settings.d.ts.map +1 -1
  401. package/dist/modules/bot_settings.js +12 -19
  402. package/dist/modules/bot_settings.js.map +1 -1
  403. package/dist/modules/bots_file_lock.d.ts +1 -1
  404. package/dist/modules/bots_file_lock.js +1 -1
  405. package/dist/modules/broadcast_failure.d.ts +13 -0
  406. package/dist/modules/broadcast_failure.d.ts.map +1 -1
  407. package/dist/modules/broadcast_failure.js +0 -13
  408. package/dist/modules/broadcast_failure.js.map +1 -1
  409. package/dist/modules/chain_keys.js +2 -2
  410. package/dist/modules/chain_keys.js.map +1 -1
  411. package/dist/modules/chain_orders.d.ts +2 -3
  412. package/dist/modules/chain_orders.d.ts.map +1 -1
  413. package/dist/modules/chain_orders.js +23 -42
  414. package/dist/modules/chain_orders.js.map +1 -1
  415. package/dist/modules/config.d.ts.map +1 -1
  416. package/dist/modules/config.js +5 -2
  417. package/dist/modules/config.js.map +1 -1
  418. package/dist/modules/constants.d.ts +21 -21
  419. package/dist/modules/constants.d.ts.map +1 -1
  420. package/dist/modules/constants.js +53 -60
  421. package/dist/modules/constants.js.map +1 -1
  422. package/dist/modules/cr_planner.d.ts +1 -7
  423. package/dist/modules/cr_planner.d.ts.map +1 -1
  424. package/dist/modules/cr_planner.js +3 -77
  425. package/dist/modules/cr_planner.js.map +1 -1
  426. package/dist/modules/credential_policy.d.ts +0 -4
  427. package/dist/modules/credential_policy.d.ts.map +1 -1
  428. package/dist/modules/credential_policy.js +18 -3
  429. package/dist/modules/credential_policy.js.map +1 -1
  430. package/dist/modules/credit_runtime.d.ts +0 -7
  431. package/dist/modules/credit_runtime.d.ts.map +1 -1
  432. package/dist/modules/credit_runtime.js +21 -60
  433. package/dist/modules/credit_runtime.js.map +1 -1
  434. package/dist/modules/crypto/index.d.ts +0 -2
  435. package/dist/modules/crypto/index.d.ts.map +1 -1
  436. package/dist/modules/crypto/index.js +0 -2
  437. package/dist/modules/crypto/index.js.map +1 -1
  438. package/dist/modules/crypto/sync.js.map +1 -1
  439. package/dist/modules/daemon_node_health.js +1 -1
  440. package/dist/modules/daemon_node_health.js.map +1 -1
  441. package/dist/modules/dexbot_class.d.ts +8 -134
  442. package/dist/modules/dexbot_class.d.ts.map +1 -1
  443. package/dist/modules/dexbot_class.js +39 -199
  444. package/dist/modules/dexbot_class.js.map +1 -1
  445. package/dist/modules/dexbot_credential_client.js +1 -1
  446. package/dist/modules/dexbot_credential_client.js.map +1 -1
  447. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
  448. package/dist/modules/dexbot_fill_runtime.js +3 -6
  449. package/dist/modules/dexbot_fill_runtime.js.map +1 -1
  450. package/dist/modules/dexbot_maintenance_runtime.d.ts +6 -34
  451. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  452. package/dist/modules/dexbot_maintenance_runtime.js +27 -19
  453. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  454. package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
  455. package/dist/modules/dexbot_startup_runtime.js +31 -15
  456. package/dist/modules/dexbot_startup_runtime.js.map +1 -1
  457. package/dist/modules/dexbot_state_recovery.d.ts +2 -2
  458. package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
  459. package/dist/modules/dexbot_state_recovery.js +11 -7
  460. package/dist/modules/dexbot_state_recovery.js.map +1 -1
  461. package/dist/modules/fund_registry.d.ts.map +1 -1
  462. package/dist/modules/fund_registry.js +24 -6
  463. package/dist/modules/fund_registry.js.map +1 -1
  464. package/dist/modules/general_settings.d.ts +1 -2
  465. package/dist/modules/general_settings.d.ts.map +1 -1
  466. package/dist/modules/general_settings.js +1 -2
  467. package/dist/modules/general_settings.js.map +1 -1
  468. package/dist/modules/graceful_shutdown.d.ts.map +1 -1
  469. package/dist/modules/graceful_shutdown.js +10 -1
  470. package/dist/modules/graceful_shutdown.js.map +1 -1
  471. package/dist/modules/grid_price_source.d.ts +19 -0
  472. package/dist/modules/grid_price_source.d.ts.map +1 -0
  473. package/dist/modules/grid_price_source.js +23 -0
  474. package/dist/modules/grid_price_source.js.map +1 -0
  475. package/dist/modules/key_store.d.ts +0 -5
  476. package/dist/modules/key_store.d.ts.map +1 -1
  477. package/dist/modules/key_store.js +1 -14
  478. package/dist/modules/key_store.js.map +1 -1
  479. package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -1
  480. package/dist/modules/launcher/bot_supervisor.js +15 -26
  481. package/dist/modules/launcher/bot_supervisor.js.map +1 -1
  482. package/dist/modules/launcher/child_env.d.ts +1 -2
  483. package/dist/modules/launcher/child_env.d.ts.map +1 -1
  484. package/dist/modules/launcher/child_env.js +1 -1
  485. package/dist/modules/launcher/child_env.js.map +1 -1
  486. package/dist/modules/launcher/foreign_cred_daemon.d.ts.map +1 -1
  487. package/dist/modules/launcher/foreign_cred_daemon.js +7 -13
  488. package/dist/modules/launcher/foreign_cred_daemon.js.map +1 -1
  489. package/dist/modules/launcher/market_adapter_runtime.d.ts +3 -4
  490. package/dist/modules/launcher/market_adapter_runtime.d.ts.map +1 -1
  491. package/dist/modules/launcher/market_adapter_runtime.js +10 -29
  492. package/dist/modules/launcher/market_adapter_runtime.js.map +1 -1
  493. package/dist/modules/launcher/market_adapter_watchdog.d.ts.map +1 -1
  494. package/dist/modules/launcher/market_adapter_watchdog.js +3 -2
  495. package/dist/modules/launcher/market_adapter_watchdog.js.map +1 -1
  496. package/dist/modules/launcher/monolithic_runtime.d.ts +0 -1
  497. package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -1
  498. package/dist/modules/launcher/monolithic_runtime.js +4 -18
  499. package/dist/modules/launcher/monolithic_runtime.js.map +1 -1
  500. package/dist/modules/launcher/runtime_entry.d.ts.map +1 -1
  501. package/dist/modules/launcher/runtime_entry.js +4 -5
  502. package/dist/modules/launcher/runtime_entry.js.map +1 -1
  503. package/dist/modules/launcher/status_reporting.d.ts +1 -2
  504. package/dist/modules/launcher/status_reporting.d.ts.map +1 -1
  505. package/dist/modules/launcher/status_reporting.js +2 -5
  506. package/dist/modules/launcher/status_reporting.js.map +1 -1
  507. package/dist/modules/launcher/supervisor_control.js +1 -1
  508. package/dist/modules/launcher/supervisor_control.js.map +1 -1
  509. package/dist/modules/market_adapter_whitelist.d.ts +2 -2
  510. package/dist/modules/market_adapter_whitelist.d.ts.map +1 -1
  511. package/dist/modules/market_adapter_whitelist.js +12 -6
  512. package/dist/modules/market_adapter_whitelist.js.map +1 -1
  513. package/dist/modules/node_failure_ledger.d.ts +23 -0
  514. package/dist/modules/node_failure_ledger.d.ts.map +1 -1
  515. package/dist/modules/node_failure_ledger.js +0 -23
  516. package/dist/modules/node_failure_ledger.js.map +1 -1
  517. package/dist/modules/node_manager.d.ts.map +1 -1
  518. package/dist/modules/node_manager.js +3 -3
  519. package/dist/modules/node_manager.js.map +1 -1
  520. package/dist/modules/order/accounting.js +3 -3
  521. package/dist/modules/order/accounting.js.map +1 -1
  522. package/dist/modules/order/async_lock.d.ts +6 -0
  523. package/dist/modules/order/async_lock.d.ts.map +1 -1
  524. package/dist/modules/order/async_lock.js +11 -0
  525. package/dist/modules/order/async_lock.js.map +1 -1
  526. package/dist/modules/order/export.d.ts +1 -1
  527. package/dist/modules/order/export.js +10 -10
  528. package/dist/modules/order/export.js.map +1 -1
  529. package/dist/modules/order/format.d.ts +1 -8
  530. package/dist/modules/order/format.d.ts.map +1 -1
  531. package/dist/modules/order/format.js +0 -14
  532. package/dist/modules/order/format.js.map +1 -1
  533. package/dist/modules/order/grid.d.ts +2 -12
  534. package/dist/modules/order/grid.d.ts.map +1 -1
  535. package/dist/modules/order/grid.js +23 -24
  536. package/dist/modules/order/grid.js.map +1 -1
  537. package/dist/modules/order/grid_reconcile.d.ts +1 -1
  538. package/dist/modules/order/grid_reconcile.js +1 -1
  539. package/dist/modules/order/grid_reconcile_internal.js +1 -1
  540. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  541. package/dist/modules/order/logger.d.ts +3 -0
  542. package/dist/modules/order/logger.d.ts.map +1 -1
  543. package/dist/modules/order/logger.js +23 -14
  544. package/dist/modules/order/logger.js.map +1 -1
  545. package/dist/modules/order/logger_state.d.ts +5 -22
  546. package/dist/modules/order/logger_state.d.ts.map +1 -1
  547. package/dist/modules/order/logger_state.js +6 -25
  548. package/dist/modules/order/logger_state.js.map +1 -1
  549. package/dist/modules/order/manager.d.ts +1 -4
  550. package/dist/modules/order/manager.d.ts.map +1 -1
  551. package/dist/modules/order/manager.js +34 -33
  552. package/dist/modules/order/manager.js.map +1 -1
  553. package/dist/modules/order/processed_fill_store.d.ts +0 -5
  554. package/dist/modules/order/processed_fill_store.d.ts.map +1 -1
  555. package/dist/modules/order/processed_fill_store.js +10 -15
  556. package/dist/modules/order/processed_fill_store.js.map +1 -1
  557. package/dist/modules/order/strategy.d.ts +6 -4
  558. package/dist/modules/order/strategy.d.ts.map +1 -1
  559. package/dist/modules/order/strategy.js +6 -4
  560. package/dist/modules/order/strategy.js.map +1 -1
  561. package/dist/modules/order/sync_engine.d.ts.map +1 -1
  562. package/dist/modules/order/sync_engine.js +17 -10
  563. package/dist/modules/order/sync_engine.js.map +1 -1
  564. package/dist/modules/order/utils/math.d.ts +7 -1
  565. package/dist/modules/order/utils/math.d.ts.map +1 -1
  566. package/dist/modules/order/utils/math.js +19 -1
  567. package/dist/modules/order/utils/math.js.map +1 -1
  568. package/dist/modules/order/utils/order.d.ts.map +1 -1
  569. package/dist/modules/order/utils/order.js +11 -4
  570. package/dist/modules/order/utils/order.js.map +1 -1
  571. package/dist/modules/order/utils/system.d.ts +3 -8
  572. package/dist/modules/order/utils/system.d.ts.map +1 -1
  573. package/dist/modules/order/utils/system.js +14 -4
  574. package/dist/modules/order/utils/system.js.map +1 -1
  575. package/dist/modules/order/utils/validate.js +1 -1
  576. package/dist/modules/order/utils/validate.js.map +1 -1
  577. package/dist/modules/path_api.js +1 -1
  578. package/dist/modules/path_api.js.map +1 -1
  579. package/dist/modules/paths.d.ts +1 -7
  580. package/dist/modules/paths.d.ts.map +1 -1
  581. package/dist/modules/paths.js +1 -1
  582. package/dist/modules/paths.js.map +1 -1
  583. package/dist/modules/process_discovery.d.ts +3 -0
  584. package/dist/modules/process_discovery.d.ts.map +1 -1
  585. package/dist/modules/process_discovery.js +15 -1
  586. package/dist/modules/process_discovery.js.map +1 -1
  587. package/dist/modules/runtime_settings.js +4 -2
  588. package/dist/modules/runtime_settings.js.map +1 -1
  589. package/dist/modules/settings_merge.d.ts +5 -1
  590. package/dist/modules/settings_merge.d.ts.map +1 -1
  591. package/dist/modules/settings_merge.js +17 -4
  592. package/dist/modules/settings_merge.js.map +1 -1
  593. package/dist/modules/socket_json_client.d.ts.map +1 -1
  594. package/dist/modules/socket_json_client.js +12 -2
  595. package/dist/modules/socket_json_client.js.map +1 -1
  596. package/dist/modules/storage/browser_adapter.d.ts +8 -3
  597. package/dist/modules/storage/browser_adapter.d.ts.map +1 -1
  598. package/dist/modules/storage/browser_adapter.js +58 -7
  599. package/dist/modules/storage/browser_adapter.js.map +1 -1
  600. package/dist/modules/storage/index.d.ts +1 -1
  601. package/dist/modules/storage/index.js +1 -1
  602. package/dist/modules/types.d.ts +1 -1
  603. package/dist/modules/types.d.ts.map +1 -1
  604. package/dist/modules/utils/sanitize_key.d.ts +7 -0
  605. package/dist/modules/utils/sanitize_key.d.ts.map +1 -0
  606. package/dist/modules/utils/sanitize_key.js +15 -0
  607. package/dist/modules/utils/sanitize_key.js.map +1 -0
  608. package/dist/modules/validate_profiles.d.ts.map +1 -1
  609. package/dist/modules/validate_profiles.js +6 -8
  610. package/dist/modules/validate_profiles.js.map +1 -1
  611. package/dist/pm2.d.ts.map +1 -1
  612. package/dist/pm2.js +8 -9
  613. package/dist/pm2.js.map +1 -1
  614. package/dist/scripts/analyze-git.d.ts +1 -1
  615. package/dist/scripts/analyze-git.js +1 -1
  616. package/dist/scripts/analyze-orders.d.ts +2 -2
  617. package/dist/scripts/analyze-orders.d.ts.map +1 -1
  618. package/dist/scripts/analyze-orders.js +39 -28
  619. package/dist/scripts/analyze-orders.js.map +1 -1
  620. package/dist/scripts/diagnose-pool-history.js +1 -1
  621. package/dist/scripts/divergence-calc.d.ts +1 -1
  622. package/dist/scripts/divergence-calc.js +3 -3
  623. package/dist/scripts/native_release_gates.js +4 -2
  624. package/dist/scripts/native_release_gates.js.map +1 -1
  625. package/dist/scripts/print_grid.d.ts +1 -1
  626. package/dist/scripts/print_grid.js +1 -1
  627. package/dist/scripts/run-tests.js +38 -19
  628. package/dist/scripts/run-tests.js.map +1 -1
  629. package/dist/scripts/runner.d.ts +3 -5
  630. package/dist/scripts/runner.d.ts.map +1 -1
  631. package/dist/scripts/runner.js +4 -6
  632. package/dist/scripts/runner.js.map +1 -1
  633. package/dist/scripts/sync-version.d.ts +2 -2
  634. package/dist/scripts/sync-version.js +2 -2
  635. package/dist/scripts/update.d.ts +1 -1
  636. package/dist/scripts/update.js +2 -2
  637. package/dist/scripts/update.js.map +1 -1
  638. package/dist/scripts/validate_bots.d.ts +1 -1
  639. package/dist/scripts/validate_bots.js +1 -1
  640. package/dist/scripts/verify-browser-bundle.d.ts +1 -1
  641. package/dist/scripts/verify-browser-bundle.js +1 -1
  642. package/dist/unlock.js +4 -4
  643. package/dist/unlock.js.map +1 -1
  644. package/docs/BITSHARES_ONBOARDING.md +63 -18
  645. package/docs/COPY_ON_WRITE_MASTER_PLAN.md +14 -23
  646. package/docs/COW_INVARIANTS.md +4 -4
  647. package/docs/CREDENTIAL_SECURITY.md +0 -11
  648. package/docs/DEXBOT_COMPARISON.md +12 -12
  649. package/docs/EVOLUTION.md +17 -43
  650. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +27 -83
  651. package/docs/GRID_RECALCULATION.md +1 -13
  652. package/docs/GRID_RECONCILE.md +24 -24
  653. package/docs/LIFECYCLE.md +4 -4
  654. package/docs/LOGGING.md +1 -1
  655. package/docs/MPA_CREDIT_USAGE.md +3 -3
  656. package/docs/README.md +2 -2
  657. package/docs/WORKFLOW.md +2 -2
  658. package/docs/architecture.md +48 -43
  659. package/docs/developer_guide.md +22 -24
  660. package/market_adapter/README.md +0 -2
  661. package/modules/README.md +2 -1
  662. package/package.json +22 -14
  663. package/scripts/README.md +34 -8
  664. package/scripts/clean-dist.js +10 -2
  665. package/tests/README.md +4 -3
  666. package/claw/openclaw.plugin.json +0 -13
  667. package/dist/market_adapter/merge_lp_data.d.ts +0 -3
  668. package/dist/market_adapter/merge_lp_data.d.ts.map +0 -1
  669. package/dist/market_adapter/merge_lp_data.js +0 -125
  670. package/dist/market_adapter/merge_lp_data.js.map +0 -1
  671. package/dist/market_adapter/utils/paths.d.ts +0 -3
  672. package/dist/market_adapter/utils/paths.d.ts.map +0 -1
  673. package/dist/market_adapter/utils/paths.js +0 -5
  674. package/dist/market_adapter/utils/paths.js.map +0 -1
@@ -1,13 +1,15 @@
1
+ 'use strict';
1
2
 
2
3
  import fs from 'node:fs';
3
4
  import { MARKET_ADAPTER } from '../../modules/constants.js';
4
- import { escapeHtml, serializeJsonForScript } from '../chart_utils.js';
5
+ import { escapeHtml, serializeJsonForScript, UPLOT_SHARED_SCRIPT } from '../chart_utils.js';
6
+ import { cursorCSS, uplotBgCSS } from '../chart_css.js';
7
+ import { zoomResetScript } from '../chart_ui.js';
5
8
  import { normalizeCandle } from '../math_utils.js';
6
9
  import { PATHS } from '../../modules/paths.js';
7
10
  import { getStorage } from '../../modules/storage/index.js';
8
11
  const { readJSON } = getStorage();
9
12
  import { getErrorMessage } from '../../modules/utils/errors.js';
10
- 'use strict';
11
13
 
12
14
 
13
15
  function inferBaseIntervalSeconds(candles: any[], fallback: any = 3600) {
@@ -393,10 +395,8 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
393
395
  .legend-value { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; color: #eef4fb; font-weight: 700; }
394
396
  .status { display: inline-flex; align-items: center; gap: 8px; font-size: 10px; color: #8290a2; text-transform: uppercase; letter-spacing: 0.5px; }
395
397
  .pill { border: 1px solid rgba(255,255,255,0.06); border-radius: 999px; padding: 4px 8px; background: rgba(255,255,255,0.03); }
396
- .uplot { background: #0b0f14; }
397
- .u-cursor-x { border-left: 1px dashed rgba(255,255,255,0.3) !important; }
398
- .u-cursor-y { border-top: 1px dashed rgba(255,255,255,0.3) !important; display: none; }
399
- .is-hovered .u-cursor-y { display: block; }
398
+ ${uplotBgCSS('#0b0f14')}
399
+ ${cursorCSS()}
400
400
  @media (max-width: 980px) {
401
401
  #topbar { flex-direction: column; align-items: flex-start; }
402
402
  #toolbar { justify-content: flex-start; }
@@ -497,7 +497,7 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
497
497
  <span class="legend-item"><span class="legend-dot" style="background:#93c5fd"></span><span class="legend-label">VWMA</span> <span class="legend-value" id="legend-vwap">-</span></span>
498
498
  </div>
499
499
  </div>
500
- <div id="price-chart"></div>
500
+ <div id="price-chart" title="Wheel: zoom time (ulos = tyhjaa tilaa datan ymparilla) · Drag: siirra aika- ja hintanakymaa · Wheel/drag hinta-akselilla: zoomaa hintaa · Double-click hinta-akselia: autofit"></div>
501
501
  <div id="volume-chart"></div>
502
502
  </div>
503
503
  </div>
@@ -556,8 +556,12 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
556
556
  let lastRenderedPriceScale = null;
557
557
  let charts = [];
558
558
  let chartEventsBound = false;
559
+ let manualYRange = null;
560
+ let lastCandleKey = null;
559
561
  let pendingRange = null;
560
562
  let pendingRangeRaf = 0;
563
+ let xMin = 0;
564
+ let xMax = 0;
561
565
  let smaWorker = null;
562
566
  let smaWorkerJob = null;
563
567
  let smaWorkerStartRaf = 0;
@@ -569,6 +573,50 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
569
573
  const vwapCache = new Map();
570
574
  const seriesCache = new Map();
571
575
 
576
+ ${UPLOT_SHARED_SCRIPT}
577
+
578
+ // TradingView-exporter interaction overrides (PR #3 / #11 feature):
579
+ // redeclare after UPLOT_SHARED_SCRIPT so these hoisted declarations win
580
+ // for this page only, without mutating the shared stack used by other charts.
581
+ function clampXRange(min, max) {
582
+ if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) return { min: xMin, max: xMax };
583
+ // Salli tyhjaa tilaa datan molemmin puolin (TradingView-tyyli):
584
+ // enintaan 75 % datan pituudesta reunapuskurina kummallekin puolelle.
585
+ const dataSpan = Math.max(1, xMax - xMin);
586
+ const maxPad = dataSpan * 0.75;
587
+ let lo = Math.max(xMin - maxPad, min);
588
+ let hi = Math.min(xMax + maxPad, max);
589
+ if (lo < xMin && hi <= lo) lo = xMin;
590
+ if (hi > xMax + maxPad) hi = xMax + maxPad;
591
+ if (hi <= lo) return { min: xMin, max: xMax };
592
+ return { min: lo, max: hi };
593
+ }
594
+ function bindWheelZoom(chart) {
595
+ chart.root.addEventListener('wheel', (e) => {
596
+ if (e.ctrlKey || e.metaKey || e.altKey) return;
597
+ e.preventDefault();
598
+ const rect = chart.root.getBoundingClientRect();
599
+ if (chart === priceChart && inYAxisZone(chart, e.clientX)) {
600
+ const centerY = chart.posToVal(e.clientY - rect.top, 'y');
601
+ zoomYAt(chart, centerY, e.deltaY < 0 ? 0.91 : 1.10);
602
+ return;
603
+ }
604
+ e.stopPropagation();
605
+ const left = e.clientX - rect.left - (chart.bbox.left / (chart.pxRatio || 1));
606
+ const center = chart.posToVal(left, 'x');
607
+ const s = chart.scales.x || {};
608
+ const currMin = Number.isFinite(s.min) ? s.min : xMin;
609
+ const currMax = Number.isFinite(s.max) ? s.max : xMax;
610
+ const span = currMax - currMin;
611
+ if (!Number.isFinite(span) || span <= 0) return;
612
+ const factor = e.deltaY < 0 ? 0.85 : 1.15;
613
+ // Uloszoomaus datan reunojen yli: kokonaisnakyyma enintaan 2.5x datan pituus
614
+ const fullSpan = Math.max(1, xMax - xMin);
615
+ const nextSpan = Math.max(1, Math.min(fullSpan * 2.5, span * factor));
616
+ const ratio = (center - currMin) / span;
617
+ syncXRange(center - nextSpan * ratio, center - nextSpan * ratio + nextSpan);
618
+ }, { passive: false });
619
+ }
572
620
  function clamp(v, lo, hi) { return Math.max(lo, Math.min(hi, v)); }
573
621
  function fmtPrice(v) {
574
622
  if (v == null || !Number.isFinite(v)) return '-';
@@ -578,6 +626,27 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
578
626
  if (abs >= 1) return v.toFixed(4);
579
627
  return v.toPrecision(6);
580
628
  }
629
+ function fmtPriceAxis(vals) {
630
+ if (!Array.isArray(vals) || vals.length === 0) return [];
631
+ let step = Infinity;
632
+ for (let i = 1; i < vals.length; i++) {
633
+ const d = Math.abs(Number(vals[i]) - Number(vals[i - 1]));
634
+ if (Number.isFinite(d) && d > 0 && d < step) step = d;
635
+ }
636
+ let decimals = 4;
637
+ if (Number.isFinite(step) && step > 0) decimals = Math.ceil(-Math.log10(step));
638
+ decimals = Math.max(0, Math.min(10, decimals));
639
+ return vals.map((v) => (v == null || !Number.isFinite(v)) ? '' : Number(v).toFixed(decimals));
640
+ }
641
+ function fmtPriceLabel(v) {
642
+ if (v == null || !Number.isFinite(v)) return '-';
643
+ const abs = Math.abs(v);
644
+ if (abs >= 1000) return v.toFixed(2);
645
+ if (abs >= 1) return v.toFixed(4);
646
+ let s = v.toPrecision(6);
647
+ if (s.indexOf('e') >= 0) s = v.toFixed(10).replace(/0+$/, '').replace(/\.$/, '');
648
+ return s;
649
+ }
581
650
  function fmtVolume(v) {
582
651
  if (v == null || !Number.isFinite(v)) return '-';
583
652
  const abs = Math.abs(v);
@@ -1007,8 +1076,9 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1007
1076
  if (Number.isFinite(v)) { if (v < min) min = v; if (v > max) max = v; }
1008
1077
  }
1009
1078
  if (!Number.isFinite(min) || !Number.isFinite(max) || min <= 0 || max <= 0) return null;
1010
- if (min === max) return [min * 0.98, max * 1.02];
1011
- return [min * 0.97, max * 1.03];
1079
+ if (min === max) return [min * 0.96, max * 1.04];
1080
+ // ~7 % hengitystilaa yla- ja alapuolelle (TradingView-tyyli)
1081
+ return [min * 0.93, max * 1.07];
1012
1082
  }
1013
1083
  function visibleVolumeRange(u) {
1014
1084
  if (!currentCandles.length) return null;
@@ -1264,6 +1334,10 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1264
1334
  currentSeriesCloseValues = currentSeriesState.closeValues;
1265
1335
  const aggregated = aggregateCandles(currentSeriesCandles, tf?.seconds || 3600);
1266
1336
  currentCandles = aggregated.candles;
1337
+ if (currentCandles.length) {
1338
+ xMin = currentCandles[0].time;
1339
+ xMax = currentCandles[currentCandles.length - 1].time;
1340
+ }
1267
1341
  currentDisplayCandles = deriveDisplayCandles(currentCandles);
1268
1342
  currentOpen = currentDisplayCandles.map((c) => c.open);
1269
1343
  currentHigh = currentCandles.map((c) => c.high);
@@ -1342,6 +1416,7 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1342
1416
  distr: isLogScale ? 3 : 1,
1343
1417
  log: isLogScale ? 10 : undefined,
1344
1418
  range: (u, min, max) => {
1419
+ if (manualYRange) return [manualYRange.min, manualYRange.max];
1345
1420
  const vis = visiblePriceRange(u);
1346
1421
  if (vis) return vis;
1347
1422
  if (isLogScale) {
@@ -1368,8 +1443,21 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1368
1443
  ],
1369
1444
  axes: [
1370
1445
  makeTimeAxis(false),
1371
- { scale: 'y', size: 62, stroke: '#ffffff', grid: { stroke: '#1c2128' }, ticks: { stroke: '#30363d', width: 1 }, values: (u, vals) => vals.map((v) => (v == null ? '' : fmtPrice(v))) },
1446
+ {
1447
+ scale: 'y',
1448
+ side: 1,
1449
+ size: 84,
1450
+ space: 26,
1451
+ stroke: '#ffffff',
1452
+ grid: { stroke: '#272f3a' },
1453
+ ticks: { stroke: '#414b57', width: 1 },
1454
+ font: '600 13px Segoe UI, sans-serif',
1455
+ values: (u, vals) => fmtPriceAxis(vals),
1456
+ },
1372
1457
  ],
1458
+ hooks: {
1459
+ draw: [(u) => positionPriceMarker(u)],
1460
+ },
1373
1461
  };
1374
1462
 
1375
1463
  const plugin = candlePlugin();
@@ -1403,7 +1491,7 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1403
1491
  ],
1404
1492
  axes: [
1405
1493
  makeTimeAxis(true),
1406
- { scale: 'y', size: 62, stroke: '#ffffff', grid: { stroke: '#1c2128' }, ticks: { stroke: '#30363d', width: 1 }, values: (u, vals) => vals.map((v) => (v == null ? '' : fmtVolume(v))) },
1494
+ { scale: 'y', side: 1, size: 84, space: 22, stroke: '#ffffff', grid: { stroke: '#1c2128' }, ticks: { stroke: '#30363d', width: 1 }, font: '600 12px Segoe UI, sans-serif', values: (u, vals) => vals.map((v) => (v == null ? '' : fmtVolume(v))) },
1407
1495
  ],
1408
1496
  };
1409
1497
 
@@ -1417,65 +1505,181 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1417
1505
  lastRenderedPriceScale = currentPriceScale;
1418
1506
  return priceChart;
1419
1507
  }
1420
- function clampRange(min, max) {
1421
- if (!currentCandles.length || !Number.isFinite(min) || !Number.isFinite(max) || max <= min) return null;
1422
- const first = currentCandles[0].time;
1423
- const last = currentCandles[currentCandles.length - 1].time;
1424
- let lo = min;
1425
- let hi = max;
1426
- if (lo < first) { hi += first - lo; lo = first; }
1427
- if (hi > last) { lo -= hi - last; hi = last; }
1428
- if (lo < first) lo = first;
1429
- if (hi > last) hi = last;
1430
- if (hi <= lo) return null;
1431
- return { min: lo, max: hi };
1432
- }
1433
- function syncXRange(min, max) {
1434
- pendingRange = clampRange(min, max);
1435
- if (pendingRangeRaf) return;
1436
- pendingRangeRaf = requestAnimationFrame(() => {
1437
- const next = pendingRange;
1438
- pendingRange = null;
1439
- pendingRangeRaf = 0;
1440
- if (!next || charts.length === 0) return;
1441
- charts.forEach((chart) => chart.batch(() => chart.setScale('x', next)));
1442
- });
1508
+ // True when clientX sits over the price-axis gutter (outside the plot
1509
+ // proper). uPlot's .u-over spans the full canvas incl. axis gutters,
1510
+ // so hit-testing must use chart.bbox (plot area) rather than the
1511
+ // overlay rect. Tolerance pulls the boundary slightly into the plot.
1512
+ function inYAxisZone(chart, clientX) {
1513
+ const rootRect = chart.root.getBoundingClientRect();
1514
+ if (!rootRect || rootRect.width <= 0 || !chart.bbox) return false;
1515
+ const pr = chart.pxRatio || 1;
1516
+ const plotLeft = chart.bbox.left / pr;
1517
+ const plotRight = chart.bbox.right / pr;
1518
+ return clientX - rootRect.left < plotLeft - 6 || clientX - rootRect.left > plotRight + 6;
1519
+ }
1520
+ let priceMarkerLabel = null;
1521
+ let priceMarkerLine = null;
1522
+ function ensurePriceMarker(u) {
1523
+ if (priceMarkerLabel && priceMarkerLabel.parentNode === u.root) return;
1524
+ if (priceMarkerLabel && priceMarkerLabel.parentNode) priceMarkerLabel.parentNode.removeChild(priceMarkerLabel);
1525
+ if (priceMarkerLine && priceMarkerLine.parentNode) priceMarkerLine.parentNode.removeChild(priceMarkerLine);
1526
+ try { if (getComputedStyle(u.root).position === 'static') u.root.style.position = 'relative'; } catch (e) {}
1527
+ priceMarkerLabel = document.createElement('div');
1528
+ priceMarkerLabel.style.cssText = 'position:absolute;z-index:30;pointer-events:none;font:600 12px Segoe UI, sans-serif;line-height:19px;height:19px;padding:0 7px;border-radius:3px;color:#ffffff;white-space:nowrap;box-sizing:border-box;text-align:center;overflow:hidden;';
1529
+ priceMarkerLine = document.createElement('div');
1530
+ priceMarkerLine.style.cssText = 'position:absolute;z-index:1;pointer-events:none;height:0;border-top:1px dashed currentColor;opacity:0.6;';
1531
+ u.root.appendChild(priceMarkerLine);
1532
+ u.root.appendChild(priceMarkerLabel);
1533
+ }
1534
+ function positionPriceMarker(u) {
1535
+ if (!u || !u.over || !currentCandles.length) return;
1536
+ ensurePriceMarker(u);
1537
+ const last = currentCandles[currentCandles.length - 1];
1538
+ const prev = currentCandles.length > 1 ? currentCandles[currentCandles.length - 2] : last;
1539
+ const price = last.close;
1540
+ if (!Number.isFinite(price)) {
1541
+ priceMarkerLabel.style.display = 'none';
1542
+ priceMarkerLine.style.display = 'none';
1543
+ return;
1544
+ }
1545
+ const up = price >= (Number.isFinite(prev.close) ? prev.close : price);
1546
+ const color = up ? '#26a69a' : '#ef5350';
1547
+ const s = u.scales.y || {};
1548
+ const sMin = Number.isFinite(s.min) ? s.min : null;
1549
+ const sMax = Number.isFinite(s.max) ? s.max : null;
1550
+ if (sMin == null || sMax == null || sMax <= sMin) {
1551
+ priceMarkerLabel.style.display = 'none';
1552
+ priceMarkerLine.style.display = 'none';
1553
+ return;
1554
+ }
1555
+ let frac;
1556
+ if (currentPriceScale === 'log') {
1557
+ const lmin = Math.log10(sMin);
1558
+ const lmax = Math.log10(sMax);
1559
+ const lp = Math.log10(Math.max(price, 1e-12));
1560
+ frac = (lp - lmin) / (lmax - lmin);
1561
+ } else {
1562
+ frac = (price - sMin) / (sMax - sMin);
1563
+ }
1564
+ const rootRect = u.root.getBoundingClientRect();
1565
+ const overRect = u.over.getBoundingClientRect();
1566
+ if (!overRect || overRect.height <= 0) return;
1567
+ const plotTop = overRect.top - rootRect.top;
1568
+ const yRel = (1 - frac) * overRect.height;
1569
+ const inRange = frac >= 0 && frac <= 1;
1570
+ priceMarkerLabel.style.display = 'block';
1571
+ priceMarkerLabel.textContent = fmtPriceLabel(price);
1572
+ priceMarkerLabel.style.background = color;
1573
+ priceMarkerLabel.style.top = (plotTop + Math.max(0, Math.min(overRect.height, yRel)) - 10) + 'px';
1574
+ const leftAxisW = overRect.left - rootRect.left;
1575
+ const rightAxisW = rootRect.right - overRect.right;
1576
+ if (leftAxisW >= rightAxisW) {
1577
+ priceMarkerLabel.style.left = '0px';
1578
+ priceMarkerLabel.style.right = '';
1579
+ priceMarkerLabel.style.width = Math.max(40, leftAxisW - 4) + 'px';
1580
+ } else {
1581
+ priceMarkerLabel.style.left = '';
1582
+ priceMarkerLabel.style.right = '0px';
1583
+ priceMarkerLabel.style.width = Math.max(40, rightAxisW - 4) + 'px';
1584
+ }
1585
+ if (inRange) {
1586
+ priceMarkerLine.style.display = 'block';
1587
+ priceMarkerLine.style.color = color;
1588
+ priceMarkerLine.style.top = (plotTop + yRel) + 'px';
1589
+ priceMarkerLine.style.left = (overRect.left - rootRect.left) + 'px';
1590
+ priceMarkerLine.style.width = overRect.width + 'px';
1591
+ } else {
1592
+ priceMarkerLine.style.display = 'none';
1593
+ }
1443
1594
  }
1444
- function bindWheelZoom(chart) {
1445
- chart.root.addEventListener('wheel', (e) => {
1446
- if (e.ctrlKey || e.metaKey || e.altKey) return;
1447
- e.preventDefault();
1448
- const rect = chart.root.getBoundingClientRect();
1449
- const center = chart.posToVal(e.clientX - rect.left, 'x');
1450
- const s = chart.scales.x || {};
1451
- const currMin = Number.isFinite(s.min) ? s.min : currentCandles[0].time;
1452
- const currMax = Number.isFinite(s.max) ? s.max : currentCandles[currentCandles.length - 1].time;
1453
- const span = currMax - currMin;
1454
- const first = currentCandles[0]?.time;
1455
- const last = currentCandles[currentCandles.length - 1]?.time;
1456
- const fullSpan = Number.isFinite(first) && Number.isFinite(last) ? Math.max(1, last - first) : span;
1457
- if (!Number.isFinite(span) || span <= 0) return;
1458
- const factor = e.deltaY < 0 ? 0.85 : 1.15;
1459
- const nextSpan = Math.max(1, Math.min(fullSpan, span * factor));
1460
- const ratio = (center - currMin) / span;
1461
- syncXRange(center - nextSpan * ratio, center - nextSpan * ratio + nextSpan);
1462
- }, { passive: false });
1595
+ function currentYRange(chart) {
1596
+ const s = chart.scales.y || {};
1597
+ let min = Number.isFinite(s.min) ? s.min : null;
1598
+ let max = Number.isFinite(s.max) ? s.max : null;
1599
+ if (min == null || max == null) {
1600
+ const vis = visiblePriceRange(chart);
1601
+ if (vis) { min = vis[0]; max = vis[1]; }
1602
+ }
1603
+ if (min == null || max == null || !Number.isFinite(min) || !Number.isFinite(max) || max <= min) return null;
1604
+ return { min: min, max: max };
1463
1605
  }
1464
- function bindPan(chart) {
1606
+ let priceBounds = null;
1607
+ function computePriceBounds() {
1608
+ let min = Infinity;
1609
+ let max = -Infinity;
1610
+ for (let i = 0; i < currentCandles.length; i++) {
1611
+ const lo = currentLow[i];
1612
+ const hi = currentHigh[i];
1613
+ if (Number.isFinite(lo) && lo > 0 && lo < min) min = lo;
1614
+ if (Number.isFinite(hi) && hi > max) max = hi;
1615
+ }
1616
+ if (!Number.isFinite(min) || !Number.isFinite(max) || min <= 0 || max <= min) {
1617
+ priceBounds = null;
1618
+ return;
1619
+ }
1620
+ const range = max - min;
1621
+ // Uloszoomauksen rajat: alin naytettava hinta voi painua viimeistaan
1622
+ // ~35 % datan minimin alapuolelle, ylin ~1.6x datan maksimin, ja
1623
+ // kokonaisvali saa olla enintaan ~1.6x datan hintahaarukasta —
1624
+ // ei siis paase "lipsahtamaan" candleita nakyvasta kadottaen.
1625
+ priceBounds = { min: min, max: max, floor: min * 0.35, ceil: max * 1.6, maxSpan: range * 1.6 };
1626
+ }
1627
+ function applyYRange(chart, min, max) {
1628
+ if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) return false;
1629
+ const ref = Math.max(Math.abs(min), Math.abs(max), 1e-12);
1630
+ if (max - min < ref * 1e-9) return false;
1631
+ if (currentPriceScale === 'log' && min <= 0) {
1632
+ min = max > 0 ? max * 1e-6 : 1e-6;
1633
+ if (max <= min) return false;
1634
+ }
1635
+ if (priceBounds) {
1636
+ let nMin = Math.max(min, priceBounds.floor);
1637
+ let nMax = Math.min(max, priceBounds.ceil);
1638
+ if (nMax - nMin > priceBounds.maxSpan) {
1639
+ const c = (nMin + nMax) / 2;
1640
+ nMin = c - priceBounds.maxSpan / 2;
1641
+ nMax = c + priceBounds.maxSpan / 2;
1642
+ nMin = Math.max(nMin, priceBounds.floor);
1643
+ nMax = Math.min(nMax, priceBounds.ceil);
1644
+ }
1645
+ if (nMax <= nMin) return false;
1646
+ min = nMin;
1647
+ max = nMax;
1648
+ }
1649
+ manualYRange = { min: min, max: max };
1650
+ chart.setScale('y', { min: min, max: max });
1651
+ return true;
1652
+ }
1653
+ function zoomYAt(chart, centerY, factor) {
1654
+ const r = currentYRange(chart);
1655
+ if (!r) return;
1656
+ const span = r.max - r.min;
1657
+ let ratio = (centerY - r.min) / span;
1658
+ if (!Number.isFinite(ratio)) ratio = 0.5;
1659
+ ratio = Math.max(0.05, Math.min(0.95, ratio));
1660
+ const nextSpan = span * factor;
1661
+ const nextMin = centerY - nextSpan * ratio;
1662
+ applyYRange(chart, nextMin, nextMin + nextSpan);
1663
+ }
1664
+ function bindYAxisDrag(chart) {
1465
1665
  let dragging = false;
1466
- let startClientX = 0;
1467
- let startMin = 0;
1468
- let startMax = 0;
1666
+ let startClientY = 0;
1667
+ let startRange = null;
1469
1668
  const onMove = (e) => {
1470
- if (!dragging) return;
1669
+ if (!dragging || !startRange) return;
1471
1670
  e.preventDefault();
1472
- const rect = chart.root.getBoundingClientRect();
1473
- const delta = chart.posToVal(e.clientX - rect.left, 'x') - chart.posToVal(startClientX - rect.left, 'x');
1474
- syncXRange(startMin - delta, startMax - delta);
1671
+ const deltaPx = e.clientY - startClientY;
1672
+ if (!Number.isFinite(deltaPx) || deltaPx === 0) return;
1673
+ const factor = Math.exp(deltaPx / 350);
1674
+ const span = startRange.max - startRange.min;
1675
+ const center = (startRange.min + startRange.max) / 2;
1676
+ const nextSpan = span * factor;
1677
+ applyYRange(chart, center - nextSpan / 2, center + nextSpan / 2);
1475
1678
  };
1476
1679
  const endDrag = () => {
1477
1680
  if (!dragging) return;
1478
1681
  dragging = false;
1682
+ startRange = null;
1479
1683
  document.body.style.cursor = '';
1480
1684
  window.removeEventListener('mousemove', onMove);
1481
1685
  window.removeEventListener('mouseup', endDrag);
@@ -1484,18 +1688,27 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1484
1688
  if (!e || e.button !== 0 || e.ctrlKey || e.metaKey || e.altKey) return;
1485
1689
  const rect = chart.root.getBoundingClientRect();
1486
1690
  if (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom) return;
1691
+ if (chart !== priceChart || !inYAxisZone(chart, e.clientX)) return;
1692
+ const range = currentYRange(chart);
1693
+ if (!range) return;
1487
1694
  e.preventDefault();
1488
1695
  e.stopPropagation();
1489
1696
  dragging = true;
1490
- startClientX = e.clientX;
1491
- const s = chart.scales.x || {};
1492
- startMin = Number.isFinite(s.min) ? s.min : currentCandles[0].time;
1493
- startMax = Number.isFinite(s.max) ? s.max : currentCandles[currentCandles.length - 1].time;
1494
- document.body.style.cursor = 'grabbing';
1697
+ startClientY = e.clientY;
1698
+ startRange = range;
1699
+ document.body.style.cursor = 'ns-resize';
1495
1700
  window.addEventListener('mousemove', onMove);
1496
1701
  window.addEventListener('mouseup', endDrag, { once: true });
1497
1702
  });
1498
1703
  }
1704
+ function bindYAxisReset(chart) {
1705
+ chart.root.addEventListener('dblclick', (e) => {
1706
+ if (chart !== priceChart || !inYAxisZone(chart, e.clientX)) return;
1707
+ manualYRange = null;
1708
+ const vis = visiblePriceRange(chart);
1709
+ if (vis) chart.setScale('y', { min: vis[0], max: vis[1] });
1710
+ });
1711
+ }
1499
1712
  function refreshLegend() {
1500
1713
  updateLegend(Math.max(0, currentCandles.length - 1));
1501
1714
  }
@@ -1521,6 +1734,9 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1521
1734
  const oldRange = keepRange && priceChart ? priceChart.scales.x : null;
1522
1735
  const needsRebuild = !priceChart || !volumeChart || lastRenderedPriceScale !== currentPriceScale;
1523
1736
  if (needsRebuild) {
1737
+ manualYRange = null;
1738
+ priceMarkerLabel = null;
1739
+ priceMarkerLine = null;
1524
1740
  if (priceEl) priceEl.innerHTML = '';
1525
1741
  if (volumeEl) volumeEl.innerHTML = '';
1526
1742
  priceChart = null;
@@ -1529,6 +1745,16 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1529
1745
  chartEventsBound = false;
1530
1746
  }
1531
1747
  const data = buildData();
1748
+ // Dataset changed (timeframe switch, fresh candles): drop any manual
1749
+ // price scale so auto-fit takes over again for the new data shape.
1750
+ const candleKey = currentCandles.length
1751
+ ? currentCandles[0].time + ':' + currentCandles[currentCandles.length - 1].time + ':' + currentCandles.length
1752
+ : '';
1753
+ if (candleKey !== lastCandleKey) {
1754
+ lastCandleKey = candleKey;
1755
+ manualYRange = null;
1756
+ }
1757
+ computePriceBounds();
1532
1758
  if (needsRebuild) {
1533
1759
  makeChart();
1534
1760
  } else {
@@ -1541,6 +1767,13 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1541
1767
  charts.forEach((chart) => {
1542
1768
  bindWheelZoom(chart);
1543
1769
  bindPan(chart);
1770
+ if (chart === priceChart) {
1771
+ bindYAxisDrag(chart);
1772
+ bindYAxisReset(chart);
1773
+ chart.root.addEventListener('mousemove', (e) => {
1774
+ chart.root.style.cursor = inYAxisZone(chart, e.clientX) ? 'ns-resize' : '';
1775
+ });
1776
+ }
1544
1777
  chart.over.addEventListener('mousemove', () => {
1545
1778
  if (chart.cursor.idx != null) updateLegend(chart.cursor.idx);
1546
1779
  });
@@ -1551,7 +1784,7 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1551
1784
  chartEventsBound = true;
1552
1785
  }
1553
1786
  if (oldRange && Number.isFinite(oldRange.min) && Number.isFinite(oldRange.max)) {
1554
- const next = clampRange(oldRange.min, oldRange.max);
1787
+ const next = clampXRange(oldRange.min, oldRange.max);
1555
1788
  if (next) charts.forEach((chart) => chart.batch(() => chart.setScale('x', next)));
1556
1789
  }
1557
1790
  refreshLegend();
@@ -1584,6 +1817,7 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1584
1817
  if (pairToggle) {
1585
1818
  pairToggle.addEventListener('click', () => {
1586
1819
  currentPairMode = currentPairMode === 'inverse' ? 'normal' : 'inverse';
1820
+ manualYRange = null;
1587
1821
  setControls();
1588
1822
  rerender(true);
1589
1823
  });
@@ -1701,13 +1935,7 @@ function generateHTML(data: any, title: any = 'TradingView Style Research') {
1701
1935
  });
1702
1936
  });
1703
1937
 
1704
- window.addEventListener('keydown', (e) => {
1705
- if ((e.ctrlKey || e.metaKey) && e.key === '0' && charts.length) {
1706
- const first = currentCandles[0]?.time;
1707
- const last = currentCandles[currentCandles.length - 1]?.time;
1708
- if (Number.isFinite(first) && Number.isFinite(last)) syncXRange(first, last);
1709
- }
1710
- });
1938
+ ${zoomResetScript()}
1711
1939
  })();
1712
1940
  </script>
1713
1941
  </body>
@@ -159,7 +159,7 @@ All panels share aligned vertical time grid lines, and the bottom output panel s
159
159
  |------|-------|---------|---------|
160
160
  | **nz%** | 0–1 | 0.00 | Neutral zone: dead-band below which offset is forced to 0 |
161
161
  | **lb** | 1–32 | 9 | Logarithmic. Lookback bars for AMA slope calculation |
162
- | **amaS%** | 0.04–0.12 | 0.085 | Logarithmic. Gear ratio for average per-bar AMA slope saturation |
162
+ | **amaS%** | 0.06–0.12 | 0.09 | Logarithmic. Gear ratio for average per-bar AMA slope saturation |
163
163
  | **kalS%** | 0.5–1.5 | 1.0 | Logarithmic. Gear ratio for Kalman composite saturation |
164
164
  | **clip%** | 0–55 | 10 | Percentile clip: filters extreme inputs (0 = off) |
165
165
 
@@ -1,6 +1,6 @@
1
+ 'use strict';
1
2
 
2
3
  import { roundTo } from '../../modules/order/utils/math.js';
3
- 'use strict';
4
4
 
5
5
  /**
6
6
  * Derivative Analyzer
@@ -235,6 +235,10 @@ class DerivativeAnalyzer {
235
235
  rsiBullThreshold: number;
236
236
  rsiBearThreshold: number;
237
237
  macdMinHist: number;
238
+ // Resolved threshold for the MACD-line gates: falls back to the historical
239
+ // 0.02 default only when unset/NaN, so an explicit 0 (strict sign test)
240
+ // stays expressible via the API.
241
+ macdLineGateThreshold: number;
238
242
  fastSmaCommitmentBars: number;
239
243
  trendFilterEnabled: boolean;
240
244
  trendFilterMinBars: number;
@@ -311,6 +315,11 @@ class DerivativeAnalyzer {
311
315
  this.rsiBullThreshold = config.rsiBullThreshold ?? 55;
312
316
  this.rsiBearThreshold = config.rsiBearThreshold ?? 45;
313
317
  this.macdMinHist = config.macdMinHist ?? 0;
318
+ // Unset/NaN → historical 0.02 gate default; explicit 0 → strict sign test.
319
+ // (`this.macdMinHist || 0.02` at the gates made explicit 0 unreachable.)
320
+ this.macdLineGateThreshold = config.macdMinHist != null && Number.isFinite(config.macdMinHist)
321
+ ? config.macdMinHist
322
+ : 0.02;
314
323
  this.fastSmaCommitmentBars = config.fastSmaCommitmentBars ?? 2;
315
324
  this.trendFilterEnabled = config.trendFilterEnabled ?? false;
316
325
  this.trendFilterMinBars = config.trendFilterMinBars ?? 3;
@@ -421,7 +430,7 @@ class DerivativeAnalyzer {
421
430
  // This ignores marginal crossings at ~0 and ensures signals only start when
422
431
  // momentum is clearly confirmed.
423
432
  if (this.macd && this.currMacd !== null) {
424
- const threshold = this.macdMinHist || 0.02;
433
+ const threshold = this.macdLineGateThreshold;
425
434
  if ((rawInterp === 'BEAR' || rawInterp === 'BEAR_WEAK') && this.currMacd.macd > -threshold)
426
435
  rawInterp = 'NEUTRAL';
427
436
  if ((rawInterp === 'BULL' || rawInterp === 'BULL_WEAK') && this.currMacd.macd < threshold)
@@ -744,7 +753,7 @@ class DerivativeAnalyzer {
744
753
  if (interp !== 'BULL' && interp !== 'BEAR') return false;
745
754
 
746
755
  if (this.macd && this.currMacd !== null) {
747
- const threshold = this.macdMinHist || 0.02;
756
+ const threshold = this.macdLineGateThreshold;
748
757
  if (interp === 'BULL' && this.currMacd.macd < threshold) return true;
749
758
  if (interp === 'BEAR' && this.currMacd.macd > -threshold) return true;
750
759
  }