dexbot 1.4.17 → 1.4.19
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 +17 -0
- package/README.md +1 -0
- package/analysis/README.md +43 -43
- package/analysis/ama_fitting/README.md +8 -8
- package/analysis/ama_fitting/package.json +1 -1
- package/analysis/bot_fitting/README.md +4 -4
- package/analysis/bot_fitting/backtest_ama_sweep.ts +1 -1
- package/analysis/bot_usage/discover_bot_accounts.ts +11 -11
- package/analysis/tradingview/README.md +4 -4
- package/analysis/trend_detection/DYNAMIC_WEIGHT_RESEARCH.md +2 -2
- package/analysis/trend_detection/SIGNAL_DOCUMENTATION.md +1 -1
- package/analysis/trend_detection/package.json +1 -1
- package/claw/README.md +45 -45
- package/claw/docs/AI_BOT_LIBRARY_API.md +6 -6
- package/claw/examples/short_mpa_bts_strategy.ts +3 -3
- package/claw/package.json +21 -21
- 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 +2 -2
- package/claw/scripts/claw_skill_md.ts +1 -1
- package/claw/skills/launcher-ops/references/launcher-workflow.md +5 -5
- package/claw/skills/margin-trading/references/honest-asset-list.md +1 -1
- package/claw/skills/memu-memory/SKILL.md +3 -3
- package/claw/tests/test_claw_mcp_transport.ts +2 -2
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts +3 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js +148 -0
- package/dist/analysis/ama_fitting/analyze_ama_price_changes.js.map +1 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts +12 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js +389 -0
- package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js.map +1 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts +3 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js +200 -0
- package/dist/analysis/ama_fitting/calibrate_convergence_er.js.map +1 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts +3 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.js +213 -0
- package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts +25 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js +247 -0
- package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js.map +1 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts +35 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts.map +1 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js +782 -0
- package/dist/analysis/ama_fitting/optimizer_high_resolution.js.map +1 -0
- package/dist/analysis/analyze_derivatives.d.ts +86 -0
- package/dist/analysis/analyze_derivatives.d.ts.map +1 -0
- package/dist/analysis/analyze_derivatives.js +285 -0
- package/dist/analysis/analyze_derivatives.js.map +1 -0
- package/dist/analysis/analyze_dynamic_weight.d.ts +14 -0
- package/dist/analysis/analyze_dynamic_weight.d.ts.map +1 -0
- package/dist/analysis/analyze_dynamic_weight.js +197 -0
- package/dist/analysis/analyze_dynamic_weight.js.map +1 -0
- package/dist/analysis/analyze_kalman.d.ts +13 -0
- package/dist/analysis/analyze_kalman.d.ts.map +1 -0
- package/dist/analysis/analyze_kalman.js +118 -0
- package/dist/analysis/analyze_kalman.js.map +1 -0
- package/dist/analysis/analyze_regime.d.ts +20 -0
- package/dist/analysis/analyze_regime.d.ts.map +1 -0
- package/dist/analysis/analyze_regime.js +139 -0
- package/dist/analysis/analyze_regime.js.map +1 -0
- package/dist/analysis/analyze_regime_windows.d.ts +19 -0
- package/dist/analysis/analyze_regime_windows.d.ts.map +1 -0
- package/dist/analysis/analyze_regime_windows.js +414 -0
- package/dist/analysis/analyze_regime_windows.js.map +1 -0
- package/dist/analysis/analyze_risk_profile.d.ts +3 -0
- package/dist/analysis/analyze_risk_profile.d.ts.map +1 -0
- package/dist/analysis/analyze_risk_profile.js +186 -0
- package/dist/analysis/analyze_risk_profile.js.map +1 -0
- package/dist/analysis/analyze_trade_heatmap.d.ts +3 -0
- package/dist/analysis/analyze_trade_heatmap.d.ts.map +1 -0
- package/dist/analysis/analyze_trade_heatmap.js +358 -0
- package/dist/analysis/analyze_trade_heatmap.js.map +1 -0
- package/dist/analysis/analyze_volatility.d.ts +22 -0
- package/dist/analysis/analyze_volatility.d.ts.map +1 -0
- package/dist/analysis/analyze_volatility.js +165 -0
- package/dist/analysis/analyze_volatility.js.map +1 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts +91 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js +792 -0
- package/dist/analysis/bot_fitting/backtest_ama_sweep.js.map +1 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts +2 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js +380 -0
- package/dist/analysis/bot_fitting/backtest_bot_fitting.js.map +1 -0
- package/dist/analysis/bot_fitting/shared_utils.d.ts +26 -0
- package/dist/analysis/bot_fitting/shared_utils.d.ts.map +1 -0
- package/dist/analysis/bot_fitting/shared_utils.js +42 -0
- package/dist/analysis/bot_fitting/shared_utils.js.map +1 -0
- package/dist/analysis/bot_key_utils.d.ts +11 -0
- package/dist/analysis/bot_key_utils.d.ts.map +1 -0
- package/dist/analysis/bot_key_utils.js +153 -0
- package/dist/analysis/bot_key_utils.js.map +1 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.d.ts +3 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.d.ts.map +1 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.js +499 -0
- package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +531 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.js +399 -0
- package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -0
- package/dist/analysis/chart_css.d.ts +17 -0
- package/dist/analysis/chart_css.d.ts.map +1 -0
- package/dist/analysis/chart_css.js +49 -0
- package/dist/analysis/chart_css.js.map +1 -0
- package/dist/analysis/chart_ui.d.ts +45 -0
- package/dist/analysis/chart_ui.d.ts.map +1 -0
- package/dist/analysis/chart_ui.js +97 -0
- package/dist/analysis/chart_ui.js.map +1 -0
- package/dist/analysis/chart_utils.d.ts +27 -0
- package/dist/analysis/chart_utils.d.ts.map +1 -0
- package/dist/analysis/chart_utils.js +153 -0
- package/dist/analysis/chart_utils.js.map +1 -0
- package/dist/analysis/derivative_chart_generator.d.ts +12 -0
- package/dist/analysis/derivative_chart_generator.d.ts.map +1 -0
- package/dist/analysis/derivative_chart_generator.js +891 -0
- package/dist/analysis/derivative_chart_generator.js.map +1 -0
- package/dist/analysis/math_utils.d.ts +22 -0
- package/dist/analysis/math_utils.d.ts.map +1 -0
- package/dist/analysis/math_utils.js +43 -0
- package/dist/analysis/math_utils.js.map +1 -0
- package/dist/analysis/price_sources.d.ts +40 -0
- package/dist/analysis/price_sources.d.ts.map +1 -0
- package/dist/analysis/price_sources.js +94 -0
- package/dist/analysis/price_sources.js.map +1 -0
- package/dist/analysis/resolve_source.d.ts +25 -0
- package/dist/analysis/resolve_source.d.ts.map +1 -0
- package/dist/analysis/resolve_source.js +69 -0
- package/dist/analysis/resolve_source.js.map +1 -0
- package/dist/analysis/trade_profitability.d.ts +115 -0
- package/dist/analysis/trade_profitability.d.ts.map +1 -0
- package/dist/analysis/trade_profitability.js +1240 -0
- package/dist/analysis/trade_profitability.js.map +1 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts +31 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -0
- package/dist/analysis/tradingview/analyze_tradingview.js +146 -0
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +5 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1714 -0
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts +247 -0
- package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/derivative_analyzer.js +901 -0
- package/dist/analysis/trend_detection/derivative_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts +3 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +1361 -0
- package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts +6 -0
- package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/hurst_analyzer.js +7 -0
- package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.d.ts +3 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.js +360 -0
- package/dist/analysis/trend_detection/kalman_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts +8 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.js +8 -0
- package/dist/analysis/trend_detection/kalman_trend_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts +6 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts.map +1 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.js +7 -0
- package/dist/analysis/trend_detection/kalman_velocity_smoothing.js.map +1 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts +6 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts.map +1 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.js +7 -0
- package/dist/analysis/trend_detection/permutation_entropy_analyzer.js.map +1 -0
- package/dist/analysis/trend_detection/regime_chart_generator.d.ts +3 -0
- package/dist/analysis/trend_detection/regime_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/regime_chart_generator.js +310 -0
- package/dist/analysis/trend_detection/regime_chart_generator.js.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts +2 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js +128 -0
- package/dist/analysis/trend_detection/tests/test_kalman_trend.js.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts +2 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts.map +1 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js +37 -0
- package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js.map +1 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.d.ts +3 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.d.ts.map +1 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.js +646 -0
- package/dist/analysis/trend_detection/volatility_chart_generator.js.map +1 -0
- package/dist/bot.js +1 -1
- package/dist/bot.js.map +1 -1
- package/dist/market_adapter/ama_signal_runner.js +1 -1
- package/dist/market_adapter/ama_signal_runner.js.map +1 -1
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1 -1
- package/dist/modules/account_bots.d.ts +1 -0
- package/dist/modules/account_bots.d.ts.map +1 -1
- package/dist/modules/account_bots.js +27 -5
- package/dist/modules/account_bots.js.map +1 -1
- package/dist/modules/constants.d.ts +1 -0
- package/dist/modules/constants.d.ts.map +1 -1
- package/dist/modules/constants.js +12 -3
- package/dist/modules/constants.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +22 -0
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_class.js +27 -1
- package/dist/modules/dexbot_class.js.map +1 -1
- package/dist/modules/dexbot_cow_runtime.d.ts +48 -1
- package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_cow_runtime.js +168 -4
- package/dist/modules/dexbot_cow_runtime.js.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.js +6 -27
- package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
- package/dist/modules/order/strategy.d.ts.map +1 -1
- package/dist/modules/order/strategy.js +6 -15
- package/dist/modules/order/strategy.js.map +1 -1
- package/dist/modules/order/utils/math.d.ts +29 -1
- package/dist/modules/order/utils/math.d.ts.map +1 -1
- package/dist/modules/order/utils/math.js +46 -1
- package/dist/modules/order/utils/math.js.map +1 -1
- package/dist/modules/order/utils/system.d.ts +2 -0
- package/dist/modules/order/utils/system.d.ts.map +1 -1
- package/dist/modules/order/utils/system.js +30 -2
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/runtime_settings.d.ts +1 -0
- package/dist/modules/runtime_settings.d.ts.map +1 -1
- package/dist/modules/runtime_settings.js +13 -2
- package/dist/modules/runtime_settings.js.map +1 -1
- package/dist/scripts/generate_lp_chart.js +1 -1
- package/dist/scripts/test-credit-renewal.js +1 -1
- package/docs/DEXBOT_COMPARISON.md +3 -3
- package/docs/EVOLUTION.md +26 -95
- package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +1 -1
- package/docs/GRID_RECALCULATION.md +2 -2
- package/docs/LIFECYCLE.md +207 -0
- package/docs/README.md +9 -1
- package/docs/developer_guide.md +4 -3
- package/market_adapter/README.md +23 -23
- package/package.json +18 -21
- package/scripts/README.md +12 -12
- package/scripts/bots +5 -7
- package/scripts/clear-market-adapter.sh +1 -1
- package/scripts/dexbot +5 -7
- package/scripts/keys +5 -7
- package/scripts/pm2 +5 -7
- package/scripts/unlock +5 -7
- package/scripts/update.js +6 -7
- package/scripts/repo-stats.html +0 -480
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze_ama_price_changes.js","sourceRoot":"","sources":["../../../analysis/ama_fitting/analyze_ama_price_changes.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,YAAY,CAAC;AACb;;;;;;;;;;;GAWG;AACH,MAAM,mBAAmB,GAAG,cAAc,CAAC,2BAA2B,CAAC;AAEvE;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,SAAc,EAAE,YAAiB,EAAE,MAAW;IACpE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,QAAQ,KAAK,CAAC;YAAE,SAAS;QAC7B,WAAW,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC;QAC9D,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;YAC3B,MAAM,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,GAAG,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC5C,CAAC;AAED,iFAAiF;AACjF,SAAS,QAAQ,CAAC,QAAa;IAC3B,MAAM,IAAI,GAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IACrC,OAAO;QACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;KAC1B,CAAC;AACN,CAAC;AACD,SAAS,aAAa,CAAC,WAAgB;IACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC5D,OAAO;QACH,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACrG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACrG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QACrG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;KACxG,CAAC;AACN,CAAC;AACD,iFAAiF;AAEjF,iFAAiF;AACjF,SAAS,GAAG;IACR,MAAM,UAAU,GAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,QAAQ,GAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAW,aAAa,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,MAAM,GAAc,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAU,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,+BAA+B;IAC5E,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI;QACpB,CAAC,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE;QACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,EAAE,eAAe;QAClC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG;QACnC,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,QAAQ,WAAW,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,MAAM,QAAQ,UAAU,cAAc,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,iBAAiB,mBAAmB,sDAAsD,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE;YAChC,QAAQ,EAAI,MAAM,CAAC,EAAE;YACrB,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,UAAU,EAAE,MAAM,CAAC,IAAI;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5E,MAAM,GAAG,GAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7F,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,cAAc,MAAM,CAAC,EAAE,WAAW,SAAS,YAAY,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,QAAQ,mBAAmB,mBAAmB,CAAC,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,WAAW,CAAC,CAAC;QACzL,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;SACxD,CAAC,CAAC;IACP,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,8EAA8E;IAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC;IAChI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CACP,MAAM;YACN,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC;IACN,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC;AACD,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
declare function parseArgs(argv?: string[]): {
|
|
3
|
+
dataFile: string | null;
|
|
4
|
+
fixEr: number;
|
|
5
|
+
fixFast: number;
|
|
6
|
+
maxSlow: number;
|
|
7
|
+
lambdaEnd: number;
|
|
8
|
+
lambdaSteps: number;
|
|
9
|
+
outFile: string | null;
|
|
10
|
+
};
|
|
11
|
+
export { parseArgs };
|
|
12
|
+
//# sourceMappingURL=analyze_lambda_vs_slow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze_lambda_vs_slow.d.ts","sourceRoot":"","sources":["../../../analysis/ama_fitting/analyze_lambda_vs_slow.ts"],"names":[],"mappings":";AAyCA,iBAAS,SAAS,CAAC,IAAI,WAAwB;cAE7B,MAAM,GAAG,IAAI;WAChB,MAAM;aACJ,MAAM;aACN,MAAM;eACJ,MAAM;iBACJ,MAAM;aACV,MAAM,GAAG,IAAI;EAyB7B;AA2UD,OAAO,EAAE,SAAS,EAAE,CAAA"}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { pathToFileURL } from 'node:url';
|
|
5
|
+
import { calculateAMA } from '../../market_adapter/core/strategies/ama.js';
|
|
6
|
+
import { loadLpDataFile } from '../../market_adapter/lp_chart_runner.js';
|
|
7
|
+
import { ensureDir } from '../../modules/order/utils/system.js';
|
|
8
|
+
import { PATHS } from '../../modules/paths.js';
|
|
9
|
+
import { MARKET_ADAPTER } from '../../modules/constants.js';
|
|
10
|
+
import { getErrorMessage } from '../../modules/utils/errors.js';
|
|
11
|
+
'use strict';
|
|
12
|
+
/**
|
|
13
|
+
* LAMBDA vs SLOW ANALYSIS
|
|
14
|
+
*
|
|
15
|
+
* Fixes ER and Fast, then scans lambda values over a linear range.
|
|
16
|
+
* For each lambda, finds the optimal Slow period that minimizes
|
|
17
|
+
* score = amaMovementTotal + lambda * distanceTotal.
|
|
18
|
+
*
|
|
19
|
+
* The start lambda is derived from --maxSlow: finds the lambda at
|
|
20
|
+
* which the optimal slow first drops below maxSlow. Only --lambdaEnd
|
|
21
|
+
* needs to be set as the upper bound.
|
|
22
|
+
*
|
|
23
|
+
* Output: console table + interactive HTML chart (uPlot).
|
|
24
|
+
*
|
|
25
|
+
* Defaults: ER/Fast from MARKET_ADAPTER.AMAS.AMA1 (constants.ts).
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* tsx analysis/ama_fitting/analyze_lambda_vs_slow.ts \
|
|
29
|
+
* --data market_adapter/data/lp/1_3_5537_1_3_0/lp_pool_133_1h_3y.json \
|
|
30
|
+
* --maxSlow 1000 --lambdaEnd 0.0045 --lambdaSteps 50
|
|
31
|
+
*/
|
|
32
|
+
const DEFAULT_ER = MARKET_ADAPTER.AMAS.AMA1.erPeriod;
|
|
33
|
+
const DEFAULT_FAST = MARKET_ADAPTER.AMAS.AMA1.fastPeriod;
|
|
34
|
+
// ── CLI ────────────────────────────────────────────────────────────────────────
|
|
35
|
+
function parseArgs(argv = process.argv.slice(2)) {
|
|
36
|
+
const out = {
|
|
37
|
+
dataFile: null,
|
|
38
|
+
fixEr: DEFAULT_ER,
|
|
39
|
+
fixFast: DEFAULT_FAST,
|
|
40
|
+
maxSlow: 1000,
|
|
41
|
+
lambdaEnd: 0.0045,
|
|
42
|
+
lambdaSteps: 50,
|
|
43
|
+
outFile: null,
|
|
44
|
+
};
|
|
45
|
+
for (let i = 0; i < argv.length; i++) {
|
|
46
|
+
const a = argv[i], v = argv[i + 1];
|
|
47
|
+
switch (a) {
|
|
48
|
+
case '--data':
|
|
49
|
+
out.dataFile = v;
|
|
50
|
+
i++;
|
|
51
|
+
break;
|
|
52
|
+
case '--fixEr':
|
|
53
|
+
out.fixEr = Number(v);
|
|
54
|
+
i++;
|
|
55
|
+
break;
|
|
56
|
+
case '--fixFast':
|
|
57
|
+
out.fixFast = Number(v);
|
|
58
|
+
i++;
|
|
59
|
+
break;
|
|
60
|
+
case '--maxSlow':
|
|
61
|
+
out.maxSlow = Number(v);
|
|
62
|
+
i++;
|
|
63
|
+
break;
|
|
64
|
+
case '--lambdaEnd':
|
|
65
|
+
out.lambdaEnd = Number(v);
|
|
66
|
+
i++;
|
|
67
|
+
break;
|
|
68
|
+
case '--lambdaSteps':
|
|
69
|
+
out.lambdaSteps = Math.floor(Number(v));
|
|
70
|
+
i++;
|
|
71
|
+
break;
|
|
72
|
+
case '--out':
|
|
73
|
+
case '--output':
|
|
74
|
+
out.outFile = v;
|
|
75
|
+
i++;
|
|
76
|
+
break;
|
|
77
|
+
case '--help':
|
|
78
|
+
case '-h':
|
|
79
|
+
showHelp();
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!out.dataFile)
|
|
84
|
+
throw new Error('--data <file> is required');
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
function showHelp() {
|
|
88
|
+
console.log(`
|
|
89
|
+
Lambda vs Slow Analysis
|
|
90
|
+
Fixes ER + Fast, varies lambda, finds optimal Slow per lambda.
|
|
91
|
+
Start lambda derived from --maxSlow; only --lambdaEnd is the upper bound.
|
|
92
|
+
|
|
93
|
+
Usage:
|
|
94
|
+
tsx analysis/ama_fitting/analyze_lambda_vs_slow.ts --data <lp-file.json> [options]
|
|
95
|
+
|
|
96
|
+
Options:
|
|
97
|
+
--data FILE LP candle JSON file (required)
|
|
98
|
+
--fixEr N Fixed ER period (default: ${DEFAULT_ER})
|
|
99
|
+
--fixFast N Fixed Fast period (default: ${DEFAULT_FAST})
|
|
100
|
+
--maxSlow N Max slow value; start lambda derived from it (default: 1000)
|
|
101
|
+
--lambdaEnd N End lambda / distanceWeight (default: 0.0045)
|
|
102
|
+
--lambdaSteps N Number of lambda steps (default: 50)
|
|
103
|
+
--output FILE Output HTML chart path (optional)
|
|
104
|
+
--help Show this help
|
|
105
|
+
`);
|
|
106
|
+
}
|
|
107
|
+
// ── Metrics ─────────────────────────────────────────────────────────────────────
|
|
108
|
+
function calcTotalAmaMovement(amaValues, erPeriod) {
|
|
109
|
+
const skip = erPeriod + 1;
|
|
110
|
+
let total = 0;
|
|
111
|
+
for (let i = skip + 1; i < amaValues.length; i++) {
|
|
112
|
+
total += Math.abs(amaValues[i] - amaValues[i - 1]) / amaValues[i - 1];
|
|
113
|
+
}
|
|
114
|
+
return total;
|
|
115
|
+
}
|
|
116
|
+
function calcTotalRelativeDistance(amaValues, candles, erPeriod) {
|
|
117
|
+
const skip = erPeriod + 1;
|
|
118
|
+
let total = 0;
|
|
119
|
+
for (let i = skip; i < candles.length; i++) {
|
|
120
|
+
const ama = amaValues[i];
|
|
121
|
+
total += Math.abs(candles[i].close - ama) / ama;
|
|
122
|
+
}
|
|
123
|
+
return total;
|
|
124
|
+
}
|
|
125
|
+
// ── Geometric range ─────────────────────────────────────────────────────────────
|
|
126
|
+
function geometricRange(min, max, count) {
|
|
127
|
+
const ratio = Math.pow(max / min, 1 / (count - 1));
|
|
128
|
+
const out = [];
|
|
129
|
+
for (let i = 0; i < count; i++) {
|
|
130
|
+
let v = min * Math.pow(ratio, i);
|
|
131
|
+
if (i === 0)
|
|
132
|
+
v = min;
|
|
133
|
+
if (i === count - 1)
|
|
134
|
+
v = max;
|
|
135
|
+
out.push(parseFloat(v.toFixed(10)));
|
|
136
|
+
}
|
|
137
|
+
return [...new Set(out)].sort((a, b) => a - b);
|
|
138
|
+
}
|
|
139
|
+
// ── Precompute (movement, distance) per slow ───────────────────────────────────
|
|
140
|
+
function precomputeMetrics(closes, candles, erPeriod, fastPeriod, slowValues) {
|
|
141
|
+
const cache = [];
|
|
142
|
+
for (const slow of slowValues) {
|
|
143
|
+
if (fastPeriod >= slow)
|
|
144
|
+
continue;
|
|
145
|
+
const ama = calculateAMA(closes, { erPeriod, fastPeriod, slowPeriod: slow });
|
|
146
|
+
const movement = calcTotalAmaMovement(ama, erPeriod);
|
|
147
|
+
const distance = calcTotalRelativeDistance(ama, candles, erPeriod);
|
|
148
|
+
cache.push({ slow, movement, distance });
|
|
149
|
+
}
|
|
150
|
+
return cache;
|
|
151
|
+
}
|
|
152
|
+
function findBestForLambda(lambda, metricCache) {
|
|
153
|
+
let best = null;
|
|
154
|
+
for (const m of metricCache) {
|
|
155
|
+
const score = m.movement + lambda * m.distance;
|
|
156
|
+
if (!best || score < best.score) {
|
|
157
|
+
best = { slow: m.slow, movement: m.movement, distance: m.distance, score, lambda };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return best;
|
|
161
|
+
}
|
|
162
|
+
// ── Derive start lambda from maxSlow ───────────────────────────────────────────
|
|
163
|
+
// Binary search: find the smallest lambda where optimal slow < maxSlow.
|
|
164
|
+
function findStartLambda(metricCache, maxSlow, lambdaEnd) {
|
|
165
|
+
let lo = 0;
|
|
166
|
+
let hi = 1;
|
|
167
|
+
// Expand hi until the best slow drops below maxSlow
|
|
168
|
+
while ((findBestForLambda(hi, metricCache)?.slow ?? Infinity) >= maxSlow && hi < 1e6)
|
|
169
|
+
hi *= 2;
|
|
170
|
+
if (hi >= 1e6)
|
|
171
|
+
return null;
|
|
172
|
+
for (let i = 0; i < 60; i++) {
|
|
173
|
+
const mid = (lo + hi) / 2;
|
|
174
|
+
const best = findBestForLambda(mid, metricCache);
|
|
175
|
+
if (best && best.slow < maxSlow)
|
|
176
|
+
hi = mid;
|
|
177
|
+
else
|
|
178
|
+
lo = mid;
|
|
179
|
+
}
|
|
180
|
+
// When cache max equals maxSlow, hi converges near 0 — ensure a minimum gap
|
|
181
|
+
if (hi < lambdaEnd / 1e6)
|
|
182
|
+
hi = lambdaEnd / 1000;
|
|
183
|
+
return hi;
|
|
184
|
+
}
|
|
185
|
+
// ── HTML Chart (λ → Slow) ──────────────────────────────────────────────────────
|
|
186
|
+
function generateChartHtml(results, metricCache, fixEr, fixFast, dataLabel, _chartOutPath) {
|
|
187
|
+
const xs = results.map((r) => r.lambda);
|
|
188
|
+
const ys = results.map((r) => r.slow);
|
|
189
|
+
const dist = results.map((r) => r.distance);
|
|
190
|
+
const move = results.map((r) => r.movement);
|
|
191
|
+
const cacheSlow = metricCache.map((m) => m.slow);
|
|
192
|
+
const cacheMove = metricCache.map((m) => m.movement);
|
|
193
|
+
const uplotCode = fs.readFileSync(path.resolve(__dirname, '..', 'uplot', 'uPlot.iife.min.js'), 'utf8');
|
|
194
|
+
const uplotCSS = fs.readFileSync(path.resolve(__dirname, '..', 'uplot', 'uPlot.min.css'), 'utf8');
|
|
195
|
+
const amaAnnotations = [
|
|
196
|
+
{ label: 'AMA1', lambda: 0.0031, slow: 62.1, color: '#ef5350' },
|
|
197
|
+
{ label: 'AMA2', lambda: 0.0025, slow: 71.7, color: '#fb8c00' },
|
|
198
|
+
{ label: 'AMA3', lambda: 0.00185, slow: 82.7, color: '#5c9ee6' },
|
|
199
|
+
{ label: 'AMA4', lambda: 0.0013, slow: 95.5, color: '#26a69a' },
|
|
200
|
+
].filter(a => a.lambda >= xs[0] && a.lambda <= xs[xs.length - 1]);
|
|
201
|
+
return `<!DOCTYPE html>
|
|
202
|
+
<html lang="en">
|
|
203
|
+
<head>
|
|
204
|
+
<meta charset="UTF-8">
|
|
205
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
206
|
+
<title>λ → Slow — ER=${fixEr} Fast=${fixFast}</title>
|
|
207
|
+
<style>
|
|
208
|
+
${uplotCSS}
|
|
209
|
+
body { font-family: system-ui, sans-serif; margin: 20px; background: #1e1e2e; color: #cdd6f4; }
|
|
210
|
+
h1 { font-size: 16px; margin: 0 0 2px 0; }
|
|
211
|
+
.subtitle { color: #a6adc8; font-size: 12px; margin-bottom: 12px; }
|
|
212
|
+
.chart-wrap { background: #181825; padding: 20px; border-radius: 8px; display: inline-block; min-width: 1140px; }
|
|
213
|
+
.chart-row { display: flex; gap: 8px; flex-direction: column; }
|
|
214
|
+
.legend { display: flex; gap: 20px; margin: 10px 0; font-size: 12px; }
|
|
215
|
+
.legend-item { display: flex; align-items: center; gap: 4px; }
|
|
216
|
+
.legend-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
|
|
217
|
+
.legend-line { width: 16px; height: 2px; display: inline-block; }
|
|
218
|
+
</style>
|
|
219
|
+
</head>
|
|
220
|
+
<body>
|
|
221
|
+
<div class="chart-wrap">
|
|
222
|
+
<h1>λ (distanceWeight) Analysis</h1>
|
|
223
|
+
<div class="subtitle">${dataLabel} · ER=${fixEr} · Fast=${fixFast} · ${results.length} λ steps</div>
|
|
224
|
+
<div class="chart-row">
|
|
225
|
+
<div id="chart-slow"></div>
|
|
226
|
+
<div id="chart-dist"></div>
|
|
227
|
+
<div id="chart-compare"></div>
|
|
228
|
+
</div>
|
|
229
|
+
<div class="legend">
|
|
230
|
+
<span class="legend-item"><span class="legend-line" style="background:#26a69a"></span> Slow</span>
|
|
231
|
+
<span class="legend-item"><span class="legend-line" style="background:#fb8c00"></span> Movement (λ)</span>
|
|
232
|
+
<span class="legend-item"><span class="legend-line" style="background:#5c9ee6"></span> Movement (Slow)</span>
|
|
233
|
+
${amaAnnotations.map(a => `<span class="legend-item"><span class="legend-dot" style="background:${a.color}"></span> ${a.label}</span>`).join('\n')}
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
<script>${uplotCode}</script>
|
|
237
|
+
<script>
|
|
238
|
+
(function() {
|
|
239
|
+
const xs = ${JSON.stringify(xs)};
|
|
240
|
+
const slow = ${JSON.stringify(ys)};
|
|
241
|
+
const dist = ${JSON.stringify(dist)};
|
|
242
|
+
const move = ${JSON.stringify(move)};
|
|
243
|
+
const amaPts = ${JSON.stringify(amaAnnotations)};
|
|
244
|
+
const cacheSlow = ${JSON.stringify(cacheSlow)};
|
|
245
|
+
const cacheMove = ${JSON.stringify(cacheMove)};
|
|
246
|
+
const revSlow = slow.slice().reverse();
|
|
247
|
+
const revMove = move.slice().reverse();
|
|
248
|
+
const revDist = dist.slice().reverse();
|
|
249
|
+
|
|
250
|
+
const slowOpts = {
|
|
251
|
+
width: 1100, height: 440,
|
|
252
|
+
cursor: { drag: { x: true, y: true } },
|
|
253
|
+
select: { show: true },
|
|
254
|
+
legend: { show: true },
|
|
255
|
+
axes: [
|
|
256
|
+
{ label: "λ", stroke: "#cdd6f4", grid: { stroke: "rgba(205,214,244,0.06)" }, size: 50 },
|
|
257
|
+
{ label: "Slow Period", stroke: "#cdd6f4", grid: { stroke: "rgba(205,214,244,0.06)" }, size: 50 },
|
|
258
|
+
],
|
|
259
|
+
series: [
|
|
260
|
+
{ label: "λ" },
|
|
261
|
+
{ label: "Slow", stroke: "#26a69a", width: 2, fill: "rgba(38,166,154,0.06)", points: { show: false } },
|
|
262
|
+
],
|
|
263
|
+
scales: { x: { time: false }, y: { range: [10, null] } },
|
|
264
|
+
};
|
|
265
|
+
new uPlot(slowOpts, [xs, slow], document.getElementById('chart-slow'));
|
|
266
|
+
|
|
267
|
+
const moveOpts = {
|
|
268
|
+
width: 1100, height: 280,
|
|
269
|
+
cursor: { drag: { x: true, y: true } },
|
|
270
|
+
select: { show: true },
|
|
271
|
+
legend: { show: true },
|
|
272
|
+
axes: [
|
|
273
|
+
{ label: "λ", stroke: "#cdd6f4", grid: { stroke: "rgba(205,214,244,0.06)" }, size: 50 },
|
|
274
|
+
{ label: "AMA Movement (path length)", stroke: "#cdd6f4", grid: { stroke: "rgba(205,214,244,0.06)" }, size: 50 },
|
|
275
|
+
],
|
|
276
|
+
series: [
|
|
277
|
+
{ label: "λ" },
|
|
278
|
+
{ label: "Movement", stroke: "#fb8c00", width: 2, points: { show: false } },
|
|
279
|
+
],
|
|
280
|
+
scales: { x: { time: false }, y: { range: [0, null] } },
|
|
281
|
+
};
|
|
282
|
+
new uPlot(moveOpts, [xs, move], document.getElementById('chart-dist'));
|
|
283
|
+
|
|
284
|
+
try {
|
|
285
|
+
new uPlot({
|
|
286
|
+
width: 1100, height: 300,
|
|
287
|
+
cursor: { drag: { x: true, y: true } },
|
|
288
|
+
select: { show: true },
|
|
289
|
+
legend: { show: true },
|
|
290
|
+
axes: [
|
|
291
|
+
{ label: "Slow Period", stroke: "#cdd6f4", grid: { stroke: "rgba(205,214,244,0.06)" }, size: 50 },
|
|
292
|
+
{ label: "AMA Movement (path length)", stroke: "#cdd6f4", grid: { stroke: "rgba(205,214,244,0.06)" }, size: 50 },
|
|
293
|
+
],
|
|
294
|
+
series: [
|
|
295
|
+
{ label: "Slow" },
|
|
296
|
+
{ label: "Movement", stroke: "#5c9ee6", width: 2, points: { show: false } },
|
|
297
|
+
],
|
|
298
|
+
scales: { x: { time: false }, y: { range: [0, null] } },
|
|
299
|
+
}, [cacheSlow, cacheMove], document.getElementById('chart-compare'));
|
|
300
|
+
} catch(e) {
|
|
301
|
+
const el = document.getElementById('chart-compare');
|
|
302
|
+
el.textContent = 'Chart error: ' + e.message;
|
|
303
|
+
el.style.color = '#ef5350';
|
|
304
|
+
}
|
|
305
|
+
})();
|
|
306
|
+
</script>
|
|
307
|
+
</body>
|
|
308
|
+
</html>`;
|
|
309
|
+
}
|
|
310
|
+
// ── Main ────────────────────────────────────────────────────────────────────────
|
|
311
|
+
async function run() {
|
|
312
|
+
const cfg = parseArgs();
|
|
313
|
+
// Load data
|
|
314
|
+
const dataFile = cfg.dataFile;
|
|
315
|
+
const loaded = loadLpDataFile(path.resolve(dataFile));
|
|
316
|
+
const candles = loaded.candleObjects;
|
|
317
|
+
const meta = loaded.meta;
|
|
318
|
+
const dataLabel = meta
|
|
319
|
+
? `LP Pool ${meta.pool} (${meta.assetA?.symbol || '?'}/${meta.assetB?.symbol || '?'})`
|
|
320
|
+
: path.basename(dataFile);
|
|
321
|
+
const closes = candles.map(c => c.close);
|
|
322
|
+
console.log('══════════════════════════════════════════════════════════');
|
|
323
|
+
console.log(' Lambda vs Slow Analysis');
|
|
324
|
+
console.log('══════════════════════════════════════════════════════════');
|
|
325
|
+
console.log(` Data: ${cfg.dataFile} (${candles.length} candles)`);
|
|
326
|
+
console.log(` Fixed: ER=${cfg.fixEr} Fast=${cfg.fixFast}`);
|
|
327
|
+
console.log(` MaxSlow: ${cfg.maxSlow}`);
|
|
328
|
+
console.log(` Lambda end: ${cfg.lambdaEnd} (${cfg.lambdaSteps} steps)`);
|
|
329
|
+
console.log('');
|
|
330
|
+
// Build internal slow range (geometric, extends past maxSlow)
|
|
331
|
+
const internalSlowMax = cfg.maxSlow;
|
|
332
|
+
const internalSlowCount = Math.max(200, Math.ceil(internalSlowMax / 2.5));
|
|
333
|
+
const slowValues = geometricRange(10, internalSlowMax, internalSlowCount);
|
|
334
|
+
// Precompute movement + distance per slow (once)
|
|
335
|
+
console.log(' Precomputing AMA metrics per slow value...');
|
|
336
|
+
const metricCache = precomputeMetrics(closes, candles, cfg.fixEr, cfg.fixFast, slowValues);
|
|
337
|
+
console.log(` Cached ${metricCache.length} slow profiles`);
|
|
338
|
+
// Derive start lambda from maxSlow
|
|
339
|
+
const lambdaStart = findStartLambda(metricCache, cfg.maxSlow, cfg.lambdaEnd);
|
|
340
|
+
if (lambdaStart === null) {
|
|
341
|
+
console.log(' Could not determine start lambda — maxSlow too low.');
|
|
342
|
+
process.exit(1);
|
|
343
|
+
}
|
|
344
|
+
if (lambdaStart >= cfg.lambdaEnd) {
|
|
345
|
+
console.log(` Start lambda (${lambdaStart.toFixed(6)}) >= end lambda (${cfg.lambdaEnd}) — increase --lambdaEnd or decrease --maxSlow.`);
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
console.log(` Derived start λ: ${lambdaStart.toFixed(6)} (optimal slow first drops below ${cfg.maxSlow})`);
|
|
349
|
+
// Verify start lambda produces slow ~= maxSlow
|
|
350
|
+
const checkStart = findBestForLambda(lambdaStart, metricCache);
|
|
351
|
+
console.log(` At start λ: slow=${checkStart.slow.toFixed(1)} (should be near ${cfg.maxSlow})\n`);
|
|
352
|
+
// Build geometric lambda range
|
|
353
|
+
const lambdaValues = geometricRange(lambdaStart, cfg.lambdaEnd, cfg.lambdaSteps);
|
|
354
|
+
// Score each lambda against the cache — no AMA recalculation
|
|
355
|
+
const results = [];
|
|
356
|
+
for (let idx = 0; idx < lambdaValues.length; idx++) {
|
|
357
|
+
const lambda = lambdaValues[idx];
|
|
358
|
+
const best = findBestForLambda(lambda, metricCache);
|
|
359
|
+
if (!best) {
|
|
360
|
+
console.log(` λ=${lambda.toFixed(6)} → NO VALID`);
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
results.push(best);
|
|
364
|
+
const pct = ((idx + 1) / lambdaValues.length * 100).toFixed(0);
|
|
365
|
+
console.log(` [${pct}%] λ=${best.lambda.toFixed(6)} → slow=${best.slow.toFixed(1)} move=${best.movement.toFixed(4)} dist=${best.distance.toFixed(4)} score=${best.score.toFixed(4)}`);
|
|
366
|
+
}
|
|
367
|
+
console.log('\n═══ Summary ═══');
|
|
368
|
+
console.log(' λ (input) | Slow (output) | Movement | Distance | Score');
|
|
369
|
+
console.log(' ──────────────┼───────────────┼──────────┼──────────┼────────');
|
|
370
|
+
for (const r of results) {
|
|
371
|
+
console.log(` ${r.lambda.toFixed(8).padStart(12)} | ${r.slow.toFixed(1).padStart(13)} | ${r.movement.toFixed(4).padStart(8)} | ${r.distance.toFixed(4).padStart(8)} | ${r.score.toFixed(4).padStart(8)}`);
|
|
372
|
+
}
|
|
373
|
+
// Generate chart
|
|
374
|
+
const chartName = cfg.outFile || path.join(PATHS.ANALYSIS.CHARTS_DIR, `lambda_vs_slow_er${cfg.fixEr}_fast${cfg.fixFast}_${cfg.lambdaSteps}steps.html`);
|
|
375
|
+
const chartPath = path.resolve(chartName);
|
|
376
|
+
ensureDir(path.dirname(chartPath));
|
|
377
|
+
const html = generateChartHtml(results, metricCache, cfg.fixEr, cfg.fixFast, dataLabel, chartPath);
|
|
378
|
+
fs.writeFileSync(chartPath, html, 'utf8');
|
|
379
|
+
console.log(`\n Chart: ${path.relative(process.cwd(), chartPath)}`);
|
|
380
|
+
console.log('');
|
|
381
|
+
}
|
|
382
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
383
|
+
run().catch(err => {
|
|
384
|
+
console.error('Fatal:', getErrorMessage(err));
|
|
385
|
+
process.exit(1);
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
export { parseArgs };
|
|
389
|
+
//# sourceMappingURL=analyze_lambda_vs_slow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze_lambda_vs_slow.js","sourceRoot":"","sources":["../../../analysis/ama_fitting/analyze_lambda_vs_slow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calibrate_convergence_er.d.ts","sourceRoot":"","sources":["../../../analysis/ama_fitting/calibrate_convergence_er.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { MARKET_ADAPTER } from '../../modules/constants.js';
|
|
4
|
+
import { getStorage } from '../../modules/storage/index.js';
|
|
5
|
+
const { readJSON } = getStorage();
|
|
6
|
+
import { PATHS } from '../../modules/paths.js';
|
|
7
|
+
import { roundTo } from '../../modules/order/utils/math.js';
|
|
8
|
+
'use strict';
|
|
9
|
+
/**
|
|
10
|
+
* AMA CONVERGENCE ER CALIBRATION
|
|
11
|
+
*
|
|
12
|
+
* Computes the correct AMA_CONVERGENCE_ER_AVG from real LP candle data.
|
|
13
|
+
*
|
|
14
|
+
* The formula `(ER_avg × deltaSC + slowSC)²` suffers from Jensen's inequality:
|
|
15
|
+
* E[f(ER)] ≠ f(E[ER]) when f is convex (x²). The arithmetic mean ER
|
|
16
|
+
* underestimates the true average SC because high-ER periods contribute
|
|
17
|
+
* quadratically more to convergence.
|
|
18
|
+
*
|
|
19
|
+
* This script computes the implied ER — the value that, when plugged into
|
|
20
|
+
* the formula, reproduces the empirical arithmetic SC_avg — and prints
|
|
21
|
+
* the recommended constant for modules/constants.ts.
|
|
22
|
+
*
|
|
23
|
+
* Usage:
|
|
24
|
+
* tsx analysis/ama_fitting/calibrate_convergence_er.ts
|
|
25
|
+
* tsx analysis/ama_fitting/calibrate_convergence_er.ts --data <lp-file.json>
|
|
26
|
+
* tsx analysis/ama_fitting/calibrate_convergence_er.ts --data <lp-file.json> --amas AMA3
|
|
27
|
+
*/
|
|
28
|
+
const DEFAULT_DATA = path.join(PATHS.MARKET_ADAPTER.LP_DATA_DIR, '1_3_5537_1_3_0', 'lp_pool_133_1h.json');
|
|
29
|
+
const FALLBACK_ER_PERIOD = 781;
|
|
30
|
+
function parseArgs() {
|
|
31
|
+
const args = process.argv.slice(2);
|
|
32
|
+
const opts = { data: DEFAULT_DATA, amas: null };
|
|
33
|
+
for (let i = 0; i < args.length; i++) {
|
|
34
|
+
if (args[i] === '--data' && args[i + 1])
|
|
35
|
+
opts.data = args[++i];
|
|
36
|
+
if (args[i] === '--amas' && args[i + 1])
|
|
37
|
+
opts.amas = args[++i].split(',');
|
|
38
|
+
}
|
|
39
|
+
return opts;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Compute per-bar SC values and return { scAvg, erValues, avgER }.
|
|
43
|
+
* scAvg = mean of (ER × deltaSC + slowSC)² across all bars.
|
|
44
|
+
*/
|
|
45
|
+
function computeSCstats(closes, erPeriod, fastPeriod, slowPeriod) {
|
|
46
|
+
const fastSC = 2 / (fastPeriod + 1);
|
|
47
|
+
const slowSC = 2 / (slowPeriod + 1);
|
|
48
|
+
const deltaSC = fastSC - slowSC;
|
|
49
|
+
let sumSC = 0;
|
|
50
|
+
const erValues = [];
|
|
51
|
+
for (let i = erPeriod; i < closes.length; i++) {
|
|
52
|
+
const dir = Math.abs(closes[i] - closes[i - erPeriod]);
|
|
53
|
+
let vol = 0;
|
|
54
|
+
for (let j = i - erPeriod + 1; j <= i; j++) {
|
|
55
|
+
vol += Math.abs(closes[j] - closes[j - 1]);
|
|
56
|
+
}
|
|
57
|
+
const er = vol === 0 ? 0 : dir / vol;
|
|
58
|
+
erValues.push(er);
|
|
59
|
+
sumSC += (er * deltaSC + slowSC) ** 2;
|
|
60
|
+
}
|
|
61
|
+
const count = erValues.length;
|
|
62
|
+
const scAvg = count > 0 ? sumSC / count : 0;
|
|
63
|
+
const avgER = count > 0 ? erValues.reduce((a, b) => a + b) / count : 0;
|
|
64
|
+
return { scAvg, erValues, avgER, count };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Format a column-aligned markdown table row.
|
|
68
|
+
*/
|
|
69
|
+
function row(cells, widths) {
|
|
70
|
+
const parts = cells.map((c, i) => {
|
|
71
|
+
const s = String(c);
|
|
72
|
+
return i < widths.length ? s.padEnd(widths[i]) : s;
|
|
73
|
+
});
|
|
74
|
+
return `| ${parts.join(' | ')} |`;
|
|
75
|
+
}
|
|
76
|
+
function main() {
|
|
77
|
+
const opts = parseArgs();
|
|
78
|
+
// ── Load and validate data ──────────────────────────────────────────
|
|
79
|
+
let data;
|
|
80
|
+
try {
|
|
81
|
+
data = readJSON(opts.data);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const e = err;
|
|
85
|
+
if (e.code === 'ENOENT') {
|
|
86
|
+
console.error(`Data file not found: ${opts.data}`);
|
|
87
|
+
console.error('Export LP candles first, or point --data at an existing file.');
|
|
88
|
+
console.error(' tsx market_adapter/inputs/fetch_lp_data.ts --pool 133 --precA 4 --precB 5 --interval 1h --lookback 26280h');
|
|
89
|
+
}
|
|
90
|
+
else if (e instanceof SyntaxError) {
|
|
91
|
+
console.error(`Failed to parse JSON from: ${opts.data}`);
|
|
92
|
+
console.error(e.message);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.error(`Error reading data file: ${e.message}`);
|
|
96
|
+
}
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
const closes = (data.candles || []).map((c) => Number(c[4]))
|
|
100
|
+
.filter((v) => Number.isFinite(v) && v > 0);
|
|
101
|
+
if (closes.length < 100) {
|
|
102
|
+
console.error(`Not enough candles (need > 100, got ${closes.length})`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
const amas = MARKET_ADAPTER.AMAS;
|
|
106
|
+
const keys = opts.amas || Object.keys(amas);
|
|
107
|
+
const eps = MARKET_ADAPTER.AMA_CONVERGENCE_EPSILON;
|
|
108
|
+
console.log(`Data: ${opts.data}`);
|
|
109
|
+
console.log(`Candles: ${closes.length} | EPSILON: ${eps}`);
|
|
110
|
+
console.log('');
|
|
111
|
+
// ── ER distribution display (using first AMA's erPeriod) ──────────
|
|
112
|
+
const refKey = keys[0];
|
|
113
|
+
const refCfg = amas[refKey];
|
|
114
|
+
const erP = refCfg?.erPeriod || FALLBACK_ER_PERIOD;
|
|
115
|
+
const { erValues, avgER: refAvgER } = computeSCstats(closes, erP, refCfg.fastPeriod, refCfg.slowPeriod);
|
|
116
|
+
erValues.sort((a, b) => a - b);
|
|
117
|
+
const n = erValues.length;
|
|
118
|
+
const p5 = erValues[Math.floor(0.05 * n)].toFixed(4);
|
|
119
|
+
const p50 = erValues[Math.floor(0.50 * n)].toFixed(4);
|
|
120
|
+
const p95 = erValues[Math.floor(0.95 * n)].toFixed(4);
|
|
121
|
+
console.log(`--- ER distribution (erPeriod=${erP}) ---`);
|
|
122
|
+
console.log(` p5 ${p5} p50 ${p50} p95 ${p95} avg ${refAvgER.toFixed(4)}`);
|
|
123
|
+
console.log('');
|
|
124
|
+
// ── Per-AMA analysis (compute once, cache results) ─────────────────
|
|
125
|
+
const results = [];
|
|
126
|
+
// Validate erPeriod / fastPeriod consistency for meaningful naiveSC comparison
|
|
127
|
+
const erPeriods = new Set();
|
|
128
|
+
const fastPeriods = new Set();
|
|
129
|
+
for (const key of keys) {
|
|
130
|
+
if (amas[key]) {
|
|
131
|
+
erPeriods.add(amas[key].erPeriod);
|
|
132
|
+
fastPeriods.add(amas[key].fastPeriod);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const consistentER = erPeriods.size === 1 && fastPeriods.size === 1;
|
|
136
|
+
for (const key of keys) {
|
|
137
|
+
const cfg = amas[key];
|
|
138
|
+
if (!cfg)
|
|
139
|
+
continue;
|
|
140
|
+
const { scAvg, avgER, count } = computeSCstats(closes, cfg.erPeriod, cfg.fastPeriod, cfg.slowPeriod);
|
|
141
|
+
const fastSC = 2 / (cfg.fastPeriod + 1);
|
|
142
|
+
const slowSC = 2 / (cfg.slowPeriod + 1);
|
|
143
|
+
const deltaSC = fastSC - slowSC;
|
|
144
|
+
const naiveSC = (avgER * deltaSC + slowSC) ** 2;
|
|
145
|
+
const impliedER = Math.max(0, Math.min(1, (Math.sqrt(scAvg) - slowSC) / deltaSC));
|
|
146
|
+
const convBars = Math.ceil(Math.log(eps) / Math.log(1 - scAvg));
|
|
147
|
+
results.push({ key, cfg, fastSC, slowSC, deltaSC, scAvg, avgER, naiveSC, impliedER, convBars, count });
|
|
148
|
+
}
|
|
149
|
+
// ── Print analysis table ───────────────────────────────────────────
|
|
150
|
+
console.log('--- Per-AMA SC analysis ---');
|
|
151
|
+
if (!consistentER) {
|
|
152
|
+
console.log('(note: selected AMAs have different erPeriod/fastPeriod — naiveSC column is per-AMA)');
|
|
153
|
+
}
|
|
154
|
+
const hdr = row(['AMA', 'fastSC', 'slowSC', 'emp SC_avg', 'naive SC (E[ER])', 'implied ER', 'conv bars'], [5, 8, 8, 11, 17, 11, 10]);
|
|
155
|
+
const sep = row(['-----', '--------', '--------', '-----------', '-----------------', '-----------', '----------'], [5, 8, 8, 11, 17, 11, 10]);
|
|
156
|
+
console.log(hdr);
|
|
157
|
+
console.log(sep);
|
|
158
|
+
for (const r of results) {
|
|
159
|
+
console.log(row([
|
|
160
|
+
r.key,
|
|
161
|
+
r.fastSC.toFixed(4),
|
|
162
|
+
r.slowSC.toFixed(4),
|
|
163
|
+
r.scAvg.toExponential(4),
|
|
164
|
+
r.naiveSC.toExponential(4),
|
|
165
|
+
r.impliedER.toFixed(4),
|
|
166
|
+
r.convBars,
|
|
167
|
+
], [5, 8, 8, 11, 17, 11, 10]));
|
|
168
|
+
}
|
|
169
|
+
// ── Recommended constant ───────────────────────────────────────────
|
|
170
|
+
const avgImpliedER = results.reduce((a, r) => a + r.impliedER, 0) / results.length;
|
|
171
|
+
const recRounded = roundTo(avgImpliedER, 1000);
|
|
172
|
+
console.log('');
|
|
173
|
+
console.log('--- Recommended constant ---');
|
|
174
|
+
console.log(` Average implied ER: ${avgImpliedER.toFixed(4)}`);
|
|
175
|
+
console.log(` Rounded: ${recRounded.toFixed(3)}`);
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log(` Current in constants.ts: AMA_CONVERGENCE_ER_AVG = ${MARKET_ADAPTER.AMA_CONVERGENCE_ER_AVG}`);
|
|
178
|
+
console.log(` Suggested update: AMA_CONVERGENCE_ER_AVG = ${recRounded.toFixed(3)}`);
|
|
179
|
+
// ── Convergence bars comparison (using cached results) ─────────────
|
|
180
|
+
console.log('');
|
|
181
|
+
console.log('--- Convergence bars comparison (current vs recommended ER) ---');
|
|
182
|
+
const cmpHdr = row(['AMA', `curr ER=${MARKET_ADAPTER.AMA_CONVERGENCE_ER_AVG}`, `rec ER=${recRounded.toFixed(3)}`, 'empirical'], [5, 14, 14, 10]);
|
|
183
|
+
const cmpSep = row(['-----', '--------------', '--------------', '----------'], [5, 14, 14, 10]);
|
|
184
|
+
console.log(cmpHdr);
|
|
185
|
+
console.log(cmpSep);
|
|
186
|
+
for (const r of results) {
|
|
187
|
+
const curSC = (MARKET_ADAPTER.AMA_CONVERGENCE_ER_AVG * r.deltaSC + r.slowSC) ** 2;
|
|
188
|
+
const curBars = Math.ceil(Math.log(eps) / Math.log(1 - curSC));
|
|
189
|
+
const recSC = (recRounded * r.deltaSC + r.slowSC) ** 2;
|
|
190
|
+
const recBars = Math.ceil(Math.log(eps) / Math.log(1 - recSC));
|
|
191
|
+
console.log(row([
|
|
192
|
+
r.key,
|
|
193
|
+
curBars + r.cfg.erPeriod,
|
|
194
|
+
recBars + r.cfg.erPeriod,
|
|
195
|
+
r.convBars + r.cfg.erPeriod,
|
|
196
|
+
], [5, 14, 14, 10]));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
main();
|
|
200
|
+
//# sourceMappingURL=calibrate_convergence_er.js.map
|