dexbot 1.4.17 → 1.4.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/analysis/README.md +43 -43
  3. package/analysis/ama_fitting/README.md +8 -8
  4. package/analysis/ama_fitting/package.json +1 -1
  5. package/analysis/bot_fitting/README.md +4 -4
  6. package/analysis/bot_fitting/backtest_ama_sweep.ts +1 -1
  7. package/analysis/bot_usage/discover_bot_accounts.ts +11 -11
  8. package/analysis/tradingview/README.md +4 -4
  9. package/analysis/trend_detection/DYNAMIC_WEIGHT_RESEARCH.md +2 -2
  10. package/analysis/trend_detection/SIGNAL_DOCUMENTATION.md +1 -1
  11. package/analysis/trend_detection/package.json +1 -1
  12. package/claw/README.md +45 -45
  13. package/claw/docs/AI_BOT_LIBRARY_API.md +6 -6
  14. package/claw/examples/short_mpa_bts_strategy.ts +3 -3
  15. package/claw/package.json +21 -21
  16. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  17. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  18. package/claw/scripts/claw_bridge.ts +2 -2
  19. package/claw/scripts/claw_skill_md.ts +1 -1
  20. package/claw/skills/launcher-ops/references/launcher-workflow.md +5 -5
  21. package/claw/skills/margin-trading/references/honest-asset-list.md +1 -1
  22. package/claw/skills/memu-memory/SKILL.md +3 -3
  23. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  24. package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts +3 -0
  25. package/dist/analysis/ama_fitting/analyze_ama_price_changes.d.ts.map +1 -0
  26. package/dist/analysis/ama_fitting/analyze_ama_price_changes.js +148 -0
  27. package/dist/analysis/ama_fitting/analyze_ama_price_changes.js.map +1 -0
  28. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts +12 -0
  29. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.d.ts.map +1 -0
  30. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js +389 -0
  31. package/dist/analysis/ama_fitting/analyze_lambda_vs_slow.js.map +1 -0
  32. package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts +3 -0
  33. package/dist/analysis/ama_fitting/calibrate_convergence_er.d.ts.map +1 -0
  34. package/dist/analysis/ama_fitting/calibrate_convergence_er.js +200 -0
  35. package/dist/analysis/ama_fitting/calibrate_convergence_er.js.map +1 -0
  36. package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts +3 -0
  37. package/dist/analysis/ama_fitting/fetch_lp_candles.d.ts.map +1 -0
  38. package/dist/analysis/ama_fitting/fetch_lp_candles.js +213 -0
  39. package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -0
  40. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts +25 -0
  41. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.d.ts.map +1 -0
  42. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js +247 -0
  43. package/dist/analysis/ama_fitting/generate_unified_comparison_chart.js.map +1 -0
  44. package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts +35 -0
  45. package/dist/analysis/ama_fitting/optimizer_high_resolution.d.ts.map +1 -0
  46. package/dist/analysis/ama_fitting/optimizer_high_resolution.js +782 -0
  47. package/dist/analysis/ama_fitting/optimizer_high_resolution.js.map +1 -0
  48. package/dist/analysis/analyze_derivatives.d.ts +86 -0
  49. package/dist/analysis/analyze_derivatives.d.ts.map +1 -0
  50. package/dist/analysis/analyze_derivatives.js +285 -0
  51. package/dist/analysis/analyze_derivatives.js.map +1 -0
  52. package/dist/analysis/analyze_dynamic_weight.d.ts +14 -0
  53. package/dist/analysis/analyze_dynamic_weight.d.ts.map +1 -0
  54. package/dist/analysis/analyze_dynamic_weight.js +197 -0
  55. package/dist/analysis/analyze_dynamic_weight.js.map +1 -0
  56. package/dist/analysis/analyze_kalman.d.ts +13 -0
  57. package/dist/analysis/analyze_kalman.d.ts.map +1 -0
  58. package/dist/analysis/analyze_kalman.js +118 -0
  59. package/dist/analysis/analyze_kalman.js.map +1 -0
  60. package/dist/analysis/analyze_regime.d.ts +20 -0
  61. package/dist/analysis/analyze_regime.d.ts.map +1 -0
  62. package/dist/analysis/analyze_regime.js +139 -0
  63. package/dist/analysis/analyze_regime.js.map +1 -0
  64. package/dist/analysis/analyze_regime_windows.d.ts +19 -0
  65. package/dist/analysis/analyze_regime_windows.d.ts.map +1 -0
  66. package/dist/analysis/analyze_regime_windows.js +414 -0
  67. package/dist/analysis/analyze_regime_windows.js.map +1 -0
  68. package/dist/analysis/analyze_risk_profile.d.ts +3 -0
  69. package/dist/analysis/analyze_risk_profile.d.ts.map +1 -0
  70. package/dist/analysis/analyze_risk_profile.js +186 -0
  71. package/dist/analysis/analyze_risk_profile.js.map +1 -0
  72. package/dist/analysis/analyze_trade_heatmap.d.ts +3 -0
  73. package/dist/analysis/analyze_trade_heatmap.d.ts.map +1 -0
  74. package/dist/analysis/analyze_trade_heatmap.js +358 -0
  75. package/dist/analysis/analyze_trade_heatmap.js.map +1 -0
  76. package/dist/analysis/analyze_volatility.d.ts +22 -0
  77. package/dist/analysis/analyze_volatility.d.ts.map +1 -0
  78. package/dist/analysis/analyze_volatility.js +165 -0
  79. package/dist/analysis/analyze_volatility.js.map +1 -0
  80. package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts +91 -0
  81. package/dist/analysis/bot_fitting/backtest_ama_sweep.d.ts.map +1 -0
  82. package/dist/analysis/bot_fitting/backtest_ama_sweep.js +792 -0
  83. package/dist/analysis/bot_fitting/backtest_ama_sweep.js.map +1 -0
  84. package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts +2 -0
  85. package/dist/analysis/bot_fitting/backtest_bot_fitting.d.ts.map +1 -0
  86. package/dist/analysis/bot_fitting/backtest_bot_fitting.js +380 -0
  87. package/dist/analysis/bot_fitting/backtest_bot_fitting.js.map +1 -0
  88. package/dist/analysis/bot_fitting/shared_utils.d.ts +26 -0
  89. package/dist/analysis/bot_fitting/shared_utils.d.ts.map +1 -0
  90. package/dist/analysis/bot_fitting/shared_utils.js +42 -0
  91. package/dist/analysis/bot_fitting/shared_utils.js.map +1 -0
  92. package/dist/analysis/bot_key_utils.d.ts +11 -0
  93. package/dist/analysis/bot_key_utils.d.ts.map +1 -0
  94. package/dist/analysis/bot_key_utils.js +153 -0
  95. package/dist/analysis/bot_key_utils.js.map +1 -0
  96. package/dist/analysis/bot_usage/discover_bot_accounts.d.ts +3 -0
  97. package/dist/analysis/bot_usage/discover_bot_accounts.d.ts.map +1 -0
  98. package/dist/analysis/bot_usage/discover_bot_accounts.js +499 -0
  99. package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -0
  100. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +531 -0
  101. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -0
  102. package/dist/analysis/bot_usage/kibana_bot_queries.js +399 -0
  103. package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -0
  104. package/dist/analysis/chart_css.d.ts +17 -0
  105. package/dist/analysis/chart_css.d.ts.map +1 -0
  106. package/dist/analysis/chart_css.js +49 -0
  107. package/dist/analysis/chart_css.js.map +1 -0
  108. package/dist/analysis/chart_ui.d.ts +45 -0
  109. package/dist/analysis/chart_ui.d.ts.map +1 -0
  110. package/dist/analysis/chart_ui.js +97 -0
  111. package/dist/analysis/chart_ui.js.map +1 -0
  112. package/dist/analysis/chart_utils.d.ts +27 -0
  113. package/dist/analysis/chart_utils.d.ts.map +1 -0
  114. package/dist/analysis/chart_utils.js +153 -0
  115. package/dist/analysis/chart_utils.js.map +1 -0
  116. package/dist/analysis/derivative_chart_generator.d.ts +12 -0
  117. package/dist/analysis/derivative_chart_generator.d.ts.map +1 -0
  118. package/dist/analysis/derivative_chart_generator.js +891 -0
  119. package/dist/analysis/derivative_chart_generator.js.map +1 -0
  120. package/dist/analysis/math_utils.d.ts +22 -0
  121. package/dist/analysis/math_utils.d.ts.map +1 -0
  122. package/dist/analysis/math_utils.js +43 -0
  123. package/dist/analysis/math_utils.js.map +1 -0
  124. package/dist/analysis/price_sources.d.ts +40 -0
  125. package/dist/analysis/price_sources.d.ts.map +1 -0
  126. package/dist/analysis/price_sources.js +94 -0
  127. package/dist/analysis/price_sources.js.map +1 -0
  128. package/dist/analysis/resolve_source.d.ts +25 -0
  129. package/dist/analysis/resolve_source.d.ts.map +1 -0
  130. package/dist/analysis/resolve_source.js +69 -0
  131. package/dist/analysis/resolve_source.js.map +1 -0
  132. package/dist/analysis/trade_profitability.d.ts +115 -0
  133. package/dist/analysis/trade_profitability.d.ts.map +1 -0
  134. package/dist/analysis/trade_profitability.js +1240 -0
  135. package/dist/analysis/trade_profitability.js.map +1 -0
  136. package/dist/analysis/tradingview/analyze_tradingview.d.ts +31 -0
  137. package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -0
  138. package/dist/analysis/tradingview/analyze_tradingview.js +146 -0
  139. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -0
  140. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +5 -0
  141. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -0
  142. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1714 -0
  143. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -0
  144. package/dist/analysis/trend_detection/derivative_analyzer.d.ts +247 -0
  145. package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +1 -0
  146. package/dist/analysis/trend_detection/derivative_analyzer.js +901 -0
  147. package/dist/analysis/trend_detection/derivative_analyzer.js.map +1 -0
  148. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts +3 -0
  149. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -0
  150. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +1361 -0
  151. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -0
  152. package/dist/analysis/trend_detection/hurst_analyzer.d.ts +6 -0
  153. package/dist/analysis/trend_detection/hurst_analyzer.d.ts.map +1 -0
  154. package/dist/analysis/trend_detection/hurst_analyzer.js +7 -0
  155. package/dist/analysis/trend_detection/hurst_analyzer.js.map +1 -0
  156. package/dist/analysis/trend_detection/kalman_chart_generator.d.ts +3 -0
  157. package/dist/analysis/trend_detection/kalman_chart_generator.d.ts.map +1 -0
  158. package/dist/analysis/trend_detection/kalman_chart_generator.js +360 -0
  159. package/dist/analysis/trend_detection/kalman_chart_generator.js.map +1 -0
  160. package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts +8 -0
  161. package/dist/analysis/trend_detection/kalman_trend_analyzer.d.ts.map +1 -0
  162. package/dist/analysis/trend_detection/kalman_trend_analyzer.js +8 -0
  163. package/dist/analysis/trend_detection/kalman_trend_analyzer.js.map +1 -0
  164. package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts +6 -0
  165. package/dist/analysis/trend_detection/kalman_velocity_smoothing.d.ts.map +1 -0
  166. package/dist/analysis/trend_detection/kalman_velocity_smoothing.js +7 -0
  167. package/dist/analysis/trend_detection/kalman_velocity_smoothing.js.map +1 -0
  168. package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts +6 -0
  169. package/dist/analysis/trend_detection/permutation_entropy_analyzer.d.ts.map +1 -0
  170. package/dist/analysis/trend_detection/permutation_entropy_analyzer.js +7 -0
  171. package/dist/analysis/trend_detection/permutation_entropy_analyzer.js.map +1 -0
  172. package/dist/analysis/trend_detection/regime_chart_generator.d.ts +3 -0
  173. package/dist/analysis/trend_detection/regime_chart_generator.d.ts.map +1 -0
  174. package/dist/analysis/trend_detection/regime_chart_generator.js +310 -0
  175. package/dist/analysis/trend_detection/regime_chart_generator.js.map +1 -0
  176. package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts +2 -0
  177. package/dist/analysis/trend_detection/tests/test_kalman_trend.d.ts.map +1 -0
  178. package/dist/analysis/trend_detection/tests/test_kalman_trend.js +128 -0
  179. package/dist/analysis/trend_detection/tests/test_kalman_trend.js.map +1 -0
  180. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts +2 -0
  181. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.d.ts.map +1 -0
  182. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js +37 -0
  183. package/dist/analysis/trend_detection/tests/test_kalman_velocity_smoothing.js.map +1 -0
  184. package/dist/analysis/trend_detection/volatility_chart_generator.d.ts +3 -0
  185. package/dist/analysis/trend_detection/volatility_chart_generator.d.ts.map +1 -0
  186. package/dist/analysis/trend_detection/volatility_chart_generator.js +646 -0
  187. package/dist/analysis/trend_detection/volatility_chart_generator.js.map +1 -0
  188. package/dist/bot.js +1 -1
  189. package/dist/bot.js.map +1 -1
  190. package/dist/market_adapter/ama_signal_runner.js +1 -1
  191. package/dist/market_adapter/ama_signal_runner.js.map +1 -1
  192. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1 -1
  193. package/dist/scripts/generate_lp_chart.js +1 -1
  194. package/dist/scripts/test-credit-renewal.js +1 -1
  195. package/docs/DEXBOT_COMPARISON.md +3 -3
  196. package/docs/EVOLUTION.md +5 -4
  197. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +1 -1
  198. package/docs/GRID_RECALCULATION.md +2 -2
  199. package/docs/README.md +1 -1
  200. package/market_adapter/README.md +23 -23
  201. package/package.json +17 -21
  202. package/scripts/README.md +12 -12
  203. package/scripts/bots +5 -7
  204. package/scripts/clear-market-adapter.sh +1 -1
  205. package/scripts/dexbot +5 -7
  206. package/scripts/keys +5 -7
  207. package/scripts/pm2 +5 -7
  208. package/scripts/unlock +5 -7
  209. package/scripts/update.js +6 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze_ama_price_changes.js","sourceRoot":"","sources":["../../../analysis/ama_fitting/analyze_ama_price_changes.ts"],"names":[],"mappings":"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"}
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=calibrate_convergence_er.d.ts.map
@@ -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