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
@@ -92,7 +92,11 @@ function computeDynamicWeightSeries(inputs) {
92
92
  if (sp == null)
93
93
  continue;
94
94
  const csp = Math.max(-amaClipThreshold, Math.min(amaClipThreshold, sp));
95
- if (Math.abs(csp) < neutralZonePct)
95
+ // Inclusive dead-band boundary (matches computeAmaSlopeWeights): a
96
+ // slope exactly at neutralZonePct counts as neutral. With the default
97
+ // neutralZonePct of 0 this also keeps exact-zero slopes out of the
98
+ // offset channel.
99
+ if (Math.abs(csp) <= neutralZonePct)
96
100
  continue;
97
101
  amaOffsets[i] = Math.max(-offsetClamp, Math.min(offsetClamp, (csp / amaMaxSlopePct) * offsetClamp));
98
102
  }
@@ -132,5 +136,115 @@ function computeDynamicWeightSeries(inputs) {
132
136
  echoedGatedOffSeries: latched.echoedPreGainSeries,
133
137
  };
134
138
  }
135
- export { computeDynamicWeightSeries, computeAverageAmaSlopePct, echoLatchSeries, roundToN };
139
+ /**
140
+ * Percentile lookup over an already-sorted ascending array. Returns `Infinity`
141
+ * for an empty pool so callers treat it as "no clipping". Both the percentile
142
+ * and the resulting index are clamped so a misconfigured clipPercentile above
143
+ * 100 cannot select a negative (undefined) entry.
144
+ */
145
+ function percentileFromSorted(sorted, clipPercentile) {
146
+ if (!Array.isArray(sorted) || sorted.length === 0)
147
+ return Infinity;
148
+ const pct = Math.min(clipPercentile, 100);
149
+ const idx = Math.max(0, Math.min(Math.floor((100 - pct) / 100 * sorted.length), sorted.length - 1));
150
+ return sorted[idx];
151
+ }
152
+ /**
153
+ * Canonical AMA slope clip threshold used to bound `rawSlopeOffset` in
154
+ * `computeAmaSlopeWeights` — one logic path shared by the live market adapter
155
+ * service, the research runners, and the browser-embedded chart script.
156
+ *
157
+ * The threshold is the `(100 - clipPercentile)`-th percentile of
158
+ * `|average AMA slope %|` over the AMA history (skipping the ER + lookback
159
+ * warmup window). Returns `Infinity` when clipping is disabled or there is
160
+ * insufficient history.
161
+ *
162
+ * Embedding note: lives in this import-free module so fn.toString() injection
163
+ * into generated research charts stays valid after transpilation.
164
+ *
165
+ * For per-bar research loops prefer {@link createAmaSlopeClipTracker}, which
166
+ * yields identical thresholds while maintaining a single sorted pool
167
+ * incrementally (O(n) per push for the sorted insertion, O(n²) total) instead
168
+ * of re-deriving and re-sorting the whole slope history each bar.
169
+ *
170
+ * @param amaValues Full AMA series for the cycle.
171
+ * @param erPeriod AMA ER period (defines the warmup window with lookbackBars).
172
+ * @param lookbackBars Bars averaged per slope sample.
173
+ * @param clipPercentile Percentile to clip at (e.g. 10 → use 90th pct). 0 disables.
174
+ */
175
+ function computeAmaSlopeClipThreshold(amaValues, erPeriod, lookbackBars, clipPercentile) {
176
+ if (!Number.isFinite(clipPercentile) || clipPercentile <= 0)
177
+ return Infinity;
178
+ if (!Array.isArray(amaValues))
179
+ return Infinity;
180
+ const readyBars = Math.ceil(erPeriod) + lookbackBars;
181
+ if (amaValues.length <= readyBars)
182
+ return Infinity;
183
+ const slopes = [];
184
+ for (let i = readyBars; i < amaValues.length; i++) {
185
+ const last = amaValues[i];
186
+ const past = amaValues[i - lookbackBars];
187
+ if (!Number.isFinite(last) || !Number.isFinite(past))
188
+ continue;
189
+ const s = computeAverageAmaSlopePct(last, past, lookbackBars);
190
+ if (Number.isFinite(s))
191
+ slopes.push(Math.abs(s));
192
+ }
193
+ if (slopes.length === 0)
194
+ return Infinity;
195
+ const sorted = slopes.slice().sort((a, b) => a - b);
196
+ // Clamp both the percentile and index: values above 100 would otherwise
197
+ // produce a negative index (undefined threshold -> NaN clip bounds).
198
+ const pct = Math.min(clipPercentile, 100);
199
+ const idx = Math.max(0, Math.min(Math.floor((100 - pct) / 100 * sorted.length), sorted.length - 1));
200
+ return sorted[idx];
201
+ }
202
+ /**
203
+ * Incremental equivalent of calling {@link computeAmaSlopeClipThreshold} on
204
+ * every growing prefix of the AMA series. Feed exactly one AMA value per bar
205
+ * via `push`; it returns the same threshold the batch function would return
206
+ * for `amaValues.slice(0, consumed)`, without re-deriving the whole slope pool
207
+ * each call. Maintains one sorted pool with binary-search insertion: O(log n)
208
+ * search + O(n) array shift per push, O(n²) total — a constant-factor win over
209
+ * the batch-per-bar loop's O(n² log n), and the same bound at research scale.
210
+ *
211
+ * Non-finite values keep their position in the sequence (they invalidate only
212
+ * the pairs they belong to), matching the batch function's per-pair guards.
213
+ */
214
+ function createAmaSlopeClipTracker(erPeriod, lookbackBars, clipPercentile) {
215
+ const enabled = Number.isFinite(clipPercentile) && clipPercentile > 0;
216
+ const readyBars = Math.ceil(erPeriod) + lookbackBars;
217
+ const buffer = [];
218
+ const sorted = [];
219
+ return {
220
+ push(value) {
221
+ buffer.push(value);
222
+ if (!enabled)
223
+ return Infinity;
224
+ const i = buffer.length - 1;
225
+ if (i >= readyBars) {
226
+ const last = buffer[i];
227
+ const past = buffer[i - lookbackBars];
228
+ if (Number.isFinite(last) && Number.isFinite(past)) {
229
+ const s = computeAverageAmaSlopePct(last, past, lookbackBars);
230
+ if (Number.isFinite(s)) {
231
+ const v = Math.abs(s);
232
+ let lo = 0;
233
+ let hi = sorted.length;
234
+ while (lo < hi) {
235
+ const mid = (lo + hi) >> 1;
236
+ if (sorted[mid] < v)
237
+ lo = mid + 1;
238
+ else
239
+ hi = mid;
240
+ }
241
+ sorted.splice(lo, 0, v);
242
+ }
243
+ }
244
+ }
245
+ return percentileFromSorted(sorted, clipPercentile);
246
+ },
247
+ };
248
+ }
249
+ export { computeDynamicWeightSeries, computeAverageAmaSlopePct, echoLatchSeries, roundToN, computeAmaSlopeClipThreshold, createAmaSlopeClipTracker, };
136
250
  //# sourceMappingURL=dynamic_weight_series.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic_weight_series.js","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/dynamic_weight_series.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dynamic_weight_series.js","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/dynamic_weight_series.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { bilinearInterpolate } from './regime_interp.js';
2
1
  /**
3
2
  * Compute the Hurst+PE regime multiplier from a price series.
4
3
  *
@@ -39,5 +38,5 @@ declare function computeRegimeMultiplier(closes: any, opts?: any): {
39
38
  isReady: boolean;
40
39
  series: number[];
41
40
  };
42
- export { computeRegimeMultiplier, bilinearInterpolate };
41
+ export { computeRegimeMultiplier };
43
42
  //# sourceMappingURL=regime_gate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"regime_gate.d.ts","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/regime_gate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAgCzD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,iBAAS,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,GAAE,GAAQ;;;;;;;;;;;;;;;;EAgE3D;AAED,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,CAAA"}
1
+ {"version":3,"file":"regime_gate.d.ts","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/regime_gate.ts"],"names":[],"mappings":"AAsCA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,iBAAS,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,GAAE,GAAQ;;;;;;;;;;;;;;;;EAwE3D;AAED,OAAO,EAAE,uBAAuB,EAAE,CAAA"}
@@ -1,28 +1,28 @@
1
- import { HurstAnalyzer } from '../signals/hurst_analyzer.js';
1
+ 'use strict';
2
+ import { HurstAnalyzer, classifyHurst } from '../signals/hurst_analyzer.js';
2
3
  import { PermutationEntropyAnalyzer } from '../signals/permutation_entropy_analyzer.js';
3
4
  import { MARKET_ADAPTER } from '../../../modules/constants.js';
4
5
  import { roundTo } from '../../../modules/order/utils/math.js';
5
6
  import { bilinearInterpolate } from './regime_interp.js';
6
- 'use strict';
7
7
  const HURST_CONFIG = MARKET_ADAPTER.HURST_CONFIG;
8
8
  const PE_CONFIG = MARKET_ADAPTER.PE_CONFIG;
9
- function resolveHNodes(hurstZoneBand = null) {
10
- const band = Number.isFinite(hurstZoneBand) ? hurstZoneBand : MARKET_ADAPTER.HURST_ZONE_BAND;
11
- return [0.5 + band, 0.5, 0.5 - band];
12
- }
13
9
  function resolvePeNodes(peNodes = null) {
14
10
  if (Array.isArray(peNodes) && peNodes.length === 3 && peNodes.every(Number.isFinite)) {
15
11
  return peNodes;
16
12
  }
17
13
  return MARKET_ADAPTER.PE_NODES;
18
14
  }
19
- function classifyHurstRegime(h, hurstZoneBand = null) {
20
- const [upper, , lower] = resolveHNodes(hurstZoneBand);
21
- if (h >= upper)
22
- return 'TRENDING';
23
- if (h <= lower)
24
- return 'MEAN_REVERTING';
25
- return 'RANDOM';
15
+ /**
16
+ * A regime table must be a 3x3 matrix of finite numbers — bilinear
17
+ * interpolation indexes it blindly, and a malformed custom table would
18
+ * otherwise produce NaN multipliers that propagate silently into weights.
19
+ */
20
+ function isValidRegimeTable(table) {
21
+ return Array.isArray(table)
22
+ && table.length === 3
23
+ && table.every((row) => Array.isArray(row)
24
+ && row.length === 3
25
+ && row.every((v) => Number.isFinite(v)));
26
26
  }
27
27
  function classifyPeRegime(pe, peNodes = null) {
28
28
  const [low, , high] = resolvePeNodes(peNodes);
@@ -58,10 +58,19 @@ function classifyPeRegime(pe, peNodes = null) {
58
58
  function computeRegimeMultiplier(closes, opts = {}) {
59
59
  const sensitivity = Number.isFinite(opts.regimeSensitivity) ? opts.regimeSensitivity : 1.0;
60
60
  const regimeTable = opts.regimeTable ?? MARKET_ADAPTER.REGIME_TABLE;
61
+ // Fail loudly on a malformed custom table instead of silently producing
62
+ // NaN multipliers downstream.
63
+ if (!isValidRegimeTable(regimeTable)) {
64
+ throw new Error('regimeTable must be a 3x3 matrix of finite numbers');
65
+ }
61
66
  const hurstZoneBand = Number.isFinite(opts.hurstZoneBand) ? opts.hurstZoneBand : MARKET_ADAPTER.HURST_ZONE_BAND;
62
67
  const peNodes = Array.isArray(opts.peNodes) ? opts.peNodes : MARKET_ADAPTER.PE_NODES;
63
68
  const hurstCfg = opts.hurstConfig ?? HURST_CONFIG;
64
69
  const peCfg = opts.peConfig ?? PE_CONFIG;
70
+ // Clamp to 1.0 max: regime only dampens, never amplifies. The
71
+ // sensitivity exponent is applied in one place for both the per-bar
72
+ // series and the final value.
73
+ const applySensitivityAndClamp = (baseMult) => Math.min(sensitivity === 1.0 ? baseMult : Math.pow(baseMult, sensitivity), 1.0);
65
74
  const notReady = {
66
75
  multiplier: 1.0,
67
76
  hurst: null,
@@ -89,12 +98,11 @@ function computeRegimeMultiplier(closes, opts = {}) {
89
98
  const h = hurstResult.hurst;
90
99
  const ne = peResult.normalizedEntropy;
91
100
  const baseMult = bilinearInterpolate(h, ne, regimeTable, { hurstZoneBand, peNodes });
92
- const rawMult = sensitivity === 1.0 ? baseMult : Math.pow(baseMult, sensitivity);
93
- series[i] = Math.min(rawMult, 1.0);
101
+ series[i] = applySensitivityAndClamp(baseMult);
94
102
  }
95
103
  }
96
104
  catch (_) {
97
- // skip invalid prices
105
+ // skip invalid prices (analyzers throw only on non-positive prices)
98
106
  }
99
107
  }
100
108
  if (!hurstResult?.isReady || !peResult?.isReady)
@@ -102,18 +110,16 @@ function computeRegimeMultiplier(closes, opts = {}) {
102
110
  const h = hurstResult.hurst;
103
111
  const ne = peResult.normalizedEntropy;
104
112
  const baseMult = bilinearInterpolate(h, ne, regimeTable, { hurstZoneBand, peNodes });
105
- // Clamp to 1.0 max: regime only dampens, never amplifies
106
- const rawMult = sensitivity === 1.0 ? baseMult : Math.pow(baseMult, sensitivity);
107
- const finalMult = Math.min(rawMult, 1.0);
113
+ const finalMult = applySensitivityAndClamp(baseMult);
108
114
  return {
109
115
  multiplier: roundTo(finalMult, 1000),
110
116
  hurst: h,
111
117
  pe: roundTo(ne, 10000),
112
- hurstRegime: classifyHurstRegime(h, hurstZoneBand),
118
+ hurstRegime: classifyHurst(h, hurstZoneBand).regime,
113
119
  peRegime: classifyPeRegime(ne, peNodes),
114
120
  isReady: true,
115
121
  series: series.map((value) => roundTo(value, 1000)),
116
122
  };
117
123
  }
118
- export { computeRegimeMultiplier, bilinearInterpolate };
124
+ export { computeRegimeMultiplier };
119
125
  //# sourceMappingURL=regime_gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"regime_gate.js","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/regime_gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"regime_gate.js","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/regime_gate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"volatility_shift.d.ts","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/volatility_shift.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,iBAAS,sBAAsB,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,GAAE,GAAQ;;;;;;EA+BlE;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAA"}
1
+ {"version":3,"file":"volatility_shift.d.ts","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/volatility_shift.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,iBAAS,sBAAsB,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,GAAE,GAAQ;;;;;;EAkClE;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAA"}
@@ -19,6 +19,9 @@ function computeVolatilityShift(weightVariance, opts = {}) {
19
19
  const safeScaleX = Number.isFinite(scaleX) && scaleX >= 0 ? scaleX : 10.0;
20
20
  const safeThreshold = Number.isFinite(threshold) && threshold >= 0 ? threshold : 0.1;
21
21
  const safeClamp = Number.isFinite(clampValue) && clampValue >= 0 ? clampValue : 0.5;
22
+ // Effective ranges (mirrors MARKET_ADAPTER.DYNAMIC_WEIGHT_VOLATILITY_*_MIN/MAX
23
+ // in modules/constants.ts; the live service normalizes to these same bounds
24
+ // at its config read point, so this is a safety net for direct callers).
22
25
  const effectiveExponent = Math.max(0.5, Math.min(1.0, safeExponent));
23
26
  const effectiveScaleX = Math.max(1.0, Math.min(100.0, safeScaleX));
24
27
  const rawDelta = -Math.pow(safeVariance, effectiveExponent) * effectiveScaleX;
@@ -1 +1 @@
1
- {"version":3,"file":"volatility_shift.js","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/volatility_shift.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;GAYG;AAEH,SAAS,sBAAsB,CAAC,cAAmB,EAAE,OAAY,EAAE;IAC/D,MAAM,EACF,QAAQ,GAAG,GAAG,EACd,MAAM,GAAG,IAAI,EACb,SAAS,GAAG,GAAG,EACf,UAAU,GAAG,GAAG,EAChB,SAAS,GAAG,CAAC,CAAC,EACd,SAAS,GAAG,CAAC,EACb,cAAc,GAAG,GAAG,GACvB,GAAG,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACrF,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;IACpF,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,GAAG,eAAe,CAAC;IAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;IACvF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC;IAElG,OAAO;QACH,iBAAiB,EAAE,eAAe;QAClC,cAAc;QACd,eAAe;QACf,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,eAAe;KACxB,CAAC;AACN,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAA"}
1
+ {"version":3,"file":"volatility_shift.js","sourceRoot":"","sources":["../../../../market_adapter/core/strategies/volatility_shift.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;GAYG;AAEH,SAAS,sBAAsB,CAAC,cAAmB,EAAE,OAAY,EAAE;IAC/D,MAAM,EACF,QAAQ,GAAG,GAAG,EACd,MAAM,GAAG,IAAI,EACb,SAAS,GAAG,GAAG,EACf,UAAU,GAAG,GAAG,EAChB,SAAS,GAAG,CAAC,CAAC,EACd,SAAS,GAAG,CAAC,EACb,cAAc,GAAG,GAAG,GACvB,GAAG,IAAI,CAAC;IAET,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACrF,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;IACpF,+EAA+E;IAC/E,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,GAAG,eAAe,CAAC;IAC9E,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;IACvF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC;IAElG,OAAO;QACH,iBAAiB,EAAE,eAAe;QAClC,cAAc;QACd,eAAe;QACf,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,eAAe;KACxB,CAAC;AACN,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAA"}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ 'use strict';
2
3
  import { createRequire } from 'node:module';
3
4
  const require = createRequire(import.meta.url);
4
- 'use strict';
5
5
  /**
6
6
  * Probe public CEX APIs for a base/quote cross and synthesize candles from
7
7
  * the two legs against a common quote (e.g. XRP/USDT + XAUT/USDT).
@@ -9,7 +9,6 @@ const require = createRequire(import.meta.url);
9
9
  * This is intended as a seed generator for brand-new market_adapter files.
10
10
  * It does not rely on TradingView or Kibana.
11
11
  */
12
- const { path } = require('../../modules/path_api');
13
12
  const { getStorage } = require('../../modules/storage');
14
13
  const storage = getStorage();
15
14
  const { fillCandleGaps } = require('../candle_utils');
@@ -20,6 +19,7 @@ const { PATHS } = require('../../modules/paths');
20
19
  const { MARKET_ADAPTER } = require('../../modules/constants');
21
20
  const { getAmaWarmupBars } = require('../core/strategies/ama');
22
21
  const { getErrorMessage } = require('../../modules/utils/errors');
22
+ const { candleFileForBot } = require('../../analysis/bot_key_utils');
23
23
  const { DEFAULTS: MARKET_ADAPTER_DEFAULTS, resolveAmaForBot, resolveBotCfg, } = require('../market_adapter/market_adapter');
24
24
  const DEFAULT_INTERVAL = '1h';
25
25
  const DEFAULT_LIMIT = 1000;
@@ -477,7 +477,8 @@ const EXCHANGES = {
477
477
  },
478
478
  marketsUrl: 'https://api.htx.com/v1/common/symbols',
479
479
  candlesUrl: ({ id, interval, limit, sinceMs, untilMs }) => {
480
- const url = new URL('https://api.htx.com/market/history/candles');
480
+ // Official Huobi/HTX spot historical kline endpoint is /market/history/kline
481
+ const url = new URL('https://api.htx.com/market/history/kline');
481
482
  url.searchParams.set('symbol', id);
482
483
  url.searchParams.set('period', interval);
483
484
  url.searchParams.set('size', String(limit));
@@ -536,6 +537,8 @@ const EXCHANGES = {
536
537
  '30m': '30',
537
538
  '1h': '60',
538
539
  '4h': '240',
540
+ '6h': '360',
541
+ '12h': '720',
539
542
  '1d': '1440',
540
543
  '1w': '10080',
541
544
  };
@@ -587,6 +590,8 @@ const EXCHANGES = {
587
590
  },
588
591
  okx: {
589
592
  name: 'OKX',
593
+ // /api/v5/market/candles caps limit at CEX_PAGE_LIMIT_CAPS.okx per request
594
+ maxLimit: MARKET_ADAPTER.CEX_PAGE_LIMIT_CAPS.okx,
590
595
  formatInterval: (interval) => {
591
596
  const map = {
592
597
  '1m': '1',
@@ -637,6 +642,8 @@ const EXCHANGES = {
637
642
  },
638
643
  mexc: {
639
644
  name: 'MEXC',
645
+ // /api/v3/klines caps limit at CEX_PAGE_LIMIT_CAPS.mexc per request
646
+ maxLimit: MARKET_ADAPTER.CEX_PAGE_LIMIT_CAPS.mexc,
640
647
  formatInterval: (interval) => {
641
648
  const map = {
642
649
  '1m': '1m',
@@ -645,8 +652,11 @@ const EXCHANGES = {
645
652
  '30m': '30m',
646
653
  '1h': '60m',
647
654
  '4h': '4h',
655
+ '6h': '6h',
656
+ '12h': '12h',
648
657
  '1d': '1d',
649
- '1w': '1w',
658
+ // MEXC interval enums are case-sensitive
659
+ '1w': '1W',
650
660
  };
651
661
  return map[lower(interval)] || interval;
652
662
  },
@@ -807,7 +817,8 @@ function printHelp() {
807
817
 
808
818
  Options:
809
819
  --exchange <name|auto> Exchange to use or comma-separated preference list
810
- --interval <label> Candle interval, default ${DEFAULT_INTERVAL}
820
+ --interval <label> Candle interval (1m|5m|15m|30m|1h|4h|6h|12h|1d|1w, or bare
821
+ minutes like \`90\` = 90m), default ${DEFAULT_INTERVAL}
811
822
  --limit <n> Number of candles to fetch from each leg, default ${DEFAULT_LIMIT}
812
823
  --lookback-hours <n> Probe depth in hours; default is the adapter seed requirement
813
824
  --base <asset> Base asset, default ${DEFAULT_BASE}
@@ -838,10 +849,20 @@ function findMarketId(markets, base, quote) {
838
849
  return market || null;
839
850
  }
840
851
  function buildSyntheticCandle(left, right) {
852
+ // Guard against degenerate zero/negative leg prices: dividing by them
853
+ // would produce Infinity/NaN OHLC rows in the seed file.
854
+ const leftPrices = [left[1], left[2], left[3], left[4]];
855
+ const rightPrices = [right[1], right[2], right[3], right[4]];
856
+ if (!leftPrices.every((v) => Number.isFinite(v) && v > 0)
857
+ || !rightPrices.every((v) => Number.isFinite(v) && v > 0)) {
858
+ return null;
859
+ }
841
860
  const open = left[1] / right[1];
842
861
  const close = left[4] / right[4];
843
862
  const high = Math.max(left[2] / right[3], open, close);
844
863
  const low = Math.min(left[3] / right[2], open, close);
864
+ if (![open, high, low, close].every(Number.isFinite))
865
+ return null;
845
866
  const volume = Number(left[5] || 0);
846
867
  return [left[0], open, high, low, close, Number.isFinite(volume) ? volume : 0];
847
868
  }
@@ -849,7 +870,9 @@ function synthesizeCrossCandles(leftCandles, rightCandles) {
849
870
  const leftMap = new Map(leftCandles.map((row) => [row[0], row]));
850
871
  const rightMap = new Map(rightCandles.map((row) => [row[0], row]));
851
872
  const timestamps = Array.from(leftMap.keys()).filter((ts) => rightMap.has(ts)).sort((a, b) => a - b);
852
- return timestamps.map((ts) => buildSyntheticCandle(leftMap.get(ts), rightMap.get(ts)));
873
+ return timestamps
874
+ .map((ts) => buildSyntheticCandle(leftMap.get(ts), rightMap.get(ts)))
875
+ .filter((row) => row != null);
853
876
  }
854
877
  function chooseOutputPath(config, intervalLabel) {
855
878
  if (config.out)
@@ -861,7 +884,7 @@ function chooseOutputPath(config, intervalLabel) {
861
884
  }
862
885
  throw new Error('Provide --bot-key or --out when generating candles');
863
886
  }
864
- return path.join(PATHS.MARKET_ADAPTER.DATA_DIR, `market_adapter_${botKey}_${intervalLabel}.json`);
887
+ return candleFileForBot(botKey, intervalLabel);
865
888
  }
866
889
  function dedupeCandles(candles) {
867
890
  const map = new Map();
@@ -874,20 +897,22 @@ function dedupeCandles(candles) {
874
897
  }
875
898
  async function fetchHistoricalCandles(def, marketId, interval, intervalSeconds, lookbackHours, pageLimit) {
876
899
  const apiInterval = def.formatInterval ? def.formatInterval(interval) : interval;
900
+ // Respect the exchange's per-request page cap (e.g. OKX 300, MEXC 500)
901
+ const effectivePageLimit = Math.max(1, Math.min(Number(pageLimit) || DEFAULT_LIMIT, Number(def.maxLimit) || Infinity));
877
902
  const intervalMs = Math.max(1, Number(intervalSeconds || 3600)) * 1000;
878
903
  const endMs = Math.floor(Date.now() / intervalMs) * intervalMs;
879
904
  const lookbackMs = Math.max(1, Number(lookbackHours || DEFAULT_BOOTSTRAP_LOOKBACK_HOURS)) * 3600 * 1000;
880
905
  const startMs = Math.max(0, endMs - lookbackMs);
881
- const maxIterations = Math.ceil(lookbackMs / Math.max(intervalMs, pageLimit * intervalMs * 0.8)) + 8;
906
+ const maxIterations = Math.ceil(lookbackMs / Math.max(intervalMs, effectivePageLimit * intervalMs * 0.8)) + 8;
882
907
  let cursor = startMs;
883
908
  let collected = [];
884
909
  for (let i = 0; i < maxIterations && cursor <= endMs; i++) {
885
- const pageEnd = Math.min(endMs, cursor + intervalMs * Math.max(1, pageLimit - 1));
910
+ const pageEnd = Math.min(endMs, cursor + intervalMs * Math.max(1, effectivePageLimit - 1));
886
911
  const res = await fetchJson(def.candlesUrl({
887
912
  id: marketId,
888
913
  interval: apiInterval,
889
914
  intervalSeconds,
890
- limit: pageLimit,
915
+ limit: effectivePageLimit,
891
916
  sinceMs: cursor,
892
917
  untilMs: pageEnd,
893
918
  }));
@@ -929,45 +954,32 @@ async function probeExchange(exchangeId, base, quote, commonQuote, interval, int
929
954
  };
930
955
  }
931
956
  const markets = def.parseMarkets(marketsRes.json);
932
- const xrpCommon = findMarketId(markets, base, commonQuote);
933
- const xautCommon = findMarketId(markets, quote, commonQuote);
957
+ const baseCommon = findMarketId(markets, base, commonQuote);
958
+ const quoteCommon = findMarketId(markets, quote, commonQuote);
934
959
  const nativeCross = findMarketId(markets, base, quote);
935
960
  const result = {
936
961
  exchangeId,
937
962
  name: def.name,
938
963
  markets,
939
- xrpCommon,
940
- xautCommon,
964
+ baseCommon,
965
+ quoteCommon,
941
966
  nativeCross,
942
- xrpCandles: [],
943
- xautCandles: [],
944
- nativeCrossCandles: [],
967
+ baseCandles: [],
968
+ quoteCandles: [],
945
969
  requiredCandles,
946
970
  probeLookbackHours,
947
971
  probeCandles: lookbackHoursToCandles(probeLookbackHours, intervalSeconds),
948
972
  };
949
- if (xrpCommon && xautCommon) {
950
- result.xrpCandles = await fetchHistoricalCandles(def, xrpCommon.id, interval, intervalSeconds, probeLookbackHours, pageLimit);
951
- result.xautCandles = await fetchHistoricalCandles(def, xautCommon.id, interval, intervalSeconds, probeLookbackHours, pageLimit);
952
- result.hasUsableTimeframe = result.xrpCandles.length > 0 && result.xautCandles.length > 0;
953
- result.lookbackSatisfied = result.xrpCandles.length >= result.requiredCandles
954
- && result.xautCandles.length >= result.requiredCandles;
955
- result.xrpRange = measureCandles(result.xrpCandles, intervalSeconds);
956
- result.xautRange = measureCandles(result.xautCandles, intervalSeconds);
957
- result.availableCandles = Math.min(result.xrpRange.count, result.xautRange.count);
958
- result.availableLookbackHours = Math.min(result.xrpRange.spanHours, result.xautRange.spanHours);
959
- }
960
- if (nativeCross) {
961
- const sampleLimit = Math.min(3, Math.max(1, Number(pageLimit) || DEFAULT_LIMIT));
962
- const nativeCandlesRes = await fetchJson(def.candlesUrl({
963
- id: nativeCross.id,
964
- interval: def.formatInterval ? def.formatInterval(interval) : interval,
965
- intervalSeconds,
966
- limit: sampleLimit,
967
- }));
968
- if (nativeCandlesRes.ok && nativeCandlesRes.json) {
969
- result.nativeCrossCandles = def.parseCandles(nativeCandlesRes.json);
970
- }
973
+ if (baseCommon && quoteCommon) {
974
+ result.baseCandles = await fetchHistoricalCandles(def, baseCommon.id, interval, intervalSeconds, probeLookbackHours, pageLimit);
975
+ result.quoteCandles = await fetchHistoricalCandles(def, quoteCommon.id, interval, intervalSeconds, probeLookbackHours, pageLimit);
976
+ result.hasUsableTimeframe = result.baseCandles.length > 0 && result.quoteCandles.length > 0;
977
+ result.lookbackSatisfied = result.baseCandles.length >= result.requiredCandles
978
+ && result.quoteCandles.length >= result.requiredCandles;
979
+ result.baseRange = measureCandles(result.baseCandles, intervalSeconds);
980
+ result.quoteRange = measureCandles(result.quoteCandles, intervalSeconds);
981
+ result.availableCandles = Math.min(result.baseRange.count, result.quoteRange.count);
982
+ result.availableLookbackHours = Math.min(result.baseRange.spanHours, result.quoteRange.spanHours);
971
983
  }
972
984
  return result;
973
985
  }
@@ -987,11 +999,11 @@ function pickBestExchange(probes, preferredExchangeIds) {
987
999
  function rankProbes(probes, preferredExchangeIds, onlyUsable = false) {
988
1000
  const preferred = (preferredExchangeIds || []).map((id) => lower(id));
989
1001
  return probes
990
- .filter((probe) => probe && !probe.error && probe.xrpCommon && probe.xautCommon && probe.hasUsableTimeframe)
1002
+ .filter((probe) => probe && !probe.error && probe.baseCommon && probe.quoteCommon && probe.hasUsableTimeframe)
991
1003
  .map((probe) => ({
992
1004
  ...probe,
993
- score: Math.min(probe.xrpRange?.count || 0, probe.xautRange?.count || 0),
994
- depthScore: Math.min(probe.xrpRange?.spanHours || 0, probe.xautRange?.spanHours || 0),
1005
+ score: Math.min(probe.baseRange?.count || 0, probe.quoteRange?.count || 0),
1006
+ depthScore: Math.min(probe.baseRange?.spanHours || 0, probe.quoteRange?.spanHours || 0),
995
1007
  preferredRank: preferred.length > 0 ? preferred.indexOf(lower(probe.exchangeId)) : -1,
996
1008
  usable: Boolean(probe.lookbackSatisfied),
997
1009
  }))
@@ -1015,13 +1027,13 @@ function rankProbes(probes, preferredExchangeIds, onlyUsable = false) {
1015
1027
  }
1016
1028
  function printSummary(probes, base, quote, commonQuote) {
1017
1029
  const rows = probes.map((probe, index) => {
1018
- const xrp = probe.xrpCommon ? `yes (${probe.xrpCommon.id})` : 'no';
1019
- const xaut = probe.xautCommon ? `yes (${probe.xautCommon.id})` : 'no';
1030
+ const baseLeg = probe.baseCommon ? `yes (${probe.baseCommon.id})` : 'no';
1031
+ const quoteLeg = probe.quoteCommon ? `yes (${probe.quoteCommon.id})` : 'no';
1020
1032
  const cross = probe.nativeCross ? `yes (${probe.nativeCross.id})` : 'no';
1021
1033
  const candleState = probe.error
1022
1034
  ? `error: ${probe.error}`
1023
- : `${probe.xrpRange?.count || 0}/${probe.xautRange?.count || 0} candles`;
1024
- const usable = (!probe.error && probe.xrpCommon && probe.xautCommon && probe.lookbackSatisfied) ? 'yes' : 'no';
1035
+ : `${probe.baseRange?.count || 0}/${probe.quoteRange?.count || 0} candles`;
1036
+ const usable = (!probe.error && probe.baseCommon && probe.quoteCommon && probe.lookbackSatisfied) ? 'yes' : 'no';
1025
1037
  const depth = probe.error
1026
1038
  ? '-'
1027
1039
  : `${(probe.availableLookbackHours || 0).toFixed(1)}h`;
@@ -1029,8 +1041,8 @@ function printSummary(probes, base, quote, commonQuote) {
1029
1041
  rank: index + 1,
1030
1042
  exchange: probe.exchangeId,
1031
1043
  name: probe.name || probe.exchangeId,
1032
- xrp,
1033
- xaut,
1044
+ baseLeg,
1045
+ quoteLeg,
1034
1046
  cross,
1035
1047
  usable,
1036
1048
  required: `${probe.requiredCandles || '?'} candles`,
@@ -1044,11 +1056,13 @@ function printSummary(probes, base, quote, commonQuote) {
1044
1056
  }
1045
1057
  async function main() {
1046
1058
  const parsedConfig = parseArgs();
1047
- const { config, botContext, botCfg, botAma, } = applyBotDerivedConfig(parsedConfig);
1048
- if (config.help) {
1059
+ // Handle --help before bot-derived resolution so a typo'd --bot-name does
1060
+ // not crash instead of printing usage.
1061
+ if (parsedConfig.config.help) {
1049
1062
  printHelp();
1050
1063
  return;
1051
1064
  }
1065
+ const { config, botContext, botCfg, botAma, } = applyBotDerivedConfig(parsedConfig);
1052
1066
  const { seconds: intervalSeconds, label: intervalLabel } = parseInterval(config.interval);
1053
1067
  const requiredCandles = computeRequiredCandles(botAma, botCfg);
1054
1068
  const probeLookbackHours = Number.isFinite(Number(config.lookbackHours)) && Number(config.lookbackHours) > 0
@@ -1081,14 +1095,14 @@ async function main() {
1081
1095
  throw new Error('No exchange found that exposes both leg markets and enough lookback depth');
1082
1096
  }
1083
1097
  const def = EXCHANGES[selected.exchangeId];
1084
- const xrpMarket = selected.xrpCommon;
1085
- const xautMarket = selected.xautCommon;
1086
- const xrpCandles = selected.xrpCandles;
1087
- const xautCandles = selected.xautCandles;
1088
- if (xrpCandles.length === 0 || xautCandles.length === 0) {
1098
+ const baseMarket = selected.baseCommon;
1099
+ const quoteMarket = selected.quoteCommon;
1100
+ const baseCandles = selected.baseCandles;
1101
+ const quoteCandles = selected.quoteCandles;
1102
+ if (baseCandles.length === 0 || quoteCandles.length === 0) {
1089
1103
  throw new Error(`Selected exchange ${selected.exchangeId} returned no candles for one of the legs`);
1090
1104
  }
1091
- const synthetic = synthesizeCrossCandles(xrpCandles, xautCandles);
1105
+ const synthetic = synthesizeCrossCandles(baseCandles, quoteCandles);
1092
1106
  if (synthetic.length === 0) {
1093
1107
  throw new Error(`Selected exchange ${selected.exchangeId} produced no overlapping synthetic candles`);
1094
1108
  }
@@ -1142,7 +1156,7 @@ async function main() {
1142
1156
  if (!config.quiet) {
1143
1157
  console.log(`Wrote ${filled.length} synthetic candles to ${outPath}`);
1144
1158
  console.log(`Source: ${selected.exchangeId} (${def.name})`);
1145
- console.log(`Legs: ${xrpMarket.id} and ${xautMarket.id}`);
1159
+ console.log(`Legs: ${baseMarket.id} and ${quoteMarket.id}`);
1146
1160
  console.log(`Output pair: ${upper(config.base)}/${upper(config.quote)}`);
1147
1161
  }
1148
1162
  }