dexbot 1.6.4 → 1.6.6

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 (240) hide show
  1. package/CHANGELOG.md +75 -3
  2. package/README.md +109 -40
  3. package/analysis/README.md +19 -17
  4. package/analysis/account_resolver.ts +1 -11
  5. package/analysis/analyze_dynamic_weight.ts +9 -3
  6. package/analysis/bot_usage/kibana_bot_queries.ts +1 -1
  7. package/analysis/chain_pool.ts +1 -1
  8. package/analysis/fills_source.ts +0 -6
  9. package/analysis/grid_correction_check.ts +20 -26
  10. package/analysis/resolve_source.ts +1 -1
  11. package/analysis/trade_profitability.ts +2 -5
  12. package/analysis/tradingview/analyze_tradingview.ts +5 -0
  13. package/analysis/tradingview/tradingview_uplot_chart_generator.ts +2 -2
  14. package/analysis/trend_detection/DYNAMIC_WEIGHT_RESEARCH.md +35 -2
  15. package/analysis/trend_detection/README.md +1 -3
  16. package/analysis/trend_detection/dynamic_weight_chart_generator.ts +82 -10
  17. package/analysis/trend_detection/package.json +1 -1
  18. package/claw/modules/dexbot_profiles.ts +4 -3
  19. package/claw/package.json +1 -1
  20. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  21. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  22. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  23. package/claw/tests/test_dexbot_profiles.ts +18 -1
  24. package/dist/analysis/account_resolver.d.ts +1 -4
  25. package/dist/analysis/account_resolver.d.ts.map +1 -1
  26. package/dist/analysis/account_resolver.js +1 -1
  27. package/dist/analysis/account_resolver.js.map +1 -1
  28. package/dist/analysis/analyze_dynamic_weight.js +9 -3
  29. package/dist/analysis/analyze_dynamic_weight.js.map +1 -1
  30. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +1 -2
  31. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
  32. package/dist/analysis/bot_usage/kibana_bot_queries.js +1 -1
  33. package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -1
  34. package/dist/analysis/chain_pool.d.ts +1 -3
  35. package/dist/analysis/chain_pool.d.ts.map +1 -1
  36. package/dist/analysis/chain_pool.js +1 -1
  37. package/dist/analysis/chain_pool.js.map +1 -1
  38. package/dist/analysis/fills_source.d.ts +1 -51
  39. package/dist/analysis/fills_source.d.ts.map +1 -1
  40. package/dist/analysis/fills_source.js +1 -1
  41. package/dist/analysis/fills_source.js.map +1 -1
  42. package/dist/analysis/grid_correction_check.d.ts +2 -3
  43. package/dist/analysis/grid_correction_check.d.ts.map +1 -1
  44. package/dist/analysis/grid_correction_check.js +18 -26
  45. package/dist/analysis/grid_correction_check.js.map +1 -1
  46. package/dist/analysis/resolve_source.d.ts +1 -1
  47. package/dist/analysis/resolve_source.d.ts.map +1 -1
  48. package/dist/analysis/trade_profitability.d.ts.map +1 -1
  49. package/dist/analysis/trade_profitability.js +2 -7
  50. package/dist/analysis/trade_profitability.js.map +1 -1
  51. package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -1
  52. package/dist/analysis/tradingview/analyze_tradingview.js +5 -0
  53. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
  54. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +2 -2
  55. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.d.ts.map +1 -1
  56. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js +82 -10
  57. package/dist/analysis/trend_detection/dynamic_weight_chart_generator.js.map +1 -1
  58. package/dist/dexbot.d.ts.map +1 -1
  59. package/dist/dexbot.js +85 -140
  60. package/dist/dexbot.js.map +1 -1
  61. package/dist/market_adapter/core/asymmetric_bounds.d.ts +2 -2
  62. package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -1
  63. package/dist/market_adapter/core/asymmetric_bounds.js +15 -12
  64. package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -1
  65. package/dist/market_adapter/core/kibana_candles.d.ts +1 -15
  66. package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -1
  67. package/dist/market_adapter/core/kibana_candles.js +1 -1
  68. package/dist/market_adapter/core/kibana_candles.js.map +1 -1
  69. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +1 -35
  70. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  71. package/dist/market_adapter/inputs/fetch_lp_data.js +10 -54
  72. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  73. package/dist/market_adapter/inputs/kibana_feed_source.d.ts +1 -8
  74. package/dist/market_adapter/inputs/kibana_feed_source.d.ts.map +1 -1
  75. package/dist/market_adapter/inputs/kibana_feed_source.js +1 -1
  76. package/dist/market_adapter/inputs/kibana_feed_source.js.map +1 -1
  77. package/dist/market_adapter/inputs/window_cache.d.ts +2 -63
  78. package/dist/market_adapter/inputs/window_cache.d.ts.map +1 -1
  79. package/dist/market_adapter/inputs/window_cache.js +22 -102
  80. package/dist/market_adapter/inputs/window_cache.js.map +1 -1
  81. package/dist/market_adapter/interval_utils.d.ts +1 -1
  82. package/dist/market_adapter/interval_utils.js +1 -1
  83. package/dist/modules/account_bots.d.ts +70 -6
  84. package/dist/modules/account_bots.d.ts.map +1 -1
  85. package/dist/modules/account_bots.js +353 -149
  86. package/dist/modules/account_bots.js.map +1 -1
  87. package/dist/modules/bitshares-native/crypto/ecc.browser.d.ts.map +1 -1
  88. package/dist/modules/bitshares-native/crypto/ecc.browser.js +0 -31
  89. package/dist/modules/bitshares-native/crypto/ecc.browser.js.map +1 -1
  90. package/dist/modules/bot_defaults.d.ts +98 -0
  91. package/dist/modules/bot_defaults.d.ts.map +1 -0
  92. package/dist/modules/bot_defaults.js +169 -0
  93. package/dist/modules/bot_defaults.js.map +1 -0
  94. package/dist/modules/bot_settings.d.ts.map +1 -1
  95. package/dist/modules/bot_settings.js +4 -1
  96. package/dist/modules/bot_settings.js.map +1 -1
  97. package/dist/modules/config.d.ts +1 -0
  98. package/dist/modules/config.d.ts.map +1 -1
  99. package/dist/modules/config.js +1 -0
  100. package/dist/modules/config.js.map +1 -1
  101. package/dist/modules/constants.d.ts +11 -2
  102. package/dist/modules/constants.d.ts.map +1 -1
  103. package/dist/modules/constants.js +40 -27
  104. package/dist/modules/constants.js.map +1 -1
  105. package/dist/modules/credit_runtime.d.ts +0 -2
  106. package/dist/modules/credit_runtime.d.ts.map +1 -1
  107. package/dist/modules/credit_runtime.js +1 -10
  108. package/dist/modules/credit_runtime.js.map +1 -1
  109. package/dist/modules/dexbot_class.d.ts +13 -10
  110. package/dist/modules/dexbot_class.d.ts.map +1 -1
  111. package/dist/modules/dexbot_class.js +0 -9
  112. package/dist/modules/dexbot_class.js.map +1 -1
  113. package/dist/modules/dexbot_cow_runtime.d.ts +13 -0
  114. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  115. package/dist/modules/dexbot_cow_runtime.js +13 -1
  116. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  117. package/dist/modules/dexbot_maintenance_runtime.d.ts +1 -1
  118. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  119. package/dist/modules/dexbot_maintenance_runtime.js +9 -4
  120. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  121. package/dist/modules/launcher/adapter_requirement.js +1 -1
  122. package/dist/modules/launcher/launch_modes.d.ts +17 -1
  123. package/dist/modules/launcher/launch_modes.d.ts.map +1 -1
  124. package/dist/modules/launcher/launch_modes.js +18 -1
  125. package/dist/modules/launcher/launch_modes.js.map +1 -1
  126. package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -1
  127. package/dist/modules/launcher/monolithic_runtime.js +8 -1
  128. package/dist/modules/launcher/monolithic_runtime.js.map +1 -1
  129. package/dist/modules/market_adapter_whitelist.d.ts +40 -1
  130. package/dist/modules/market_adapter_whitelist.d.ts.map +1 -1
  131. package/dist/modules/market_adapter_whitelist.js +161 -11
  132. package/dist/modules/market_adapter_whitelist.js.map +1 -1
  133. package/dist/modules/order/accounting.d.ts +4 -18
  134. package/dist/modules/order/accounting.d.ts.map +1 -1
  135. package/dist/modules/order/accounting.js +4 -34
  136. package/dist/modules/order/accounting.js.map +1 -1
  137. package/dist/modules/order/export.d.ts +9 -12
  138. package/dist/modules/order/export.d.ts.map +1 -1
  139. package/dist/modules/order/export.js +9 -12
  140. package/dist/modules/order/export.js.map +1 -1
  141. package/dist/modules/order/grid.d.ts +44 -40
  142. package/dist/modules/order/grid.d.ts.map +1 -1
  143. package/dist/modules/order/grid.js +66 -48
  144. package/dist/modules/order/grid.js.map +1 -1
  145. package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
  146. package/dist/modules/order/grid_reconcile.js +111 -20
  147. package/dist/modules/order/grid_reconcile.js.map +1 -1
  148. package/dist/modules/order/grid_reconcile_internal.d.ts +5 -3
  149. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  150. package/dist/modules/order/grid_reconcile_internal.js +18 -3
  151. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  152. package/dist/modules/order/manager.d.ts +0 -8
  153. package/dist/modules/order/manager.d.ts.map +1 -1
  154. package/dist/modules/order/manager.js +3 -12
  155. package/dist/modules/order/manager.js.map +1 -1
  156. package/dist/modules/order/utils/order.d.ts +22 -7
  157. package/dist/modules/order/utils/order.d.ts.map +1 -1
  158. package/dist/modules/order/utils/order.js +103 -21
  159. package/dist/modules/order/utils/order.js.map +1 -1
  160. package/dist/modules/order/utils/system.d.ts +5 -1
  161. package/dist/modules/order/utils/system.d.ts.map +1 -1
  162. package/dist/modules/order/utils/system.js +5 -2
  163. package/dist/modules/order/utils/system.js.map +1 -1
  164. package/dist/modules/order/utils/withPoolRef.d.ts +12 -0
  165. package/dist/modules/order/utils/withPoolRef.d.ts.map +1 -1
  166. package/dist/modules/order/utils/withPoolRef.js +17 -0
  167. package/dist/modules/order/utils/withPoolRef.js.map +1 -1
  168. package/dist/modules/order/working_grid.d.ts +8 -13
  169. package/dist/modules/order/working_grid.d.ts.map +1 -1
  170. package/dist/modules/order/working_grid.js +8 -29
  171. package/dist/modules/order/working_grid.js.map +1 -1
  172. package/dist/modules/settings_merge.d.ts +10 -1
  173. package/dist/modules/settings_merge.d.ts.map +1 -1
  174. package/dist/modules/settings_merge.js +27 -17
  175. package/dist/modules/settings_merge.js.map +1 -1
  176. package/dist/modules/validate_profiles.d.ts.map +1 -1
  177. package/dist/modules/validate_profiles.js +4 -3
  178. package/dist/modules/validate_profiles.js.map +1 -1
  179. package/dist/scripts/chart_command.d.ts +48 -0
  180. package/dist/scripts/chart_command.d.ts.map +1 -0
  181. package/dist/scripts/chart_command.js +504 -0
  182. package/dist/scripts/chart_command.js.map +1 -0
  183. package/dist/scripts/dw.d.ts +3 -0
  184. package/dist/scripts/dw.d.ts.map +1 -0
  185. package/dist/scripts/dw.js +30 -0
  186. package/dist/scripts/dw.js.map +1 -0
  187. package/dist/scripts/sync-version.js +0 -22
  188. package/dist/scripts/sync-version.js.map +1 -1
  189. package/dist/scripts/tv.d.ts +1 -31
  190. package/dist/scripts/tv.d.ts.map +1 -1
  191. package/dist/scripts/tv.js +10 -463
  192. package/dist/scripts/tv.js.map +1 -1
  193. package/dist/scripts/update.js +99 -62
  194. package/dist/scripts/update.js.map +1 -1
  195. package/dist/scripts/update_dist_freshness.d.ts +58 -0
  196. package/dist/scripts/update_dist_freshness.d.ts.map +1 -0
  197. package/dist/scripts/update_dist_freshness.js +144 -0
  198. package/dist/scripts/update_dist_freshness.js.map +1 -0
  199. package/dist/unlock.js +1 -1
  200. package/dist/unlock.js.map +1 -1
  201. package/docs/BITSHARES_ONBOARDING.md +16 -10
  202. package/docs/COW_INVARIANTS.md +1 -0
  203. package/docs/DEXBOT_COMPARISON.md +11 -11
  204. package/docs/EVOLUTION.md +9 -7
  205. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +4 -4
  206. package/docs/GRID_PRICE_INVARIANT.md +518 -0
  207. package/docs/GRID_RECALCULATION.md +20 -24
  208. package/docs/GRID_RECONCILE.md +62 -41
  209. package/docs/LOGGING.md +1 -0
  210. package/docs/ORDER_ENGINE_POST_1.0_RETROSPECTIVE.md +556 -0
  211. package/docs/README.md +18 -18
  212. package/docs/WORKFLOW.md +13 -8
  213. package/docs/architecture.md +42 -40
  214. package/docs/developer_guide.md +5 -8
  215. package/market_adapter/README.md +45 -65
  216. package/modules/README.md +3 -2
  217. package/package.json +7 -4
  218. package/scripts/README.md +18 -34
  219. package/scripts/reset-settings.sh +1 -1
  220. package/analysis/ama_fitting/package.json +0 -12
  221. package/analysis/analyze_derivatives.ts +0 -320
  222. package/analysis/derivative_chart_generator.ts +0 -874
  223. package/analysis/trend_detection/SIGNAL_DOCUMENTATION.md +0 -403
  224. package/analysis/trend_detection/derivative_analyzer.ts +0 -1059
  225. package/dist/analysis/analyze_derivatives.d.ts +0 -68
  226. package/dist/analysis/analyze_derivatives.d.ts.map +0 -1
  227. package/dist/analysis/analyze_derivatives.js +0 -287
  228. package/dist/analysis/analyze_derivatives.js.map +0 -1
  229. package/dist/analysis/derivative_chart_generator.d.ts +0 -12
  230. package/dist/analysis/derivative_chart_generator.d.ts.map +0 -1
  231. package/dist/analysis/derivative_chart_generator.js +0 -891
  232. package/dist/analysis/derivative_chart_generator.js.map +0 -1
  233. package/dist/analysis/trend_detection/derivative_analyzer.d.ts +0 -248
  234. package/dist/analysis/trend_detection/derivative_analyzer.d.ts.map +0 -1
  235. package/dist/analysis/trend_detection/derivative_analyzer.js +0 -910
  236. package/dist/analysis/trend_detection/derivative_analyzer.js.map +0 -1
  237. package/dist/scripts/generate_market_adapter_whitelist.d.ts +0 -15
  238. package/dist/scripts/generate_market_adapter_whitelist.d.ts.map +0 -1
  239. package/dist/scripts/generate_market_adapter_whitelist.js +0 -191
  240. package/dist/scripts/generate_market_adapter_whitelist.js.map +0 -1
@@ -4,479 +4,26 @@
4
4
  * Usage:
5
5
  * dexbot tv <bot|pool-id|AssetA/AssetB> [--month N] [--chart <path>] [--feed|--pool|--book]
6
6
  *
7
- * - 1h candles, N months of history (default 3).
8
- * - Target resolution (default: pool-first, orderbook fallback when no pool):
7
+ * Thin entry for the shared chart-command pipeline in scripts/chart_command.ts
8
+ * (identical fetch/target logic as `dexbot dw`). This command renders through
9
+ * the TradingView exporter (analysis/tradingview/analyze_tradingview.js):
10
+ * 1h candles, N months of history (default 3), bot charts pick up the AMA +
11
+ * order overlay from profiles/orders/<botKey>.json automatically.
12
+ *
13
+ * Target resolution (default: pool-first, orderbook fallback when no pool):
9
14
  * - bot name/key from profiles/bots.json
10
15
  * - pool id (e.g. 133 or 1.19.133, always LP pool candles)
11
16
  * - AssetA/AssetB symbols; MPA pairs (e.g. BTS/HONEST.USD) can opt into
12
17
  * the on-chain price-feed history with --feed.
13
- *
14
- * This script ONLY pulls fresh candle data and writes it to a temp JSON file.
15
- * Rendering (chart HTML, AMA overlay like the exporter, auto chart path + print)
16
- * is delegated to the existing analyzer at analysis/tradingview/analyze_tradingview.js.
17
18
  */
18
- import fs from 'node:fs';
19
- import os from 'node:os';
20
- import path from 'node:path';
21
- import { spawnSync } from 'node:child_process';
22
- import { fileURLToPath, pathToFileURL } from 'node:url';
23
- const __filename = fileURLToPath(import.meta.url);
24
- const __dirname = path.dirname(__filename);
25
- import { loadBotMeta, resolveAmaConfig, loadBotSettings, computeBotKey } from '../analysis/bot_key_utils.js';
26
- import { PATHS } from '../modules/paths.js';
27
- import { normalizePoolId, resolveAsset, findPoolByAssets } from '../market_adapter/utils/chain.js';
28
- import { fetchCandlesSequentially, outputPath } from '../market_adapter/inputs/fetch_lp_data.js';
29
- import { fetchMarketCandlesSequentially } from '../market_adapter/inputs/fetch_book_data.js';
30
- import { fetchFeedCandlesSequentially } from '../market_adapter/inputs/kibana_feed_source.js';
19
+ import { pathToFileURL } from 'node:url';
31
20
  import { getErrorMessage } from '../modules/utils/errors.js';
32
- import { muteChainLogs } from '../modules/utils/chain_logs.js';
33
- import { isSameBotName, sanitizeKey } from '../modules/utils/sanitize_key.js';
34
- import { slugPart } from '../market_adapter/interval_utils.js';
35
- const INTERVAL_SECONDS = 3600;
36
- const DEFAULT_MONTHS = 3;
37
- // Explicit --feed warns when the settlement feed is older than this
38
- // (a stale feed draws a flat/misleading chart). Default: 7 days.
39
- const FEED_STALE_WARN_AGE_MS = 7 * 24 * 3600 * 1000;
40
- const HOURS_PER_MONTH = 730;
41
- function printUsage() {
42
- console.log('Usage: dexbot tv <bot|pool-id|AssetA/AssetB> [--month N] [--chart <path>] [--feed|--pool|--book]');
43
- console.log('');
44
- console.log(' <bot> Bot name or key from profiles/bots.json (AMA overlay like the exporter)');
45
- console.log(' <pool-id> Liquidity pool id, e.g. 133 or 1.19.133 (always pool candles)');
46
- console.log(' AssetA/AssetB Pair symbols, e.g. TOKENA/TOKENB (pool-first, orderbook fallback)');
47
- console.log(' MPA pairs (e.g. BTS/HONEST.USD) can chart price-feed history via --feed');
48
- console.log('');
49
- console.log('Options:');
50
- console.log(` --month N Months of 1h history (default ${DEFAULT_MONTHS})`);
51
- console.log(' --months N Alias for --month');
52
- console.log(' --chart <path> Override auto output path');
53
- console.log(' --feed Price-feed candles (MPA pairs; BTS/MPA or MPA/MPA cross)');
54
- console.log(' --pool Force LP pool candles (errors when the pair has no pool)');
55
- console.log(' --book Force order-book fill candles (--orderbook is an alias)');
56
- }
57
- async function resolveMpaBacking(mpaSymbol, bitsharesClient) {
58
- const db = bitsharesClient.BitShares?.db;
59
- if (!db || typeof db.lookup_asset_symbols !== 'function')
60
- return null;
61
- let mpa = null;
62
- try {
63
- const found = await db.lookup_asset_symbols([mpaSymbol]);
64
- mpa = found?.[0] || null;
65
- }
66
- catch (_) {
67
- return null;
68
- }
69
- if (!mpa?.id || !mpa.bitasset_data_id)
70
- return null;
71
- try {
72
- const objs = await db.get_objects([mpa.bitasset_data_id]);
73
- const bitasset = Array.isArray(objs) ? objs[0] : objs;
74
- const backingId = String(bitasset?.options?.short_backing_asset || '');
75
- if (!backingId)
76
- return null;
77
- const metas = typeof db.get_assets === 'function' ? await db.get_assets([backingId]) : null;
78
- const list = Array.isArray(metas) ? metas.flat(Infinity) : [];
79
- const backing = list.find((a) => String(a?.id) === backingId) || null;
80
- if (!backing?.id || !Number.isFinite(Number(backing.precision)))
81
- return null;
82
- return {
83
- mpa: { id: String(mpa.id), precision: Number(mpa.precision), symbol: mpaSymbol },
84
- backing: { id: String(backing.id), precision: Number(backing.precision), symbol: String(backing.symbol || backingId) },
85
- isPredictionMarket: bitasset?.options?.is_prediction_market === true,
86
- feedPublicationTime: typeof bitasset?.current_feed_publication_time === 'string' ? bitasset.current_feed_publication_time : null,
87
- };
88
- }
89
- catch (_) {
90
- return null;
91
- }
92
- }
93
- async function pickFeedContext(symA, symB, source, bitsharesClient) {
94
- // Feed candles are strictly opt-in (--feed). All other modes chart
95
- // tradeable market candles (pool-first, orderbook fallback) without
96
- // touching the chain for MPA detection.
97
- if (source !== 'feed')
98
- return null;
99
- const ctxA = await resolveMpaBacking(symA, bitsharesClient);
100
- const ctxB = await resolveMpaBacking(symB, bitsharesClient);
101
- const legs = [ctxA, ctxB].filter(Boolean);
102
- if (legs.length === 0)
103
- throw new Error(`--feed requires an MPA pair, got ${symA}/${symB}`);
104
- // Prediction markets are bitassets too, but their "feed" is a binary
105
- // settlement outcome, not a price series — never chart it as one.
106
- for (const leg of legs) {
107
- if (leg.isPredictionMarket)
108
- throw new Error(`--feed cannot chart ${leg.mpa.symbol}: prediction-market feeds are settlement outcomes, not prices`);
109
- }
110
- if (legs.length === 2) {
111
- if (String(legs[0].backing.id) !== String(legs[1].backing.id)) {
112
- throw new Error(`--feed cannot cross ${legs[0].mpa.symbol}/${legs[1].mpa.symbol}: different backing assets (${legs[0].backing.symbol} vs ${legs[1].backing.symbol})`);
113
- }
114
- return { kind: 'cross', legs };
115
- }
116
- return { kind: 'single', legs };
117
- }
118
- function feedAgeMs(ctx, nowMs = Date.now()) {
119
- if (!ctx?.feedPublicationTime)
120
- return null;
121
- const ts = Date.parse(ctx.feedPublicationTime.endsWith('Z') ? ctx.feedPublicationTime : `${ctx.feedPublicationTime}Z`);
122
- if (!Number.isFinite(ts))
123
- return null;
124
- return nowMs - ts;
125
- }
126
- function feedName(feedCtx) {
127
- if (feedCtx.kind === 'cross')
128
- return `${feedCtx.legs[0].mpa.symbol}/${feedCtx.legs[1].mpa.symbol}`;
129
- return feedCtx.legs[0].mpa.symbol;
130
- }
131
- async function activateFeedIfCovered(symA, symB, assetA, assetB, source, bitsharesClient) {
132
- const ctx = await pickFeedContext(symA, symB, source, bitsharesClient);
133
- if (!ctx)
134
- return null;
135
- const ids = [String(assetA?.id || ''), String(assetB?.id || '')];
136
- if (ctx.kind === 'cross') {
137
- const covered = ids.includes(String(ctx.legs[0].mpa.id)) && ids.includes(String(ctx.legs[1].mpa.id));
138
- if (!covered) {
139
- throw new Error(`--feed cannot price ${assetA?.symbol || ''}/${assetB?.symbol || ''}: the cross feed covers ${feedName(ctx)} only`);
140
- }
141
- }
142
- else if (!ids.includes(String(ctx.legs[0].mpa.id)) || !ids.includes(String(ctx.legs[0].backing.id))) {
143
- throw new Error(`--feed cannot price ${assetA?.symbol || ''}/${assetB?.symbol || ''}: the ${ctx.legs[0].mpa.symbol} feed covers ${ctx.legs[0].backing.symbol}/${ctx.legs[0].mpa.symbol} only`);
144
- }
145
- // A stale settlement price draws a flat/misleading chart. Explicit
146
- // --feed still charts it on request, but says so out loud.
147
- // For a cross, the stalest leg gates the warning.
148
- const ages = ctx.legs.map((leg) => feedAgeMs(leg));
149
- const known = ages.filter((a) => a != null);
150
- const worst = known.length === ages.length && known.length > 0 ? Math.max(...known) : null;
151
- if (worst == null || worst > FEED_STALE_WARN_AGE_MS) {
152
- const ageLabel = worst == null ? 'unknown age' : `${Math.round(worst / 86400000)}d old`;
153
- console.warn(`[tv] Warning: ${feedName(ctx)} feed is stale (${ageLabel}); charting it anyway by explicit request`);
154
- }
155
- return ctx;
156
- }
157
- function parseArgs(argv) {
158
- let target = null;
159
- let months = DEFAULT_MONTHS;
160
- let chart = null;
161
- let source = 'auto';
162
- let help = false;
163
- for (let i = 0; i < argv.length; i++) {
164
- const arg = argv[i];
165
- if (arg === '-h' || arg === '--help')
166
- help = true;
167
- else if (arg === '--month' || arg === '--months') {
168
- const raw = argv[++i];
169
- const n = Number(raw);
170
- if (!Number.isFinite(n) || n <= 0)
171
- throw new Error(`--month: invalid value "${raw}" (expected positive months, e.g. --month 6)`);
172
- months = n;
173
- }
174
- else if (arg.startsWith('--month=')) {
175
- const n = Number(arg.split('=')[1]);
176
- if (!Number.isFinite(n) || n <= 0)
177
- throw new Error(`--month: invalid value "${arg}" (expected positive months)`);
178
- months = n;
179
- }
180
- else if (arg.startsWith('--months=')) {
181
- const n = Number(arg.split('=')[1]);
182
- if (!Number.isFinite(n) || n <= 0)
183
- throw new Error(`--months: invalid value "${arg}" (expected positive months)`);
184
- months = n;
185
- }
186
- else if (arg === '--chart') {
187
- chart = String(argv[++i] || '');
188
- if (!chart)
189
- throw new Error('--chart: missing path');
190
- }
191
- else if (arg.startsWith('--chart=')) {
192
- chart = arg.split('=').slice(1).join('=');
193
- if (!chart)
194
- throw new Error('--chart: missing path');
195
- }
196
- else if (arg === '--feed' || arg === '--pool' || arg === '--book' || arg === '--orderbook') {
197
- const picked = arg === '--feed' ? 'feed' : arg === '--pool' ? 'pool' : 'book';
198
- if (source !== 'auto' && source !== picked)
199
- throw new Error(`Conflicting source flags: --${source} with ${arg} (use only one of --feed, --pool, --book)`);
200
- source = picked;
201
- }
202
- else if (arg.startsWith('--')) {
203
- throw new Error(`Unknown flag "${arg}". Usage: dexbot tv <bot|pool-id|AssetA/AssetB> [--month N]`);
204
- }
205
- else if (!target) {
206
- target = arg;
207
- }
208
- else {
209
- throw new Error(`Unexpected argument "${arg}". Only one target is supported. Usage: dexbot tv <bot|pool-id|AssetA/AssetB> [--month N]`);
210
- }
211
- }
212
- return { target, months, chart, source, help };
213
- }
214
- function isPoolIdTarget(target) {
215
- return /^(1\.19\.\d+|\d+)$/.test(target.trim());
216
- }
217
- function findBotByTarget(target) {
218
- const settings = loadBotSettings();
219
- const entries = Array.isArray(settings?.bots) ? settings.bots : [];
220
- for (let i = 0; i < entries.length; i++) {
221
- const entry = entries[i];
222
- if (!entry)
223
- continue;
224
- if (isSameBotName(entry.name, target))
225
- return { botKey: computeBotKey(entry, i), meta: entry };
226
- }
227
- const meta = loadBotMeta(target);
228
- if (meta) {
229
- const idx = entries.indexOf(meta);
230
- return { botKey: computeBotKey(meta, idx >= 0 ? idx : 0), meta };
231
- }
232
- return null;
233
- }
234
- function monthsLabel(months) {
235
- return Number.isInteger(months) ? `${months}m` : `${String(months).replace('.', 'p')}m`;
236
- }
237
- async function resolvePoolAssets(poolId, bitsharesClient) {
238
- const fullId = normalizePoolId(poolId);
239
- // Chain pool object via get_objects([poolId]) → asset_a / asset_b.
240
- const db = bitsharesClient.BitShares?.db;
241
- if (db && typeof db.get_objects === 'function') {
242
- try {
243
- const objs = await db.get_objects([fullId]);
244
- const pool = Array.isArray(objs) ? objs[0] : null;
245
- const idA = pool?.asset_a || pool?.asset_ids?.[0];
246
- const idB = pool?.asset_b || pool?.asset_ids?.[1];
247
- if (idA && idB) {
248
- const assets = typeof db.get_assets === 'function' ? await db.get_assets([String(idA), String(idB)]) : null;
249
- // Tolerate both [..] and [[..]] result shapes.
250
- const list = Array.isArray(assets) ? assets.flat(Infinity) : [];
251
- const metaA = list.find((a) => String(a?.id) === String(idA));
252
- const metaB = list.find((a) => String(a?.id) === String(idB));
253
- if (metaA && metaB) {
254
- return {
255
- assetA: { id: String(metaA.id), precision: Number(metaA.precision), symbol: String(metaA.symbol || idA) },
256
- assetB: { id: String(metaB.id), precision: Number(metaB.precision), symbol: String(metaB.symbol || idB) },
257
- };
258
- }
259
- }
260
- }
261
- catch (_) {
262
- // Fall through to Kibana discovery below.
263
- }
264
- }
265
- // Fallback: Kibana discovery (what went into the pool) + chain precision lookup.
266
- const { discoverPoolAssets } = await import('../market_adapter/inputs/kibana_source.js');
267
- const ids = await discoverPoolAssets(fullId, {});
268
- if (!Array.isArray(ids) || ids.length !== 2) {
269
- throw new Error(`Pool ${fullId}: expected exactly 2 assets, discovered [${(ids || []).join(', ')}]. Pass AssetA/AssetB instead.`);
270
- }
271
- const [idA, idB] = ids.map(String);
272
- const assets = await db.get_assets([idA, idB]);
273
- const metaA = (assets || []).find((a) => String(a?.id) === idA);
274
- const metaB = (assets || []).find((a) => String(a?.id) === idB);
275
- if (!metaA || !metaB || !Number.isFinite(Number(metaA.precision)) || !Number.isFinite(Number(metaB.precision))) {
276
- throw new Error(`Pool ${fullId}: failed to resolve asset metadata for ${idA}/${idB}`);
277
- }
278
- return {
279
- assetA: { id: idA, precision: Number(metaA.precision), symbol: String(metaA.symbol || idA) },
280
- assetB: { id: idB, precision: Number(metaB.precision), symbol: String(metaB.symbol || idB) },
281
- };
282
- }
283
- async function run() {
284
- // Mute chain connection chatter first — shared helper, console.error untouched.
285
- muteChainLogs();
286
- const { target, months, chart, source, help } = parseArgs(process.argv.slice(2));
287
- if (help || !target) {
288
- printUsage();
289
- if (!target && !help)
290
- process.exit(1);
291
- process.exit(0);
292
- }
293
- const lookbackHours = Math.max(1, Math.round(months * HOURS_PER_MONTH));
294
- const bucketMs = INTERVAL_SECONDS * 1000;
295
- const endMs = Math.floor(Date.now() / bucketMs) * bucketMs;
296
- const startMs = endMs - lookbackHours * 3600 * 1000;
297
- const timeRange = { gte: new Date(startMs).toISOString(), lte: new Date(endMs).toISOString() };
298
- // Classify the target locally first so a typo'd bot / malformed pair
299
- // fails fast without waiting for a chain connection.
300
- const botHit = findBotByTarget(target);
301
- const poolTarget = !botHit && isPoolIdTarget(target);
302
- const pairTarget = !botHit && !poolTarget && target.includes('/');
303
- const pairParts = pairTarget ? target.split('/').map((s) => s.trim()).filter(Boolean) : [];
304
- if (!botHit && !poolTarget && !pairTarget) {
305
- const settings = loadBotSettings();
306
- const entries = Array.isArray(settings?.bots) ? settings.bots : [];
307
- const keys = entries.map((b, i) => computeBotKey(b, i)).filter(Boolean);
308
- throw new Error(`Unknown target "${target}". Use a bot name/key${keys.length ? ` (${keys.slice(0, 8).join(', ')}${keys.length > 8 ? ', …' : ''})` : ''}, a pool id (e.g. 133), or AssetA/AssetB.`);
309
- }
310
- if (pairTarget && pairParts.length !== 2)
311
- throw new Error(`Invalid pair "${target}". Use AssetA/AssetB, e.g. TOKENA/TOKENB`);
312
- const bitsharesClient = await import('../modules/bitshares_client.js');
313
- const { waitForConnected } = bitsharesClient;
314
- await waitForConnected();
315
- let tmpFile = null;
316
- try {
317
- let assetA;
318
- let assetB;
319
- let poolId = null;
320
- let feedCtx = null;
321
- let sourceLabel = '';
322
- let botKey = null;
323
- let botMeta = null;
324
- if (botHit) {
325
- botKey = botHit.botKey;
326
- botMeta = botHit.meta;
327
- const symA = botMeta.assetA;
328
- const symB = botMeta.assetB;
329
- if (!symA || !symB)
330
- throw new Error(`Bot '${target}' has no assetA/assetB pair in profiles/bots.json`);
331
- const [metaA, metaB] = await Promise.all([resolveAsset(symA, bitsharesClient), resolveAsset(symB, bitsharesClient)]);
332
- assetA = { id: metaA.id, precision: metaA.precision, symbol: symA };
333
- assetB = { id: metaB.id, precision: metaB.precision, symbol: symB };
334
- feedCtx = await activateFeedIfCovered(symA, symB, assetA, assetB, source, bitsharesClient);
335
- if (feedCtx) {
336
- sourceLabel = `feed ${feedName(feedCtx)}`;
337
- }
338
- else if (source === 'book') {
339
- sourceLabel = 'orderbook';
340
- }
341
- else {
342
- try {
343
- poolId = (await findPoolByAssets(assetA.id, assetB.id, { bitsharesClient, sortBy: 'assetABalance' })).id;
344
- }
345
- catch (_) {
346
- poolId = null;
347
- }
348
- sourceLabel = poolId ? `pool ${poolId}` : 'orderbook';
349
- }
350
- }
351
- else if (poolTarget) {
352
- poolId = normalizePoolId(target.trim());
353
- const resolved = await resolvePoolAssets(poolId, bitsharesClient);
354
- assetA = resolved.assetA;
355
- assetB = resolved.assetB;
356
- sourceLabel = `pool ${poolId}`;
357
- }
358
- else {
359
- const [metaA, metaB] = await Promise.all([resolveAsset(pairParts[0], bitsharesClient), resolveAsset(pairParts[1], bitsharesClient)]);
360
- assetA = { id: metaA.id, precision: metaA.precision, symbol: pairParts[0] };
361
- assetB = { id: metaB.id, precision: metaB.precision, symbol: pairParts[1] };
362
- feedCtx = await activateFeedIfCovered(pairParts[0], pairParts[1], assetA, assetB, source, bitsharesClient);
363
- if (feedCtx) {
364
- sourceLabel = `feed ${feedName(feedCtx)}`;
365
- }
366
- else if (source === 'book') {
367
- sourceLabel = 'orderbook';
368
- }
369
- else {
370
- try {
371
- poolId = (await findPoolByAssets(assetA.id, assetB.id, { bitsharesClient, sortBy: 'assetABalance' })).id;
372
- }
373
- catch (_) {
374
- poolId = null;
375
- }
376
- sourceLabel = poolId ? `pool ${poolId}` : 'orderbook';
377
- }
378
- }
379
- // ── Data pull (the only job of this script) ──────────────────────────
380
- // All three paths share ONE chunk-cache function (runCachedWindows)
381
- // in 1-month windows; the LP path additionally sets a per-chunk
382
- // timeout/retry budget. Reruns query only what is missing.
383
- // No fetch logic is duplicated here.
384
- const TV_CHUNK_MONTHS = 1;
385
- console.log(`[tv] Fetching 1h candles (${months}mo, ${timeRange.gte.slice(0, 10)} → ${timeRange.lte.slice(0, 10)}) from ${sourceLabel} for ${assetA.symbol}/${assetB.symbol}...`);
386
- let candles;
387
- if (feedCtx) {
388
- // Feed publishes go through the same chunk-cache machinery as LP
389
- // candles: reruns reuse local buckets and query only what is
390
- // missing (plus a tail refresh for late-indexed publishes).
391
- candles = await fetchFeedCandlesSequentially(feedCtx, assetA, assetB, {
392
- intervalSeconds: INTERVAL_SECONDS,
393
- timeRange,
394
- chunkMonths: TV_CHUNK_MONTHS,
395
- });
396
- }
397
- else if (poolId) {
398
- candles = await fetchCandlesSequentially(poolId, assetA, assetB, {
399
- intervalSeconds: INTERVAL_SECONDS,
400
- timeRange,
401
- chunkMonths: TV_CHUNK_MONTHS,
402
- }, outputPath(poolId, INTERVAL_SECONDS, assetA, assetB));
403
- }
404
- else {
405
- // Order-book fills go through the same chunk-cache machinery as LP
406
- // candles and feed publishes: reruns reuse local buckets and query
407
- // only what is missing (plus a tail refresh for late-indexed fills).
408
- candles = await fetchMarketCandlesSequentially(assetA, assetB, {
409
- intervalSeconds: INTERVAL_SECONDS,
410
- timeRange,
411
- chunkMonths: TV_CHUNK_MONTHS,
412
- });
413
- }
414
- if (!Array.isArray(candles) || candles.length === 0)
415
- throw new Error('No candles returned for the requested range');
416
- tmpFile = path.join(os.tmpdir(), `dexbot-tv-${sanitizeKey(botKey || assetA.symbol + '-' + assetB.symbol)}-${process.pid}.json`);
417
- fs.writeFileSync(tmpFile, JSON.stringify({
418
- meta: {
419
- fetchedAt: new Date().toISOString(),
420
- feed: feedCtx ? feedName(feedCtx) : null,
421
- pool: poolId,
422
- assetA: { id: assetA.id, precision: assetA.precision, symbol: assetA.symbol },
423
- assetB: { id: assetB.id, precision: assetB.precision, symbol: assetB.symbol },
424
- intervalSeconds: INTERVAL_SECONDS,
425
- lookbackHours,
426
- format: feedCtx
427
- ? '[timestamp_ms, open, high, low, close, feed_publish_count]'
428
- : '[timestamp_ms, open, high, low, close, volume_A]',
429
- },
430
- candles,
431
- }), 'utf8');
432
- // ── Delegate rendering to the existing TradingView exporter ──────────
433
- const analyzer = path.join(__dirname, '..', 'analysis', 'tradingview', 'analyze_tradingview.js');
434
- if (!fs.existsSync(analyzer))
435
- throw new Error(`TradingView exporter not found at ${analyzer} (run npm run build first)`);
436
- const feedSuffix = feedCtx ? '_feed' : '';
437
- const baseName = botKey
438
- ? `tv_${sanitizeKey(botKey)}${feedSuffix}`
439
- : poolId
440
- ? `tv_pool_${String(poolId).replace(/^1\.19\./, '')}`
441
- : `tv_${slugPart(assetA.symbol)}_${slugPart(assetB.symbol)}${feedSuffix}`;
442
- const chartFile = chart
443
- ? path.resolve(chart)
444
- : path.join(PATHS.ANALYSIS.CHARTS_DIR, `${baseName}_1h_${monthsLabel(months)}.html`);
445
- const label = feedCtx
446
- ? `Feed ${feedName(feedCtx)} (${assetA.symbol}/${assetB.symbol})`
447
- : poolId ? `Pool ${String(poolId).replace(/^1\.19\./, '')}` : `${assetA.symbol}/${assetB.symbol}`;
448
- const title = botKey && botMeta?.name ? `${botMeta.name} · ${label} · 1h · TradingView` : `${label} · 1h · TradingView`;
449
- const analyzerArgs = ['--file', tmpFile, '--chart', chartFile, '--title', title];
450
- if (botKey) {
451
- // Same AMA overlay the exporter resolves for this bot.
452
- const ama = resolveAmaConfig(botKey);
453
- analyzerArgs.push('--bot-key', botKey, '--ama-er-period', String(ama.erPeriod), '--ama-fast-period', String(ama.fastPeriod), '--ama-slow-period', String(ama.slowPeriod));
454
- }
455
- const result = spawnSync(process.execPath, [analyzer, ...analyzerArgs], { stdio: 'inherit' });
456
- if (result.status !== 0)
457
- throw new Error(`TradingView exporter exited with status ${result.status}`);
458
- try {
459
- fs.unlinkSync(tmpFile);
460
- }
461
- catch (_) { /* keep on failure path only */ }
462
- tmpFile = null;
463
- }
464
- finally {
465
- try {
466
- const { disconnectClient: dc } = await import('../modules/bitshares_client.js');
467
- dc();
468
- }
469
- catch (_) { /* best-effort */ }
470
- // The BitShares WS + node monitor keep the event loop alive; exit explicitly.
471
- setTimeout(() => process.exit(0), 50).unref();
472
- }
473
- }
21
+ import { run } from './chart_command.js';
474
22
  const invoked = process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href;
475
23
  if (invoked) {
476
- run().catch((err) => {
24
+ run('tv').catch((err) => {
477
25
  console.error(`[tv] Error: ${getErrorMessage(err)}`);
478
26
  process.exit(1);
479
27
  });
480
28
  }
481
- export { parseArgs, isPoolIdTarget, resolveMpaBacking, pickFeedContext, activateFeedIfCovered, feedAgeMs, feedName, FEED_STALE_WARN_AGE_MS };
482
29
  //# sourceMappingURL=tv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tv.js","sourceRoot":"","sources":["../../scripts/tv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tv.js","sourceRoot":"","sources":["../../scripts/tv.ts"],"names":[],"mappings":";AACA,YAAY,CAAC;AACb;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3F,IAAI,OAAO,EAAE,CAAC;IACV,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC7B,OAAO,CAAC,KAAK,CAAC,eAAe,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}