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