dexbot 1.6.5 → 1.6.7

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 (228) hide show
  1. package/CHANGELOG.md +76 -4
  2. package/README.md +108 -36
  3. package/analysis/README.md +11 -16
  4. package/analysis/account_resolver.ts +1 -11
  5. package/analysis/bot_usage/kibana_bot_queries.ts +1 -1
  6. package/analysis/chain_pool.ts +1 -1
  7. package/analysis/fills_source.ts +0 -6
  8. package/analysis/grid_correction_check.ts +20 -26
  9. package/analysis/resolve_source.ts +1 -1
  10. package/analysis/trade_profitability.ts +2 -5
  11. package/analysis/trend_detection/README.md +1 -3
  12. package/analysis/trend_detection/package.json +1 -1
  13. package/claw/package.json +1 -1
  14. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  15. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  16. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  17. package/dist/analysis/account_resolver.d.ts +1 -4
  18. package/dist/analysis/account_resolver.d.ts.map +1 -1
  19. package/dist/analysis/account_resolver.js +1 -1
  20. package/dist/analysis/account_resolver.js.map +1 -1
  21. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +1 -2
  22. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
  23. package/dist/analysis/bot_usage/kibana_bot_queries.js +1 -1
  24. package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -1
  25. package/dist/analysis/chain_pool.d.ts +1 -3
  26. package/dist/analysis/chain_pool.d.ts.map +1 -1
  27. package/dist/analysis/chain_pool.js +1 -1
  28. package/dist/analysis/chain_pool.js.map +1 -1
  29. package/dist/analysis/fills_source.d.ts +1 -51
  30. package/dist/analysis/fills_source.d.ts.map +1 -1
  31. package/dist/analysis/fills_source.js +1 -1
  32. package/dist/analysis/fills_source.js.map +1 -1
  33. package/dist/analysis/grid_correction_check.d.ts +2 -3
  34. package/dist/analysis/grid_correction_check.d.ts.map +1 -1
  35. package/dist/analysis/grid_correction_check.js +18 -26
  36. package/dist/analysis/grid_correction_check.js.map +1 -1
  37. package/dist/analysis/resolve_source.d.ts +1 -1
  38. package/dist/analysis/resolve_source.d.ts.map +1 -1
  39. package/dist/analysis/trade_profitability.d.ts.map +1 -1
  40. package/dist/analysis/trade_profitability.js +2 -7
  41. package/dist/analysis/trade_profitability.js.map +1 -1
  42. package/dist/dexbot.d.ts.map +1 -1
  43. package/dist/dexbot.js +82 -83
  44. package/dist/dexbot.js.map +1 -1
  45. package/dist/market_adapter/core/kibana_candles.d.ts +1 -15
  46. package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -1
  47. package/dist/market_adapter/core/kibana_candles.js +1 -1
  48. package/dist/market_adapter/core/kibana_candles.js.map +1 -1
  49. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +1 -35
  50. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  51. package/dist/market_adapter/inputs/fetch_lp_data.js +10 -54
  52. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  53. package/dist/market_adapter/inputs/kibana_feed_source.d.ts +1 -8
  54. package/dist/market_adapter/inputs/kibana_feed_source.d.ts.map +1 -1
  55. package/dist/market_adapter/inputs/kibana_feed_source.js +1 -1
  56. package/dist/market_adapter/inputs/kibana_feed_source.js.map +1 -1
  57. package/dist/market_adapter/inputs/window_cache.d.ts +2 -63
  58. package/dist/market_adapter/inputs/window_cache.d.ts.map +1 -1
  59. package/dist/market_adapter/inputs/window_cache.js +22 -102
  60. package/dist/market_adapter/inputs/window_cache.js.map +1 -1
  61. package/dist/modules/account_bots.d.ts +16 -2
  62. package/dist/modules/account_bots.d.ts.map +1 -1
  63. package/dist/modules/account_bots.js +108 -44
  64. package/dist/modules/account_bots.js.map +1 -1
  65. package/dist/modules/account_orders.d.ts +20 -2
  66. package/dist/modules/account_orders.d.ts.map +1 -1
  67. package/dist/modules/account_orders.js +63 -3
  68. package/dist/modules/account_orders.js.map +1 -1
  69. package/dist/modules/bitshares-native/chain_client.d.ts +10 -0
  70. package/dist/modules/bitshares-native/chain_client.d.ts.map +1 -1
  71. package/dist/modules/bitshares-native/chain_client.js +197 -28
  72. package/dist/modules/bitshares-native/chain_client.js.map +1 -1
  73. package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts.map +1 -1
  74. package/dist/modules/bitshares-native/crypto/ecc.browser.js +0 -31
  75. package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -1
  76. package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -1
  77. package/dist/modules/bitshares-native/subscriptions.js +312 -10
  78. package/dist/modules/bitshares-native/subscriptions.js.map +1 -1
  79. package/dist/modules/bitshares-native/transport.d.ts +1 -0
  80. package/dist/modules/bitshares-native/transport.d.ts.map +1 -1
  81. package/dist/modules/bitshares-native/transport.js +97 -3
  82. package/dist/modules/bitshares-native/transport.js.map +1 -1
  83. package/dist/modules/bitshares_client.d.ts +20 -0
  84. package/dist/modules/bitshares_client.d.ts.map +1 -1
  85. package/dist/modules/bitshares_client.js +29 -0
  86. package/dist/modules/bitshares_client.js.map +1 -1
  87. package/dist/modules/chain_keys.d.ts +37 -22
  88. package/dist/modules/chain_keys.d.ts.map +1 -1
  89. package/dist/modules/chain_keys.js +145 -44
  90. package/dist/modules/chain_keys.js.map +1 -1
  91. package/dist/modules/cli_start_onboarding.d.ts +10 -0
  92. package/dist/modules/cli_start_onboarding.d.ts.map +1 -0
  93. package/dist/modules/cli_start_onboarding.js +15 -0
  94. package/dist/modules/cli_start_onboarding.js.map +1 -0
  95. package/dist/modules/cli_start_output.d.ts +6 -0
  96. package/dist/modules/cli_start_output.d.ts.map +1 -0
  97. package/dist/modules/cli_start_output.js +8 -0
  98. package/dist/modules/cli_start_output.js.map +1 -0
  99. package/dist/modules/constants.d.ts +13 -0
  100. package/dist/modules/constants.d.ts.map +1 -1
  101. package/dist/modules/constants.js +103 -1
  102. package/dist/modules/constants.js.map +1 -1
  103. package/dist/modules/credit_runtime.d.ts +0 -2
  104. package/dist/modules/credit_runtime.d.ts.map +1 -1
  105. package/dist/modules/credit_runtime.js +1 -10
  106. package/dist/modules/credit_runtime.js.map +1 -1
  107. package/dist/modules/dexbot_class.d.ts +13 -10
  108. package/dist/modules/dexbot_class.d.ts.map +1 -1
  109. package/dist/modules/dexbot_class.js +0 -9
  110. package/dist/modules/dexbot_class.js.map +1 -1
  111. package/dist/modules/dexbot_cow_runtime.d.ts +13 -0
  112. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  113. package/dist/modules/dexbot_cow_runtime.js +62 -10
  114. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  115. package/dist/modules/dexbot_fill_runtime.d.ts +6 -1
  116. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
  117. package/dist/modules/dexbot_fill_runtime.js +22 -3
  118. package/dist/modules/dexbot_fill_runtime.js.map +1 -1
  119. package/dist/modules/dexbot_maintenance_runtime.d.ts +24 -1
  120. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  121. package/dist/modules/dexbot_maintenance_runtime.js +45 -1
  122. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  123. package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
  124. package/dist/modules/dexbot_state_recovery.js +13 -1
  125. package/dist/modules/dexbot_state_recovery.js.map +1 -1
  126. package/dist/modules/order/accounting.d.ts +4 -18
  127. package/dist/modules/order/accounting.d.ts.map +1 -1
  128. package/dist/modules/order/accounting.js +4 -34
  129. package/dist/modules/order/accounting.js.map +1 -1
  130. package/dist/modules/order/export.d.ts +9 -12
  131. package/dist/modules/order/export.d.ts.map +1 -1
  132. package/dist/modules/order/export.js +9 -12
  133. package/dist/modules/order/export.js.map +1 -1
  134. package/dist/modules/order/grid.d.ts +35 -40
  135. package/dist/modules/order/grid.d.ts.map +1 -1
  136. package/dist/modules/order/grid.js +76 -44
  137. package/dist/modules/order/grid.js.map +1 -1
  138. package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
  139. package/dist/modules/order/grid_reconcile.js +111 -20
  140. package/dist/modules/order/grid_reconcile.js.map +1 -1
  141. package/dist/modules/order/grid_reconcile_internal.d.ts +5 -3
  142. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  143. package/dist/modules/order/grid_reconcile_internal.js +29 -3
  144. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  145. package/dist/modules/order/logger.d.ts +12 -2
  146. package/dist/modules/order/logger.d.ts.map +1 -1
  147. package/dist/modules/order/logger.js +29 -7
  148. package/dist/modules/order/logger.js.map +1 -1
  149. package/dist/modules/order/manager.d.ts +49 -8
  150. package/dist/modules/order/manager.d.ts.map +1 -1
  151. package/dist/modules/order/manager.js +72 -34
  152. package/dist/modules/order/manager.js.map +1 -1
  153. package/dist/modules/order/utils/order.d.ts +22 -7
  154. package/dist/modules/order/utils/order.d.ts.map +1 -1
  155. package/dist/modules/order/utils/order.js +200 -33
  156. package/dist/modules/order/utils/order.js.map +1 -1
  157. package/dist/modules/order/utils/system.d.ts +97 -0
  158. package/dist/modules/order/utils/system.d.ts.map +1 -1
  159. package/dist/modules/order/utils/system.js +274 -2
  160. package/dist/modules/order/utils/system.js.map +1 -1
  161. package/dist/modules/order/utils/withPoolRef.d.ts +12 -0
  162. package/dist/modules/order/utils/withPoolRef.d.ts.map +1 -1
  163. package/dist/modules/order/utils/withPoolRef.js +17 -0
  164. package/dist/modules/order/utils/withPoolRef.js.map +1 -1
  165. package/dist/modules/order/working_grid.d.ts +8 -13
  166. package/dist/modules/order/working_grid.d.ts.map +1 -1
  167. package/dist/modules/order/working_grid.js +8 -29
  168. package/dist/modules/order/working_grid.js.map +1 -1
  169. package/dist/modules/paths.d.ts +7 -1
  170. package/dist/modules/paths.d.ts.map +1 -1
  171. package/dist/modules/paths.js +10 -3
  172. package/dist/modules/paths.js.map +1 -1
  173. package/dist/modules/utils/text_width.d.ts +19 -0
  174. package/dist/modules/utils/text_width.d.ts.map +1 -0
  175. package/dist/modules/utils/text_width.js +97 -0
  176. package/dist/modules/utils/text_width.js.map +1 -0
  177. package/dist/pm2.d.ts.map +1 -1
  178. package/dist/pm2.js +95 -18
  179. package/dist/pm2.js.map +1 -1
  180. package/dist/scripts/sync-version.js +0 -22
  181. package/dist/scripts/sync-version.js.map +1 -1
  182. package/dist/scripts/update.js +62 -13
  183. package/dist/scripts/update.js.map +1 -1
  184. package/dist/scripts/update_dist_freshness.d.ts +12 -0
  185. package/dist/scripts/update_dist_freshness.d.ts.map +1 -1
  186. package/dist/scripts/update_dist_freshness.js +30 -1
  187. package/dist/scripts/update_dist_freshness.js.map +1 -1
  188. package/dist/unlock.d.ts +14 -2
  189. package/dist/unlock.d.ts.map +1 -1
  190. package/dist/unlock.js +73 -4
  191. package/dist/unlock.js.map +1 -1
  192. package/docs/BITSHARES_ONBOARDING.md +9 -6
  193. package/docs/COW_INVARIANTS.md +9 -0
  194. package/docs/CREDENTIAL_SECURITY.md +26 -0
  195. package/docs/DEXBOT_COMPARISON.md +11 -11
  196. package/docs/EVOLUTION.md +9 -7
  197. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +1 -1
  198. package/docs/GRID_PRICE_INVARIANT.md +573 -0
  199. package/docs/GRID_RECALCULATION.md +1 -1
  200. package/docs/GRID_RECONCILE.md +60 -39
  201. package/docs/LOGGING.md +17 -2
  202. package/docs/ORDER_ENGINE_POST_1.0_RETROSPECTIVE.md +555 -0
  203. package/docs/README.md +3 -3
  204. package/docs/WORKFLOW.md +12 -6
  205. package/docs/architecture.md +40 -38
  206. package/docs/developer_guide.md +4 -8
  207. package/market_adapter/README.md +16 -12
  208. package/modules/README.md +1 -1
  209. package/package.json +8 -4
  210. package/scripts/README.md +0 -9
  211. package/scripts/reset-settings.sh +1 -1
  212. package/analysis/ama_fitting/package.json +0 -12
  213. package/analysis/analyze_derivatives.ts +0 -320
  214. package/analysis/derivative_chart_generator.ts +0 -874
  215. package/analysis/trend_detection/SIGNAL_DOCUMENTATION.md +0 -403
  216. package/analysis/trend_detection/derivative_analyzer.ts +0 -1059
  217. package/dist/analysis/analyze_derivatives.d.ts +0 -68
  218. package/dist/analysis/analyze_derivatives.d.ts.map +0 -1
  219. package/dist/analysis/analyze_derivatives.js +0 -287
  220. package/dist/analysis/analyze_derivatives.js.map +0 -1
  221. package/dist/analysis/derivative_chart_generator.d.ts +0 -12
  222. package/dist/analysis/derivative_chart_generator.d.ts.map +0 -1
  223. package/dist/analysis/derivative_chart_generator.js +0 -891
  224. package/dist/analysis/derivative_chart_generator.js.map +0 -1
  225. package/dist/analysis/trend_detection/derivative_analyzer.d.ts +0 -248
  226. package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +0 -1
  227. package/dist/analysis/trend_detection/derivative_analyzer.js +0 -910
  228. package/dist/analysis/trend_detection/derivative_analyzer.js.map +0 -1
@@ -1,320 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- /**
5
- * DERIVATIVE TREND ANALYSIS
6
- *
7
- * Runs DerivativeAnalyzer over candle data and generates an interactive HTML chart.
8
- * Trend is detected from SMA, MACD, and RSI only.
9
- *
10
- * Usage:
11
- * node dist/analysis/analyze_derivatives.js \\
12
- * --source json \
13
- * --file market_adapter/data/lp/<path>/<to>/<lp-candles>.json
14
- *
15
- * node dist/analysis/analyze_derivatives.js \\
16
- * --source market_adapter \
17
- * --bot-key <bot>
18
- *
19
- * Output:
20
- * analysis/charts/derivative_chart.html
21
- */
22
-
23
-
24
- import path from 'node:path';
25
- import { pathToFileURL } from 'node:url';
26
- import { DerivativeAnalyzer } from './trend_detection/derivative_analyzer.js';
27
- import { generateHTML } from './derivative_chart_generator.js';
28
- import { writeChartFile } from './chart_utils.js';
29
- import { PATHS } from '../modules/paths.js';
30
- import { resolveSource, listAvailableBots, type SourceConfig } from './resolve_source.js';
31
-
32
-
33
- interface CliConfig {
34
- source: { type: string; config: SourceConfig };
35
- slowSmaPeriod: number;
36
- fastSmaPeriod: number | undefined;
37
- minBarsForConfirmation: number;
38
- macdFastPeriod: number;
39
- macdSlowPeriod: number;
40
- macdSignalPeriod: number;
41
- macdMinHist: number;
42
- trendFilter: boolean;
43
- trendFilterMinBars: number;
44
- momentumGateEnabled: boolean;
45
- momentumGateMinBars: number;
46
- momentumGateRsiZone: number;
47
- fastSmaCommitmentBars: number;
48
- priceRegimeGate: boolean;
49
- priceRegimeMinDistancePct: number;
50
- rsiPeriod: number;
51
- interpConfirmBars: number;
52
- interpHoldBars: number;
53
- rsiZone: number;
54
- rsiExtreme: number;
55
- chartFile: string;
56
- quiet: boolean;
57
- listBots: boolean;
58
- }
59
-
60
- interface PriceSource {
61
- name: string;
62
- fetchCandles(): Promise<any[]>;
63
- extractMarketPrice(candle: any): { marketPrice: any; timestamp: any };
64
- }
65
-
66
- function parseArgs(): CliConfig {
67
- const args = process.argv.slice(2);
68
- const config: CliConfig = {
69
- source: { type: 'market_adapter', config: { botKey: '' } },
70
- slowSmaPeriod: 500,
71
- fastSmaPeriod: undefined,
72
- minBarsForConfirmation: 3,
73
- macdFastPeriod: 12,
74
- macdSlowPeriod: 26,
75
- macdSignalPeriod: 9,
76
- macdMinHist: 0.02,
77
- trendFilter: false,
78
- trendFilterMinBars: 3,
79
- momentumGateEnabled: false,
80
- momentumGateMinBars: 3,
81
- momentumGateRsiZone: 35,
82
- fastSmaCommitmentBars: 2,
83
- priceRegimeGate: true,
84
- priceRegimeMinDistancePct: 0.35,
85
- rsiPeriod: 14,
86
- interpConfirmBars: 3,
87
- interpHoldBars: 3,
88
- rsiZone: 10,
89
- rsiExtreme: 90,
90
- chartFile: path.join(PATHS.ANALYSIS.CHARTS_DIR, 'derivative_chart.html'),
91
- quiet: false,
92
- listBots: false,
93
- };
94
-
95
- for (let i = 0; i < args.length; i++) {
96
- const arg = args[i];
97
- if (arg === '--source') config.source.type = args[++i];
98
- else if (arg === '--bot-key') config.source.config.botKey = args[++i];
99
- else if (arg === '--file') { config.source.config.filePath = args[++i]; config.source.type = 'json'; }
100
- else if (arg === '--sma') config.slowSmaPeriod = parseInt(args[++i]);
101
- else if (arg === '--fast-sma') config.fastSmaPeriod = parseInt(args[++i]);
102
- else if (arg === '--confirm') config.minBarsForConfirmation = parseInt(args[++i]);
103
- else if (arg === '--macd-fast') { config.macdFastPeriod = parseInt(args[++i]); }
104
- else if (arg === '--macd-slow') { config.macdSlowPeriod = parseInt(args[++i]); }
105
- else if (arg === '--macd-signal'){ config.macdSignalPeriod = parseInt(args[++i]); }
106
- else if (arg === '--macd-min-hist') { config.macdMinHist = parseFloat(args[++i]); }
107
- else if (arg === '--rsi') { const v = parseInt(args[i + 1]); if (!isNaN(v)) { config.rsiPeriod = v; i++; } }
108
- else if (arg === '--interp-confirm') config.interpConfirmBars = parseInt(args[++i]);
109
- else if (arg === '--interp-hold') config.interpHoldBars = parseInt(args[++i]);
110
- else if (arg === '--rsi-zone') config.rsiZone = parseFloat(args[++i]);
111
- else if (arg === '--rsi-extreme') config.rsiExtreme = parseFloat(args[++i]);
112
- else if (arg === '--trend-filter') config.trendFilter = true;
113
- else if (arg === '--trend-filter-min-bars') config.trendFilterMinBars = parseInt(args[++i]);
114
- else if (arg === '--momentum-gate') config.momentumGateEnabled = true;
115
- else if (arg === '--momentum-gate-bars') config.momentumGateMinBars = parseInt(args[++i]);
116
- else if (arg === '--momentum-gate-rsi-zone') config.momentumGateRsiZone = parseFloat(args[++i]);
117
- else if (arg === '--fast-sma-commitment-bars') config.fastSmaCommitmentBars = parseInt(args[++i]);
118
- else if (arg === '--no-price-regime-gate') config.priceRegimeGate = false;
119
- else if (arg === '--price-regime-buffer-pct') config.priceRegimeMinDistancePct = parseFloat(args[++i]);
120
- else if (arg === '--chart') config.chartFile = args[++i];
121
- else if (arg === '--list-bots') config.listBots = true;
122
- else if (arg === '--quiet') config.quiet = true;
123
- else if (arg === '--help' || arg === '-h') { showHelp(); process.exit(0); }
124
- }
125
-
126
- return config;
127
- }
128
-
129
- function showHelp() {
130
- console.log(`
131
- Derivative Trend Analysis
132
-
133
- Analyzes candle data using SMA, MACD, and RSI as trend signals.
134
- Generates an interactive HTML chart.
135
-
136
- Usage:
137
- node dist/analysis/analyze_derivatives.js \\
138
- --source <type> \\
139
- [--bot-key KEY] [--file PATH]
140
-
141
- Sources:
142
- market_adapter Use market_adapter state (default) --bot-key KEY
143
- json JSON candles file --file path/to/file.json
144
-
145
- Analyzer options:
146
- Core indicators:
147
- --sma N SMA period (default 500)
148
- --fast-sma N Fast SMA period (optional, enables trend filter source + fast-SMA commitment)
149
- --macd-fast N MACD fast period (default 12)
150
- --macd-slow N MACD slow period (default 26)
151
- --macd-signal N MACD signal period (default 9)
152
- --macd-min-hist N MACD histogram/line threshold (default 0.02)
153
- --rsi [N] RSI period (default 14)
154
- --rsi-zone N RSI bull/bear zone offset from 50 (default 10)
155
- --rsi-extreme N RSI extreme threshold (default 90)
156
-
157
- Confirmation and hysteresis:
158
- --confirm N Bars required for confirmation (default 3)
159
- --interp-confirm N Bars required to confirm BULL/BEAR (default 3)
160
- --interp-hold N Bars to hold confirmed BULL/BEAR downgrades (default 3)
161
-
162
- Trend filters and gates:
163
- --trend-filter Enable derivative trend filter
164
- --trend-filter-min-bars N Sustained bars for trend filter (default 3)
165
- --momentum-gate Enable MACD+RSI recovery gate
166
- --momentum-gate-bars N Momentum gate persistence (default 3)
167
- --momentum-gate-rsi-zone N RSI divergence threshold (default 35)
168
- --fast-sma-commitment-bars N Consecutive bars price must stay beyond fastSMA (default 2)
169
- --no-price-regime-gate Disable slow-SMA macro regime gate
170
- --price-regime-buffer-pct N Required slow-SMA clearance in % (default 0.35)
171
-
172
- Source input:
173
- --source <type> Data source (default market_adapter)
174
- --bot-key KEY Market adapter bot key (required)
175
- --file PATH JSON candle input
176
-
177
- Output:
178
- --chart FILE Chart output path (default: <analysis charts dir>/derivative_chart.html)
179
- --list-bots List available bot keys from bots.json
180
- --quiet Suppress log output
181
- `);
182
- }
183
-
184
- async function analyze(source: PriceSource, config: CliConfig): Promise<{
185
- config: {
186
- source: string;
187
- slowSmaPeriod: number;
188
- fastSmaPeriod: number | undefined;
189
- macdFastPeriod: number;
190
- macdSlowPeriod: number;
191
- macdSignalPeriod: number;
192
- macdMinHist: number;
193
- trendFilter: boolean;
194
- trendFilterMinBars: number;
195
- momentumGateEnabled: boolean;
196
- momentumGateMinBars: number;
197
- momentumGateRsiZone: number;
198
- fastSmaCommitmentBars: number;
199
- priceRegimeGate: boolean;
200
- priceRegimeMinDistancePct: number;
201
- rsiPeriod: number;
202
- interpConfirmBars: number;
203
- interpHoldBars: number;
204
- rsiZone: number;
205
- rsiExtreme: number;
206
- minBarsForConfirmation: number;
207
- };
208
- allResults: any[];
209
- lastAnalysis: any;
210
- }> {
211
- if (!config.quiet) console.log(`[Derivatives] Loading candles from ${source.name}...`);
212
-
213
- const candles = await source.fetchCandles();
214
- if (!Array.isArray(candles) || candles.length === 0) {
215
- throw new Error('No candles returned from source');
216
- }
217
- if (!config.quiet) console.log(`[Derivatives] Loaded ${candles.length} candles`);
218
-
219
- const analyzer = new DerivativeAnalyzer({
220
- slowSmaPeriod: config.slowSmaPeriod,
221
- fastSmaPeriod: config.fastSmaPeriod,
222
- macdFastPeriod: config.macdFastPeriod,
223
- macdSlowPeriod: config.macdSlowPeriod,
224
- macdSignalPeriod: config.macdSignalPeriod,
225
- macdMinHist: config.macdMinHist,
226
- trendFilterEnabled: config.trendFilter,
227
- trendFilterMinBars: config.trendFilterMinBars,
228
- momentumGateEnabled: config.momentumGateEnabled,
229
- momentumGateMinBars: config.momentumGateMinBars,
230
- momentumGateRsiZone: config.momentumGateRsiZone,
231
- fastSmaCommitmentBars: config.fastSmaCommitmentBars,
232
- priceRegimeGateEnabled: config.priceRegimeGate,
233
- priceRegimeMinDistancePct: config.priceRegimeMinDistancePct,
234
- rsiPeriod: config.rsiPeriod,
235
- interpConfirmBars: config.interpConfirmBars,
236
- interpHoldBars: config.interpHoldBars,
237
- rsiBullThreshold: 50 + config.rsiZone,
238
- rsiBearThreshold: 50 - config.rsiZone,
239
- rsiOverboughtLevel: config.rsiExtreme,
240
- rsiOversoldLevel: 100 - config.rsiExtreme,
241
- minBarsForConfirmation: config.minBarsForConfirmation,
242
- });
243
-
244
- const allResults: any[] = [];
245
- for (let i = 0; i < candles.length; i++) {
246
- const { marketPrice, timestamp } = source.extractMarketPrice(candles[i]);
247
- try {
248
- allResults.push(analyzer.update(marketPrice, timestamp));
249
- } catch (err: unknown) {
250
- throw new Error(`Failed at candle ${i}: ${(err as any)?.message ?? err}`);
251
- }
252
- }
253
-
254
- const last = allResults[allResults.length - 1];
255
- if (!config.quiet) {
256
- const parts: string[] = [];
257
- if (config.slowSmaPeriod) parts.push(`SMA(${config.slowSmaPeriod}): ${last.smaRawTrend} (${last.smaBarsInTrend} bars)`);
258
- if (config.fastSmaPeriod) parts.push(`fastSMA(${config.fastSmaPeriod}): ${last.fastSmaRawTrend} (${last.fastSmaBarsInTrend} bars)`);
259
- parts.push(`MACD: ${last.macdTrend} hist=${last.macdHistogram}`);
260
- parts.push(`RSI(${config.rsiPeriod}): ${last.rsi !== null ? last.rsi.toFixed(1) : 'n/a'} [${last.rsiZone}]`);
261
- console.log(`[Derivatives] Done — ${last.isReady ? '' : '(warming up) '}${parts.join(' ')}`);
262
- }
263
-
264
- return {
265
- config: {
266
- source: source.name,
267
- slowSmaPeriod: config.slowSmaPeriod,
268
- fastSmaPeriod: config.fastSmaPeriod,
269
- macdFastPeriod: config.macdFastPeriod,
270
- macdSlowPeriod: config.macdSlowPeriod,
271
- macdSignalPeriod: config.macdSignalPeriod,
272
- macdMinHist: config.macdMinHist,
273
- trendFilter: config.trendFilter,
274
- trendFilterMinBars: config.trendFilterMinBars,
275
- momentumGateEnabled: config.momentumGateEnabled,
276
- momentumGateMinBars: config.momentumGateMinBars,
277
- momentumGateRsiZone: config.momentumGateRsiZone,
278
- fastSmaCommitmentBars: config.fastSmaCommitmentBars,
279
- priceRegimeGate: config.priceRegimeGate,
280
- priceRegimeMinDistancePct: config.priceRegimeMinDistancePct,
281
- rsiPeriod: config.rsiPeriod,
282
- interpConfirmBars: config.interpConfirmBars,
283
- interpHoldBars: config.interpHoldBars,
284
- rsiZone: config.rsiZone,
285
- rsiExtreme: config.rsiExtreme,
286
- minBarsForConfirmation: config.minBarsForConfirmation,
287
- },
288
- allResults,
289
- lastAnalysis: last,
290
- };
291
- }
292
-
293
- async function main(): Promise<void> {
294
- const config = parseArgs();
295
-
296
- try {
297
- if (config.listBots) {
298
- listAvailableBots();
299
- return;
300
- }
301
-
302
- const { source } = resolveSource({ ...config.source.config, type: config.source.type }, { quiet: config.quiet });
303
- const report = await analyze(source, config);
304
-
305
- const html = generateHTML(report, 'Derivative Trend Analysis');
306
- writeChartFile(config.chartFile, html);
307
-
308
- if (!config.quiet) console.log(`[Derivatives] ✓ Chart saved to ${config.chartFile}`);
309
- } catch (err: unknown) {
310
- console.error(`[Derivatives] Error: ${(err as any)?.message ?? err}`);
311
- process.exit(1);
312
- }
313
- }
314
-
315
- if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
316
- main().catch((err: unknown) => { console.error(err); process.exit(1); });
317
- }
318
-
319
- export { analyze }
320
-