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.
- package/CHANGELOG.md +53 -0
- package/README.md +23 -13
- package/analysis/ama_fitting/analyze_ama_price_changes.ts +7 -3
- package/analysis/ama_fitting/analyze_lambda_vs_slow.ts +3 -3
- package/analysis/ama_fitting/calibrate_convergence_er.ts +8 -6
- package/analysis/ama_fitting/fetch_lp_candles.ts +8 -3
- package/analysis/ama_fitting/generate_unified_comparison_chart.ts +30 -67
- package/analysis/ama_fitting/optimizer_high_resolution.ts +22 -13
- package/analysis/ama_fitting/package.json +1 -1
- package/analysis/analyze_derivatives.ts +4 -4
- package/analysis/analyze_dynamic_weight.ts +21 -5
- package/analysis/analyze_kalman.ts +54 -25
- package/analysis/analyze_regime.ts +2 -2
- package/analysis/analyze_regime_windows.ts +27 -19
- package/analysis/analyze_risk_profile.ts +3 -3
- package/analysis/analyze_trade_heatmap.ts +3 -3
- package/analysis/analyze_volatility.ts +2 -2
- package/analysis/bot_fitting/README.md +93 -19
- package/analysis/bot_fitting/backtest_ama_sweep.ts +316 -199
- package/analysis/bot_fitting/backtest_bot_fitting.ts +520 -85
- package/analysis/bot_fitting/shared_utils.ts +16 -10
- package/analysis/bot_key_utils.ts +14 -11
- package/analysis/bot_usage/discover_bot_accounts.ts +5 -3
- package/analysis/bot_usage/kibana_bot_queries.ts +2 -257
- package/analysis/chart_css.ts +6 -4
- package/analysis/chart_ui.ts +0 -1
- package/analysis/chart_utils.ts +11 -2
- package/analysis/derivative_chart_generator.ts +2 -2
- package/analysis/math_utils.ts +1 -8
- package/analysis/price_sources.ts +8 -2
- package/analysis/resolve_source.ts +1 -1
- package/analysis/results/ama_sweep_results_lp_pool_133_1h.json +2455 -0
- package/analysis/results/bot_fitting_results_lp_pool_133_1h.json +218 -0
- package/analysis/trade_profitability.ts +61 -28
- package/analysis/tradingview/analyze_tradingview.ts +1 -1
- package/analysis/tradingview/h-bts_tradingview.html +1570 -0
- package/analysis/tradingview/t-bts_tradingview.html +1570 -0
- package/analysis/tradingview/tradingview_uplot_chart_generator.ts +302 -74
- package/analysis/trend_detection/DYNAMIC_WEIGHT_RESEARCH.md +1 -1
- package/analysis/trend_detection/derivative_analyzer.ts +12 -3
- package/analysis/trend_detection/dynamic_weight_chart_generator.ts +25 -27
- package/analysis/trend_detection/hurst_analyzer.ts +1 -1
- package/analysis/trend_detection/kalman_chart_generator.ts +42 -14
- package/analysis/trend_detection/package.json +1 -1
- package/analysis/trend_detection/regime_chart_generator.ts +39 -19
- package/analysis/trend_detection/tests/test_kalman_trend.ts +1 -1
- package/analysis/trend_detection/tests/test_kalman_velocity_smoothing.ts +1 -1
- package/analysis/trend_detection/volatility_chart_generator.ts +1 -1
- package/claw/ecosystem.config.cjs +2 -3
- package/claw/examples/memu_integration_example.ts +17 -17
- package/claw/index.ts +1 -1
- package/claw/modules/chain_actions.ts +51 -54
- package/claw/modules/chain_broadcast.ts +66 -104
- package/claw/modules/claw_bridge.ts +63 -83
- package/claw/modules/claw_catalog.ts +48 -17
- package/claw/modules/claw_infra.ts +1 -5
- package/claw/modules/claw_launcher.ts +48 -50
- package/claw/modules/claw_skill_md.ts +15 -21
- package/claw/modules/credit_runtime_adapter.ts +3 -19
- package/claw/modules/decision_loop.ts +9 -9
- package/claw/modules/dexbot_bridge.ts +8 -8
- package/claw/modules/dexbot_profiles.ts +5 -21
- package/claw/modules/feed_price_source.ts +1 -1
- package/claw/modules/honest_ecosystem.ts +24 -8
- package/claw/modules/kibana_price_source.ts +1 -1
- package/claw/modules/launcher_mode_detector.ts +1 -1
- package/claw/modules/launcher_paths.ts +1 -1
- package/claw/modules/liquidity_pools.ts +10 -3
- package/claw/modules/mcp_utils.ts +109 -0
- package/claw/modules/memu_bridge.ts +76 -54
- package/claw/modules/mpa_utils.ts +26 -3
- package/claw/modules/position_discovery.ts +17 -28
- package/claw/modules/position_health.ts +1 -1
- package/claw/modules/position_manager.ts +32 -41
- package/claw/modules/position_manager_watch.ts +3 -2
- package/claw/modules/short_mpa_strategy.ts +1 -9
- package/claw/modules/skill_utils.ts +5 -3
- package/claw/modules/utils.ts +9 -1
- package/claw/package.json +3 -3
- package/claw/runtimes/openclaw-plugin/index.ts +27 -10
- package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
- package/claw/runtimes/openclaw-plugin/package.json +1 -1
- package/claw/scripts/claw_bridge.ts +1 -1
- package/claw/scripts/claw_mcp_server.ts +19 -78
- package/claw/scripts/honest_assets_report.ts +19 -84
- package/claw/scripts/memu_mcp_server.ts +57 -155
- package/claw/skills/launcher-ops/references/launcher-workflow.md +2 -2
- package/claw/tests/package.json +1 -1
- package/claw/tests/test_claw_bridge.ts +47 -19
- package/claw/tests/test_claw_catalog_and_credentials.ts +8 -4
- package/claw/tests/test_claw_chain_layer.ts +39 -19
- package/claw/tests/test_claw_data_flow.ts +28 -20
- package/claw/tests/test_claw_domain_logic.ts +25 -19
- package/claw/tests/test_claw_manifest_and_matrix.ts +23 -3
- package/claw/tests/test_claw_mcp_transport.ts +13 -8
- package/claw/tests/test_claw_regressions.ts +254 -128
- package/claw/tests/test_claw_skill_generation.ts +1 -1
- package/claw/tests/test_nullclaw_tmp_integration.ts +2 -3
- package/claw/tests/test_position_health.ts +1 -77
- package/claw/tests/test_position_manager.ts +20 -18
- package/claw/tests/test_position_manager_watch_health.ts +39 -43
- package/claw/tests/test_short_mpa_strategy.ts +20 -17
- package/claw/tsconfig.json +4 -3
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js +7 -3
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js.map +1 -1
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js +3 -3
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js.map +1 -1
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js +8 -6
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js.map +1 -1
- package/dist/analysis/ama_fitting/fetch_lp_candles.js +8 -3
- package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -1
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts +2 -2
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts.map +1 -1
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js +31 -75
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js.map +1 -1
- package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts.map +1 -1
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js +21 -13
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js.map +1 -1
- package/dist/analysis/analyze_derivatives.d.ts +0 -18
- package/dist/analysis/analyze_derivatives.d.ts.map +1 -1
- package/dist/analysis/analyze_derivatives.js +4 -4
- package/dist/analysis/analyze_derivatives.js.map +1 -1
- package/dist/analysis/analyze_dynamic_weight.d.ts +0 -11
- package/dist/analysis/analyze_dynamic_weight.d.ts.map +1 -1
- package/dist/analysis/analyze_dynamic_weight.js +19 -5
- package/dist/analysis/analyze_dynamic_weight.js.map +1 -1
- package/dist/analysis/analyze_kalman.d.ts +0 -10
- package/dist/analysis/analyze_kalman.d.ts.map +1 -1
- package/dist/analysis/analyze_kalman.js +51 -26
- package/dist/analysis/analyze_kalman.js.map +1 -1
- package/dist/analysis/analyze_regime.d.ts +0 -17
- package/dist/analysis/analyze_regime.d.ts.map +1 -1
- package/dist/analysis/analyze_regime.js +2 -2
- package/dist/analysis/analyze_regime.js.map +1 -1
- package/dist/analysis/analyze_regime_windows.d.ts +0 -16
- package/dist/analysis/analyze_regime_windows.d.ts.map +1 -1
- package/dist/analysis/analyze_regime_windows.js +28 -21
- package/dist/analysis/analyze_regime_windows.js.map +1 -1
- package/dist/analysis/analyze_risk_profile.js +3 -3
- package/dist/analysis/analyze_risk_profile.js.map +1 -1
- package/dist/analysis/analyze_trade_heatmap.js +3 -3
- package/dist/analysis/analyze_trade_heatmap.js.map +1 -1
- package/dist/analysis/analyze_volatility.d.ts +0 -19
- package/dist/analysis/analyze_volatility.d.ts.map +1 -1
- package/dist/analysis/analyze_volatility.js +2 -2
- package/dist/analysis/analyze_volatility.js.map +1 -1
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts +30 -14
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts.map +1 -1
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js +330 -193
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js.map +1 -1
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts +136 -1
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts.map +1 -1
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js +527 -83
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js.map +1 -1
- package/dist/analysis/bot_fitting/shared_utils.d.ts +2 -13
- package/dist/analysis/bot_fitting/shared_utils.d.ts.map +1 -1
- package/dist/analysis/bot_fitting/shared_utils.js +15 -9
- package/dist/analysis/bot_fitting/shared_utils.js.map +1 -1
- package/dist/analysis/bot_key_utils.d.ts +1 -1
- package/dist/analysis/bot_key_utils.d.ts.map +1 -1
- package/dist/analysis/bot_key_utils.js +14 -11
- package/dist/analysis/bot_key_utils.js.map +1 -1
- package/dist/analysis/bot_usage/discover_bot_accounts.js +5 -3
- package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +1 -337
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.js +2 -242
- package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -1
- package/dist/analysis/chart_css.d.ts +2 -14
- package/dist/analysis/chart_css.d.ts.map +1 -1
- package/dist/analysis/chart_css.js +6 -3
- package/dist/analysis/chart_css.js.map +1 -1
- package/dist/analysis/chart_ui.d.ts.map +1 -1
- package/dist/analysis/chart_ui.js.map +1 -1
- package/dist/analysis/chart_utils.d.ts.map +1 -1
- package/dist/analysis/chart_utils.js +15 -2
- package/dist/analysis/chart_utils.js.map +1 -1
- package/dist/analysis/derivative_chart_generator.js +2 -2
- package/dist/analysis/derivative_chart_generator.js.map +1 -1
- package/dist/analysis/math_utils.d.ts +3 -5
- package/dist/analysis/math_utils.d.ts.map +1 -1
- package/dist/analysis/math_utils.js +3 -5
- package/dist/analysis/math_utils.js.map +1 -1
- package/dist/analysis/price_sources.d.ts +1 -0
- package/dist/analysis/price_sources.d.ts.map +1 -1
- package/dist/analysis/price_sources.js +8 -2
- package/dist/analysis/price_sources.js.map +1 -1
- package/dist/analysis/resolve_source.d.ts.map +1 -1
- package/dist/analysis/resolve_source.js +1 -1
- package/dist/analysis/resolve_source.js.map +1 -1
- package/dist/analysis/trade_profitability.d.ts.map +1 -1
- package/dist/analysis/trade_profitability.js +58 -29
- package/dist/analysis/trade_profitability.js.map +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.js +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +302 -74
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts +1 -0
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +1 -1
- package/dist/analysis/trend_detection/derivative_analyzer.js +12 -3
- package/dist/analysis/trend_detection/derivative_analyzer.js.map +1 -1
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -1
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +26 -27
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -1
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts +1 -1
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +1 -1
- package/dist/analysis/trend_detection/hurst_analyzer.js +1 -1
- package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -1
- package/dist/analysis/trend_detection/kalman_chart_generator.d.ts.map +1 -1
- package/dist/analysis/trend_detection/kalman_chart_generator.js +41 -13
- package/dist/analysis/trend_detection/kalman_chart_generator.js.map +1 -1
- package/dist/analysis/trend_detection/regime_chart_generator.d.ts.map +1 -1
- package/dist/analysis/trend_detection/regime_chart_generator.js +38 -19
- package/dist/analysis/trend_detection/regime_chart_generator.js.map +1 -1
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js +1 -1
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js.map +1 -1
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js +1 -1
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js.map +1 -1
- package/dist/analysis/trend_detection/volatility_chart_generator.js +1 -1
- package/dist/analysis/trend_detection/volatility_chart_generator.js.map +1 -1
- package/dist/bot.js +3 -3
- package/dist/bot.js.map +1 -1
- package/dist/credential-daemon.d.ts +1 -1
- package/dist/credential-daemon.js +2 -2
- package/dist/credential-daemon.js.map +1 -1
- package/dist/dexbot.d.ts.map +1 -1
- package/dist/dexbot.js +25 -22
- package/dist/dexbot.js.map +1 -1
- package/dist/market_adapter/ama_signal_runner.js +6 -4
- package/dist/market_adapter/ama_signal_runner.js.map +1 -1
- package/dist/market_adapter/candle_utils.d.ts +1 -3
- package/dist/market_adapter/candle_utils.d.ts.map +1 -1
- package/dist/market_adapter/candle_utils.js +1 -11
- package/dist/market_adapter/candle_utils.js.map +1 -1
- package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -1
- package/dist/market_adapter/core/asymmetric_bounds.js +33 -30
- package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -1
- package/dist/market_adapter/core/config_normalizers.d.ts.map +1 -1
- package/dist/market_adapter/core/config_normalizers.js +10 -1
- package/dist/market_adapter/core/config_normalizers.js.map +1 -1
- package/dist/market_adapter/core/kibana_candles.d.ts +18 -42
- package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -1
- package/dist/market_adapter/core/kibana_candles.js +101 -7
- package/dist/market_adapter/core/kibana_candles.js.map +1 -1
- package/dist/market_adapter/core/kibana_client.d.ts +1 -17
- package/dist/market_adapter/core/kibana_client.d.ts.map +1 -1
- package/dist/market_adapter/core/kibana_client.js +40 -7
- package/dist/market_adapter/core/kibana_client.js.map +1 -1
- package/dist/market_adapter/core/kibana_market_candles.d.ts +0 -27
- package/dist/market_adapter/core/kibana_market_candles.d.ts.map +1 -1
- package/dist/market_adapter/core/kibana_market_candles.js +1 -1
- package/dist/market_adapter/core/kibana_market_candles.js.map +1 -1
- package/dist/market_adapter/core/market_adapter_service.d.ts +22 -13
- package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -1
- package/dist/market_adapter/core/market_adapter_service.js +96 -38
- package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
- package/dist/market_adapter/core/signals/hurst_analyzer.d.ts +10 -1
- package/dist/market_adapter/core/signals/hurst_analyzer.d.ts.map +1 -1
- package/dist/market_adapter/core/signals/hurst_analyzer.js +28 -17
- package/dist/market_adapter/core/signals/hurst_analyzer.js.map +1 -1
- package/dist/market_adapter/core/signals/kalman_trend_analyzer.d.ts +5 -0
- package/dist/market_adapter/core/signals/kalman_trend_analyzer.d.ts.map +1 -1
- package/dist/market_adapter/core/signals/kalman_trend_analyzer.js +24 -24
- package/dist/market_adapter/core/signals/kalman_trend_analyzer.js.map +1 -1
- package/dist/market_adapter/core/signals/kalman_velocity_smoothing.d.ts.map +1 -1
- package/dist/market_adapter/core/signals/kalman_velocity_smoothing.js +5 -1
- package/dist/market_adapter/core/signals/kalman_velocity_smoothing.js.map +1 -1
- package/dist/market_adapter/core/signals/permutation_entropy_analyzer.d.ts.map +1 -1
- package/dist/market_adapter/core/signals/permutation_entropy_analyzer.js +20 -3
- package/dist/market_adapter/core/signals/permutation_entropy_analyzer.js.map +1 -1
- package/dist/market_adapter/core/strategies/ama.js +1 -1
- package/dist/market_adapter/core/strategies/ama.js.map +1 -1
- package/dist/market_adapter/core/strategies/ama_slope_model.d.ts +2 -2
- package/dist/market_adapter/core/strategies/ama_slope_model.d.ts.map +1 -1
- package/dist/market_adapter/core/strategies/ama_slope_model.js +16 -4
- package/dist/market_adapter/core/strategies/ama_slope_model.js.map +1 -1
- package/dist/market_adapter/core/strategies/atr/calculator.d.ts +4 -3
- package/dist/market_adapter/core/strategies/atr/calculator.d.ts.map +1 -1
- package/dist/market_adapter/core/strategies/atr/calculator.js +16 -8
- package/dist/market_adapter/core/strategies/atr/calculator.js.map +1 -1
- package/dist/market_adapter/core/strategies/collateral_manager.d.ts.map +1 -1
- package/dist/market_adapter/core/strategies/collateral_manager.js +8 -3
- package/dist/market_adapter/core/strategies/collateral_manager.js.map +1 -1
- package/dist/market_adapter/core/strategies/dynamic_weight_series.d.ts +40 -1
- package/dist/market_adapter/core/strategies/dynamic_weight_series.d.ts.map +1 -1
- package/dist/market_adapter/core/strategies/dynamic_weight_series.js +116 -2
- package/dist/market_adapter/core/strategies/dynamic_weight_series.js.map +1 -1
- package/dist/market_adapter/core/strategies/regime_gate.d.ts +1 -2
- package/dist/market_adapter/core/strategies/regime_gate.d.ts.map +1 -1
- package/dist/market_adapter/core/strategies/regime_gate.js +27 -21
- package/dist/market_adapter/core/strategies/regime_gate.js.map +1 -1
- package/dist/market_adapter/core/strategies/volatility_shift.d.ts.map +1 -1
- package/dist/market_adapter/core/strategies/volatility_shift.js +3 -0
- package/dist/market_adapter/core/strategies/volatility_shift.js.map +1 -1
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +71 -57
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts +0 -26
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.js +72 -19
- package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
- package/dist/market_adapter/inputs/kibana_source.d.ts +5 -30
- package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -1
- package/dist/market_adapter/inputs/kibana_source.js +6 -3
- package/dist/market_adapter/inputs/kibana_source.js.map +1 -1
- package/dist/market_adapter/lp_chart_core.js +1 -1
- package/dist/market_adapter/lp_chart_core.js.map +1 -1
- package/dist/market_adapter/lp_chart_runner.d.ts +10 -1
- package/dist/market_adapter/lp_chart_runner.d.ts.map +1 -1
- package/dist/market_adapter/lp_chart_runner.js +2 -2
- package/dist/market_adapter/lp_chart_runner.js.map +1 -1
- package/dist/market_adapter/lp_chart_strategy_loader.d.ts +1 -2
- package/dist/market_adapter/lp_chart_strategy_loader.d.ts.map +1 -1
- package/dist/market_adapter/lp_chart_strategy_loader.js +5 -5
- package/dist/market_adapter/lp_chart_strategy_loader.js.map +1 -1
- package/dist/market_adapter/market_adapter.d.ts +1 -2
- package/dist/market_adapter/market_adapter.d.ts.map +1 -1
- package/dist/market_adapter/market_adapter.js +5 -7
- package/dist/market_adapter/market_adapter.js.map +1 -1
- package/dist/market_adapter/test_helpers.d.ts +3 -3
- package/dist/market_adapter/test_helpers.d.ts.map +1 -1
- package/dist/market_adapter/test_helpers.js +3 -3
- package/dist/market_adapter/test_helpers.js.map +1 -1
- package/dist/market_adapter/utils/adapter_client.js +1 -1
- package/dist/market_adapter/utils/adapter_client.js.map +1 -1
- package/dist/market_adapter/utils/atomic_write.js +1 -1
- package/dist/market_adapter/utils/atomic_write.js.map +1 -1
- package/dist/market_adapter/utils/chain.d.ts +0 -2
- package/dist/market_adapter/utils/chain.d.ts.map +1 -1
- package/dist/market_adapter/utils/chain.js +2 -3
- package/dist/market_adapter/utils/chain.js.map +1 -1
- package/dist/market_adapter/utils/data_discovery.d.ts.map +1 -1
- package/dist/market_adapter/utils/data_discovery.js +24 -8
- package/dist/market_adapter/utils/data_discovery.js.map +1 -1
- package/dist/market_adapter/utils/dynamic_grid_snapshot.d.ts.map +1 -1
- package/dist/market_adapter/utils/dynamic_grid_snapshot.js +2 -5
- package/dist/market_adapter/utils/dynamic_grid_snapshot.js.map +1 -1
- package/dist/market_adapter/utils/file_lock.d.ts +4 -1
- package/dist/market_adapter/utils/file_lock.d.ts.map +1 -1
- package/dist/market_adapter/utils/file_lock.js +89 -25
- package/dist/market_adapter/utils/file_lock.js.map +1 -1
- package/dist/market_adapter/utils/native_history.d.ts.map +1 -1
- package/dist/market_adapter/utils/native_history.js +5 -1
- package/dist/market_adapter/utils/native_history.js.map +1 -1
- package/dist/modules/account_bots.d.ts +3 -0
- package/dist/modules/account_bots.d.ts.map +1 -1
- package/dist/modules/account_bots.js +157 -47
- package/dist/modules/account_bots.js.map +1 -1
- package/dist/modules/account_orders.d.ts +1 -7
- package/dist/modules/account_orders.d.ts.map +1 -1
- package/dist/modules/account_orders.js +9 -17
- package/dist/modules/account_orders.js.map +1 -1
- package/dist/modules/authority_resolver.js +1 -1
- package/dist/modules/authority_resolver.js.map +1 -1
- package/dist/modules/bitshares-native/chain_client.js +1 -1
- package/dist/modules/bitshares-native/chain_client.js.map +1 -1
- package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts +0 -12
- package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts.map +1 -1
- package/dist/modules/bitshares-native/crypto/ecc.browser.js +1 -1
- package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -1
- package/dist/modules/bitshares-native/crypto/ecc_selector.js +1 -1
- package/dist/modules/bitshares-native/crypto/ecc_selector.js.map +1 -1
- package/dist/modules/bitshares-native/index.d.ts.map +1 -1
- package/dist/modules/bitshares-native/index.js +1 -1
- package/dist/modules/bitshares-native/index.js.map +1 -1
- package/dist/modules/bitshares-native/lru_cache.js +1 -1
- package/dist/modules/bitshares-native/lru_cache.js.map +1 -1
- package/dist/modules/bitshares-native/resolvers.d.ts +0 -2
- package/dist/modules/bitshares-native/resolvers.d.ts.map +1 -1
- package/dist/modules/bitshares-native/resolvers.js +18 -4
- package/dist/modules/bitshares-native/resolvers.js.map +1 -1
- package/dist/modules/bitshares-native/serial/chain_constants.js +1 -1
- package/dist/modules/bitshares-native/serial/chain_constants.js.map +1 -1
- package/dist/modules/bitshares-native/serial/index.d.ts.map +1 -1
- package/dist/modules/bitshares-native/serial/index.js +1 -1
- package/dist/modules/bitshares-native/serial/index.js.map +1 -1
- package/dist/modules/bitshares-native/serial/operations.js +1 -1
- package/dist/modules/bitshares-native/serial/operations.js.map +1 -1
- package/dist/modules/bitshares-native/serial/serializer.js +1 -1
- package/dist/modules/bitshares-native/serial/serializer.js.map +1 -1
- package/dist/modules/bitshares-native/serial/types.js +1 -1
- package/dist/modules/bitshares-native/serial/types.js.map +1 -1
- package/dist/modules/bitshares-native/signing_client.js +2 -2
- package/dist/modules/bitshares-native/signing_client.js.map +1 -1
- package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -1
- package/dist/modules/bitshares-native/subscriptions.js +5 -14
- package/dist/modules/bitshares-native/subscriptions.js.map +1 -1
- package/dist/modules/bitshares-native/transport.js +1 -1
- package/dist/modules/bitshares-native/transport.js.map +1 -1
- package/dist/modules/bitshares-native/tx/builder.js +1 -1
- package/dist/modules/bitshares-native/tx/builder.js.map +1 -1
- package/dist/modules/bitshares-native/tx/tx_cache.d.ts +3 -2
- package/dist/modules/bitshares-native/tx/tx_cache.d.ts.map +1 -1
- package/dist/modules/bitshares-native/tx/tx_cache.js +7 -4
- package/dist/modules/bitshares-native/tx/tx_cache.js.map +1 -1
- package/dist/modules/bitshares_client.d.ts +2 -14
- package/dist/modules/bitshares_client.d.ts.map +1 -1
- package/dist/modules/bitshares_client.js +32 -41
- package/dist/modules/bitshares_client.js.map +1 -1
- package/dist/modules/bot_settings.d.ts.map +1 -1
- package/dist/modules/bot_settings.js +12 -19
- package/dist/modules/bot_settings.js.map +1 -1
- package/dist/modules/bots_file_lock.d.ts +1 -1
- package/dist/modules/bots_file_lock.js +1 -1
- package/dist/modules/broadcast_failure.d.ts +13 -0
- package/dist/modules/broadcast_failure.d.ts.map +1 -1
- package/dist/modules/broadcast_failure.js +0 -13
- package/dist/modules/broadcast_failure.js.map +1 -1
- package/dist/modules/chain_keys.js +2 -2
- package/dist/modules/chain_keys.js.map +1 -1
- package/dist/modules/chain_orders.d.ts +2 -3
- package/dist/modules/chain_orders.d.ts.map +1 -1
- package/dist/modules/chain_orders.js +23 -42
- package/dist/modules/chain_orders.js.map +1 -1
- package/dist/modules/config.d.ts.map +1 -1
- package/dist/modules/config.js +5 -2
- package/dist/modules/config.js.map +1 -1
- package/dist/modules/constants.d.ts +21 -21
- package/dist/modules/constants.d.ts.map +1 -1
- package/dist/modules/constants.js +53 -60
- package/dist/modules/constants.js.map +1 -1
- package/dist/modules/cr_planner.d.ts +1 -7
- package/dist/modules/cr_planner.d.ts.map +1 -1
- package/dist/modules/cr_planner.js +3 -77
- package/dist/modules/cr_planner.js.map +1 -1
- package/dist/modules/credential_policy.d.ts +0 -4
- package/dist/modules/credential_policy.d.ts.map +1 -1
- package/dist/modules/credential_policy.js +18 -3
- package/dist/modules/credential_policy.js.map +1 -1
- package/dist/modules/credit_runtime.d.ts +0 -7
- package/dist/modules/credit_runtime.d.ts.map +1 -1
- package/dist/modules/credit_runtime.js +21 -60
- package/dist/modules/credit_runtime.js.map +1 -1
- package/dist/modules/crypto/index.d.ts +0 -2
- package/dist/modules/crypto/index.d.ts.map +1 -1
- package/dist/modules/crypto/index.js +0 -2
- package/dist/modules/crypto/index.js.map +1 -1
- package/dist/modules/crypto/sync.js.map +1 -1
- package/dist/modules/daemon_node_health.js +1 -1
- package/dist/modules/daemon_node_health.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +8 -134
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_class.js +39 -199
- package/dist/modules/dexbot_class.js.map +1 -1
- package/dist/modules/dexbot_credential_client.js +1 -1
- package/dist/modules/dexbot_credential_client.js.map +1 -1
- package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_fill_runtime.js +3 -6
- package/dist/modules/dexbot_fill_runtime.js.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.d.ts +6 -34
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.js +27 -19
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
- package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_startup_runtime.js +31 -15
- package/dist/modules/dexbot_startup_runtime.js.map +1 -1
- package/dist/modules/dexbot_state_recovery.d.ts +2 -2
- package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
- package/dist/modules/dexbot_state_recovery.js +11 -7
- package/dist/modules/dexbot_state_recovery.js.map +1 -1
- package/dist/modules/fund_registry.d.ts.map +1 -1
- package/dist/modules/fund_registry.js +24 -6
- package/dist/modules/fund_registry.js.map +1 -1
- package/dist/modules/general_settings.d.ts +1 -2
- package/dist/modules/general_settings.d.ts.map +1 -1
- package/dist/modules/general_settings.js +1 -2
- package/dist/modules/general_settings.js.map +1 -1
- package/dist/modules/graceful_shutdown.d.ts.map +1 -1
- package/dist/modules/graceful_shutdown.js +10 -1
- package/dist/modules/graceful_shutdown.js.map +1 -1
- package/dist/modules/grid_price_source.d.ts +19 -0
- package/dist/modules/grid_price_source.d.ts.map +1 -0
- package/dist/modules/grid_price_source.js +23 -0
- package/dist/modules/grid_price_source.js.map +1 -0
- package/dist/modules/key_store.d.ts +0 -5
- package/dist/modules/key_store.d.ts.map +1 -1
- package/dist/modules/key_store.js +1 -14
- package/dist/modules/key_store.js.map +1 -1
- package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -1
- package/dist/modules/launcher/bot_supervisor.js +15 -26
- package/dist/modules/launcher/bot_supervisor.js.map +1 -1
- package/dist/modules/launcher/child_env.d.ts +1 -2
- package/dist/modules/launcher/child_env.d.ts.map +1 -1
- package/dist/modules/launcher/child_env.js +1 -1
- package/dist/modules/launcher/child_env.js.map +1 -1
- package/dist/modules/launcher/foreign_cred_daemon.d.ts.map +1 -1
- package/dist/modules/launcher/foreign_cred_daemon.js +7 -13
- package/dist/modules/launcher/foreign_cred_daemon.js.map +1 -1
- package/dist/modules/launcher/market_adapter_runtime.d.ts +3 -4
- package/dist/modules/launcher/market_adapter_runtime.d.ts.map +1 -1
- package/dist/modules/launcher/market_adapter_runtime.js +10 -29
- package/dist/modules/launcher/market_adapter_runtime.js.map +1 -1
- package/dist/modules/launcher/market_adapter_watchdog.d.ts.map +1 -1
- package/dist/modules/launcher/market_adapter_watchdog.js +3 -2
- package/dist/modules/launcher/market_adapter_watchdog.js.map +1 -1
- package/dist/modules/launcher/monolithic_runtime.d.ts +0 -1
- package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -1
- package/dist/modules/launcher/monolithic_runtime.js +4 -18
- package/dist/modules/launcher/monolithic_runtime.js.map +1 -1
- package/dist/modules/launcher/runtime_entry.d.ts.map +1 -1
- package/dist/modules/launcher/runtime_entry.js +4 -5
- package/dist/modules/launcher/runtime_entry.js.map +1 -1
- package/dist/modules/launcher/status_reporting.d.ts +1 -2
- package/dist/modules/launcher/status_reporting.d.ts.map +1 -1
- package/dist/modules/launcher/status_reporting.js +2 -5
- package/dist/modules/launcher/status_reporting.js.map +1 -1
- package/dist/modules/launcher/supervisor_control.js +1 -1
- package/dist/modules/launcher/supervisor_control.js.map +1 -1
- package/dist/modules/market_adapter_whitelist.d.ts +2 -2
- package/dist/modules/market_adapter_whitelist.d.ts.map +1 -1
- package/dist/modules/market_adapter_whitelist.js +12 -6
- package/dist/modules/market_adapter_whitelist.js.map +1 -1
- package/dist/modules/node_failure_ledger.d.ts +23 -0
- package/dist/modules/node_failure_ledger.d.ts.map +1 -1
- package/dist/modules/node_failure_ledger.js +0 -23
- package/dist/modules/node_failure_ledger.js.map +1 -1
- package/dist/modules/node_manager.d.ts.map +1 -1
- package/dist/modules/node_manager.js +3 -3
- package/dist/modules/node_manager.js.map +1 -1
- package/dist/modules/order/accounting.js +3 -3
- package/dist/modules/order/accounting.js.map +1 -1
- package/dist/modules/order/async_lock.d.ts +6 -0
- package/dist/modules/order/async_lock.d.ts.map +1 -1
- package/dist/modules/order/async_lock.js +11 -0
- package/dist/modules/order/async_lock.js.map +1 -1
- package/dist/modules/order/export.d.ts +1 -1
- package/dist/modules/order/export.js +10 -10
- package/dist/modules/order/export.js.map +1 -1
- package/dist/modules/order/format.d.ts +1 -8
- package/dist/modules/order/format.d.ts.map +1 -1
- package/dist/modules/order/format.js +0 -14
- package/dist/modules/order/format.js.map +1 -1
- package/dist/modules/order/grid.d.ts +2 -12
- package/dist/modules/order/grid.d.ts.map +1 -1
- package/dist/modules/order/grid.js +23 -24
- package/dist/modules/order/grid.js.map +1 -1
- package/dist/modules/order/grid_reconcile.d.ts +1 -1
- package/dist/modules/order/grid_reconcile.js +1 -1
- package/dist/modules/order/grid_reconcile_internal.js +1 -1
- package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
- package/dist/modules/order/logger.d.ts +3 -0
- package/dist/modules/order/logger.d.ts.map +1 -1
- package/dist/modules/order/logger.js +23 -14
- package/dist/modules/order/logger.js.map +1 -1
- package/dist/modules/order/logger_state.d.ts +5 -22
- package/dist/modules/order/logger_state.d.ts.map +1 -1
- package/dist/modules/order/logger_state.js +6 -25
- package/dist/modules/order/logger_state.js.map +1 -1
- package/dist/modules/order/manager.d.ts +1 -4
- package/dist/modules/order/manager.d.ts.map +1 -1
- package/dist/modules/order/manager.js +34 -33
- package/dist/modules/order/manager.js.map +1 -1
- package/dist/modules/order/processed_fill_store.d.ts +0 -5
- package/dist/modules/order/processed_fill_store.d.ts.map +1 -1
- package/dist/modules/order/processed_fill_store.js +10 -15
- package/dist/modules/order/processed_fill_store.js.map +1 -1
- package/dist/modules/order/strategy.d.ts +6 -4
- package/dist/modules/order/strategy.d.ts.map +1 -1
- package/dist/modules/order/strategy.js +6 -4
- package/dist/modules/order/strategy.js.map +1 -1
- package/dist/modules/order/sync_engine.d.ts.map +1 -1
- package/dist/modules/order/sync_engine.js +17 -10
- package/dist/modules/order/sync_engine.js.map +1 -1
- package/dist/modules/order/utils/math.d.ts +7 -1
- package/dist/modules/order/utils/math.d.ts.map +1 -1
- package/dist/modules/order/utils/math.js +19 -1
- package/dist/modules/order/utils/math.js.map +1 -1
- package/dist/modules/order/utils/order.d.ts.map +1 -1
- package/dist/modules/order/utils/order.js +11 -4
- package/dist/modules/order/utils/order.js.map +1 -1
- package/dist/modules/order/utils/system.d.ts +3 -8
- package/dist/modules/order/utils/system.d.ts.map +1 -1
- package/dist/modules/order/utils/system.js +14 -4
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/order/utils/validate.js +1 -1
- package/dist/modules/order/utils/validate.js.map +1 -1
- package/dist/modules/path_api.js +1 -1
- package/dist/modules/path_api.js.map +1 -1
- package/dist/modules/paths.d.ts +1 -7
- package/dist/modules/paths.d.ts.map +1 -1
- package/dist/modules/paths.js +1 -1
- package/dist/modules/paths.js.map +1 -1
- package/dist/modules/process_discovery.d.ts +3 -0
- package/dist/modules/process_discovery.d.ts.map +1 -1
- package/dist/modules/process_discovery.js +15 -1
- package/dist/modules/process_discovery.js.map +1 -1
- package/dist/modules/runtime_settings.js +4 -2
- package/dist/modules/runtime_settings.js.map +1 -1
- package/dist/modules/settings_merge.d.ts +5 -1
- package/dist/modules/settings_merge.d.ts.map +1 -1
- package/dist/modules/settings_merge.js +17 -4
- package/dist/modules/settings_merge.js.map +1 -1
- package/dist/modules/socket_json_client.d.ts.map +1 -1
- package/dist/modules/socket_json_client.js +12 -2
- package/dist/modules/socket_json_client.js.map +1 -1
- package/dist/modules/storage/browser_adapter.d.ts +8 -3
- package/dist/modules/storage/browser_adapter.d.ts.map +1 -1
- package/dist/modules/storage/browser_adapter.js +58 -7
- package/dist/modules/storage/browser_adapter.js.map +1 -1
- package/dist/modules/storage/index.d.ts +1 -1
- package/dist/modules/storage/index.js +1 -1
- package/dist/modules/types.d.ts +1 -1
- package/dist/modules/types.d.ts.map +1 -1
- package/dist/modules/utils/sanitize_key.d.ts +7 -0
- package/dist/modules/utils/sanitize_key.d.ts.map +1 -0
- package/dist/modules/utils/sanitize_key.js +15 -0
- package/dist/modules/utils/sanitize_key.js.map +1 -0
- package/dist/modules/validate_profiles.d.ts.map +1 -1
- package/dist/modules/validate_profiles.js +6 -8
- package/dist/modules/validate_profiles.js.map +1 -1
- package/dist/pm2.d.ts.map +1 -1
- package/dist/pm2.js +8 -9
- package/dist/pm2.js.map +1 -1
- package/dist/scripts/analyze-git.d.ts +1 -1
- package/dist/scripts/analyze-git.js +1 -1
- package/dist/scripts/analyze-orders.d.ts +2 -2
- package/dist/scripts/analyze-orders.d.ts.map +1 -1
- package/dist/scripts/analyze-orders.js +39 -28
- package/dist/scripts/analyze-orders.js.map +1 -1
- package/dist/scripts/diagnose-pool-history.js +1 -1
- package/dist/scripts/divergence-calc.d.ts +1 -1
- package/dist/scripts/divergence-calc.js +3 -3
- package/dist/scripts/native_release_gates.js +4 -2
- package/dist/scripts/native_release_gates.js.map +1 -1
- package/dist/scripts/print_grid.d.ts +1 -1
- package/dist/scripts/print_grid.js +1 -1
- package/dist/scripts/run-tests.js +38 -19
- package/dist/scripts/run-tests.js.map +1 -1
- package/dist/scripts/runner.d.ts +3 -5
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +4 -6
- package/dist/scripts/runner.js.map +1 -1
- package/dist/scripts/sync-version.d.ts +2 -2
- package/dist/scripts/sync-version.js +2 -2
- package/dist/scripts/update.d.ts +1 -1
- package/dist/scripts/update.js +2 -2
- package/dist/scripts/update.js.map +1 -1
- package/dist/scripts/validate_bots.d.ts +1 -1
- package/dist/scripts/validate_bots.js +1 -1
- package/dist/scripts/verify-browser-bundle.d.ts +1 -1
- package/dist/scripts/verify-browser-bundle.js +1 -1
- package/dist/unlock.js +4 -4
- package/dist/unlock.js.map +1 -1
- package/docs/BITSHARES_ONBOARDING.md +63 -18
- package/docs/COPY_ON_WRITE_MASTER_PLAN.md +14 -23
- package/docs/COW_INVARIANTS.md +4 -4
- package/docs/CREDENTIAL_SECURITY.md +0 -11
- package/docs/DEXBOT_COMPARISON.md +12 -12
- package/docs/EVOLUTION.md +17 -43
- package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +27 -83
- package/docs/GRID_RECALCULATION.md +1 -13
- package/docs/GRID_RECONCILE.md +24 -24
- package/docs/LIFECYCLE.md +4 -4
- package/docs/LOGGING.md +1 -1
- package/docs/MPA_CREDIT_USAGE.md +3 -3
- package/docs/README.md +2 -2
- package/docs/WORKFLOW.md +2 -2
- package/docs/architecture.md +48 -43
- package/docs/developer_guide.md +22 -24
- package/market_adapter/README.md +0 -2
- package/modules/README.md +2 -1
- package/package.json +22 -14
- package/scripts/README.md +34 -8
- package/scripts/clean-dist.js +10 -2
- package/tests/README.md +4 -3
- package/claw/openclaw.plugin.json +0 -13
- package/dist/market_adapter/merge_lp_data.d.ts +0 -3
- package/dist/market_adapter/merge_lp_data.d.ts.map +0 -1
- package/dist/market_adapter/merge_lp_data.js +0 -125
- package/dist/market_adapter/merge_lp_data.js.map +0 -1
- package/dist/market_adapter/utils/paths.d.ts +0 -3
- package/dist/market_adapter/utils/paths.d.ts.map +0 -1
- package/dist/market_adapter/utils/paths.js +0 -5
- 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
|
-
|
|
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
|
-
|
|
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":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;;;;GAeG;AAEH,SAAS,yBAAyB,CAAC,OAAY,EAAE,IAAS,EAAE,YAAiB;IACzE,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC;QACtE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACzB,CAAC,CAAC,CAAC,CAAC;IACR,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,gBAAgB,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,aAAoB,EAAE,aAAoB,EAAE,WAAgB;IACjF,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,mBAAmB,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,mBAAmB,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,mBAAmB,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC1C,mBAAmB,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACvB,WAAW,GAAG,CAAC,CAAC;YAChB,YAAY,GAAG,CAAC,CAAC;YACjB,UAAU,GAAG,GAAG,CAAC;YACjB,eAAe,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACvB,WAAW,GAAG,IAAI,CAAC;gBACnB,YAAY,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACJ,YAAY,EAAE,CAAC;YACnB,CAAC;YACD,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;gBAClC,WAAW,GAAG,IAAI,CAAC;gBACnB,WAAW,GAAG,CAAC,CAAC;gBAChB,YAAY,GAAG,CAAC,CAAC;gBACjB,UAAU,GAAG,GAAG,CAAC;gBACjB,eAAe,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;QACD,mBAAmB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpC,mBAAmB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAU,EAAE,MAAW;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAW;IAC3C,MAAM,EACF,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,KAAK,EACL,EAAE,EACF,IAAI,EACJ,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GAAG,IAAI,GAC1B,GAAG,MAAM,CAAC;IAEX,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,WAAW;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,yBAAyB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAC/D,IAAI,EAAE,IAAI,IAAI;YAAE,SAAS;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,
|
|
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
|
|
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":"
|
|
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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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":"
|
|
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;;;;;;
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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:
|
|
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
|
|
933
|
-
const
|
|
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
|
-
|
|
940
|
-
|
|
964
|
+
baseCommon,
|
|
965
|
+
quoteCommon,
|
|
941
966
|
nativeCross,
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
nativeCrossCandles: [],
|
|
967
|
+
baseCandles: [],
|
|
968
|
+
quoteCandles: [],
|
|
945
969
|
requiredCandles,
|
|
946
970
|
probeLookbackHours,
|
|
947
971
|
probeCandles: lookbackHoursToCandles(probeLookbackHours, intervalSeconds),
|
|
948
972
|
};
|
|
949
|
-
if (
|
|
950
|
-
result.
|
|
951
|
-
result.
|
|
952
|
-
result.hasUsableTimeframe = result.
|
|
953
|
-
result.lookbackSatisfied = result.
|
|
954
|
-
&& result.
|
|
955
|
-
result.
|
|
956
|
-
result.
|
|
957
|
-
result.availableCandles = Math.min(result.
|
|
958
|
-
result.availableLookbackHours = Math.min(result.
|
|
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.
|
|
1002
|
+
.filter((probe) => probe && !probe.error && probe.baseCommon && probe.quoteCommon && probe.hasUsableTimeframe)
|
|
991
1003
|
.map((probe) => ({
|
|
992
1004
|
...probe,
|
|
993
|
-
score: Math.min(probe.
|
|
994
|
-
depthScore: Math.min(probe.
|
|
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
|
|
1019
|
-
const
|
|
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.
|
|
1024
|
-
const usable = (!probe.error && probe.
|
|
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
|
-
|
|
1033
|
-
|
|
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
|
-
|
|
1048
|
-
|
|
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
|
|
1085
|
-
const
|
|
1086
|
-
const
|
|
1087
|
-
const
|
|
1088
|
-
if (
|
|
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(
|
|
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: ${
|
|
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
|
}
|