@tradejs/cli 2.0.17 → 2.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/cli.js +6122 -12724
  2. package/dist/lib/aiExport.js +1 -1607
  3. package/dist/lib/binanceMarketContextBackfill.js +7 -6
  4. package/dist/lib/coinMarketCapContextBackfill.js +19 -18
  5. package/dist/lib/derivativesContextBackfill.js +10 -9
  6. package/dist/lib/hyperliquidWhaleBackfill.js +8 -8
  7. package/dist/lib/hyperliquidWhaleStream.js +4 -4
  8. package/dist/lib/marketContextPrepare.js +83 -1686
  9. package/dist/lib/runEnvironment.js +14 -1666
  10. package/dist/lib/runFormatting.js +1 -1607
  11. package/dist/lib/runtimeDebugEvidence.js +2 -48
  12. package/dist/lib/runtimeEvidenceArtifacts.js +13 -1
  13. package/dist/lib/runtimeRedis.js +6 -57
  14. package/dist/lib/runtimeStrategyBacktest.js +2 -48
  15. package/dist/scripts/aiExport.js +1 -1607
  16. package/dist/scripts/aiPocketSearch.js +1 -1607
  17. package/dist/scripts/aiTrain.js +17 -1623
  18. package/dist/scripts/backtest.js +110 -1759
  19. package/dist/scripts/binanceMarketIngest.js +5 -4
  20. package/dist/scripts/candlesMigrateProvider.js +6 -5186
  21. package/dist/scripts/cleanupMarketContext.js +4 -3
  22. package/dist/scripts/continuity.js +4 -3
  23. package/dist/scripts/derivativesIngest.js +6 -4
  24. package/dist/scripts/derivativesIngestCoinalyzeAll.js +5 -4
  25. package/dist/scripts/doctor.js +2 -5184
  26. package/dist/scripts/hyperliquidWhaleBackfill.js +8 -8
  27. package/dist/scripts/hyperliquidWhaleIngest.js +4 -4
  28. package/dist/scripts/hyperliquidWhalesUpdate.js +1 -1
  29. package/dist/scripts/migration.js +3 -3
  30. package/dist/scripts/mlExport.js +1 -1607
  31. package/dist/scripts/replay.js +291 -1807
  32. package/dist/scripts/replayRunner.js +291 -1807
  33. package/dist/scripts/replayRuntimeEvidence.js +2 -48
  34. package/dist/scripts/researchAuto.js +3 -49
  35. package/dist/scripts/results.js +1 -1607
  36. package/dist/scripts/runtimeEvidence.js +15 -49
  37. package/dist/scripts/runtimeParity.js +121 -1746
  38. package/dist/scripts/signals.js +1057 -2647
  39. package/dist/scripts/signalsDaemon.js +1051 -2608
  40. package/dist/scripts/signalsSummary.js +4 -26
  41. package/dist/workers/testerWorker.js +2 -2
  42. package/package.json +11 -9
@@ -34,17 +34,7 @@ var import_redis3 = require("@tradejs/infra/redis");
34
34
  // src/lib/runtimeRedis.ts
35
35
  var import_redis = require("@tradejs/infra/redis");
36
36
  var import_time = require("@tradejs/core/time");
37
- var RESERVED_STRATEGY_NAMES = /* @__PURE__ */ new Set(["charts"]);
38
- var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
39
- var resolveStrategyConfigIdentityByKey = (userName, key) => {
40
- const parts = key.split(":");
41
- if (parts.length !== 5) return null;
42
- const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
43
- if (users !== "users" || keyUserName !== userName || strategiesKey !== "strategies" || !strategyName || !configId || RESERVED_STRATEGY_NAMES.has(strategyName) || RESERVED_CONFIG_IDS.has(configId) || !/^[a-zA-Z0-9_-]+$/.test(configId)) {
44
- return null;
45
- }
46
- return { strategyName, configId };
47
- };
37
+ var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
48
38
  var isRuntimeTradeRecord = (value) => {
49
39
  if (!value || typeof value !== "object") {
50
40
  return false;
@@ -52,42 +42,6 @@ var isRuntimeTradeRecord = (value) => {
52
42
  const record = value;
53
43
  return typeof record.orderId === "string" && typeof record.strategy === "string" && typeof record.symbol === "string" && typeof record.entryTimestamp === "number" && typeof record.entryPrice === "number" && typeof record.qty === "number" && (record.direction === "LONG" || record.direction === "SHORT");
54
44
  };
55
- var resolveStrategyNameByConfigKey = (userName, key) => {
56
- return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
57
- };
58
- var getRuntimeStrategyConfigKeys = async (userName) => {
59
- const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
60
- return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
61
- };
62
- var loadRuntimeStrategyConfigs = async (userName, {
63
- onInvalidConfig
64
- } = {}) => {
65
- const configKeys = await getRuntimeStrategyConfigKeys(userName);
66
- const strategyConfigs = await Promise.all(
67
- configKeys.map(async (key) => {
68
- const strategyName = resolveStrategyNameByConfigKey(userName, key);
69
- const identity = resolveStrategyConfigIdentityByKey(userName, key);
70
- if (!strategyName || !identity) {
71
- return null;
72
- }
73
- const strategyConfig = await (0, import_redis.getData)(
74
- key,
75
- null
76
- );
77
- if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
78
- onInvalidConfig?.(key);
79
- return null;
80
- }
81
- return {
82
- key,
83
- strategyName,
84
- configId: identity.configId,
85
- strategyConfig
86
- };
87
- })
88
- );
89
- return strategyConfigs.filter(Boolean);
90
- };
91
45
  var loadRuntimeTrades = async (userName, {
92
46
  startTime,
93
47
  endTime
@@ -356,7 +310,7 @@ var collectRuntimeDebugEvidence = async ({
356
310
  loadRuntimeSignals(userName, { startTime, endTime }),
357
311
  loadRuntimeSignalEvaluations(userName, { startTime, endTime }),
358
312
  loadRuntimeSignalEvaluationStatsBuckets(userName),
359
- loadRuntimeStrategyConfigs(userName)
313
+ (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName)
360
314
  ]);
361
315
  const tradesByOrderId = new Map(
362
316
  entryTrades.map((trade) => [trade.orderId, trade])
@@ -46,6 +46,17 @@ var RUNTIME_EVIDENCE_PAYLOAD_FILE = "runtime-evidence.json";
46
46
  var RUNTIME_EVIDENCE_COMPLETE_FILE = ".complete";
47
47
  var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
48
48
  var sha256 = (value) => (0, import_node_crypto.createHash)("sha256").update(value).digest("hex");
49
+ var runtimeEvidenceIdentitySha256 = (artifact) => {
50
+ const identityArtifact = { ...artifact };
51
+ delete identityArtifact.generatedAt;
52
+ const runtime = asRecord(identityArtifact.runtime);
53
+ if (runtime) {
54
+ const identityRuntime = { ...runtime };
55
+ delete identityRuntime.generatedAt;
56
+ identityArtifact.runtime = identityRuntime;
57
+ }
58
+ return sha256(JSON.stringify(identityArtifact));
59
+ };
49
60
  var isExistingDestinationError = (error) => {
50
61
  const code = error.code;
51
62
  return code === "EEXIST" || code === "ENOTEMPTY";
@@ -116,11 +127,12 @@ var publishRuntimeEvidenceBundle = async ({
116
127
  const payload = `${JSON.stringify(artifact, null, 2)}
117
128
  `;
118
129
  const payloadSha256 = sha256(payload);
130
+ const identitySha256 = runtimeEvidenceIdentitySha256(artifact);
119
131
  const safeDeploymentId = safeSegment(deploymentId, "default");
120
132
  const artifactId = [
121
133
  compactTimestamp(startTime),
122
134
  compactTimestamp(endTime),
123
- payloadSha256.slice(0, 16)
135
+ identitySha256.slice(0, 16)
124
136
  ].join("_");
125
137
  const createdAt = Date.now();
126
138
  const manifest = {
@@ -20,32 +20,22 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/lib/runtimeRedis.ts
21
21
  var runtimeRedis_exports = {};
22
22
  __export(runtimeRedis_exports, {
23
- getRuntimeStrategyConfigKeys: () => getRuntimeStrategyConfigKeys,
23
+ getRuntimeStrategyConfigKeys: () => import_runtimeStrategyConfigs.getRuntimeStrategyConfigKeys,
24
24
  isRuntimeStrategyEnabled: () => isRuntimeStrategyEnabled,
25
25
  isRuntimeTradeRecord: () => isRuntimeTradeRecord,
26
26
  loadRuntimeActiveTradeOrderIds: () => loadRuntimeActiveTradeOrderIds,
27
27
  loadRuntimeClosedTrades: () => loadRuntimeClosedTrades,
28
- loadRuntimeStrategyConfigs: () => loadRuntimeStrategyConfigs,
29
- loadRuntimeStrategyNames: () => loadRuntimeStrategyNames,
28
+ loadRuntimeStrategyConfigs: () => import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs,
29
+ loadRuntimeStrategyNames: () => import_runtimeStrategyConfigs.loadRuntimeStrategyNames,
30
30
  loadRuntimeTrades: () => loadRuntimeTrades,
31
31
  loadStrategyResultSymbols: () => loadStrategyResultSymbols,
32
- resolveStrategyConfigIdentityByKey: () => resolveStrategyConfigIdentityByKey,
33
- resolveStrategyNameByConfigKey: () => resolveStrategyNameByConfigKey
32
+ resolveStrategyConfigIdentityByKey: () => import_runtimeStrategyConfigs.resolveStrategyConfigIdentityByKey,
33
+ resolveStrategyNameByConfigKey: () => import_runtimeStrategyConfigs.resolveStrategyNameByConfigKey
34
34
  });
35
35
  module.exports = __toCommonJS(runtimeRedis_exports);
36
36
  var import_redis = require("@tradejs/infra/redis");
37
37
  var import_time = require("@tradejs/core/time");
38
- var RESERVED_STRATEGY_NAMES = /* @__PURE__ */ new Set(["charts"]);
39
- var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
40
- var resolveStrategyConfigIdentityByKey = (userName, key) => {
41
- const parts = key.split(":");
42
- if (parts.length !== 5) return null;
43
- const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
44
- if (users !== "users" || keyUserName !== userName || strategiesKey !== "strategies" || !strategyName || !configId || RESERVED_STRATEGY_NAMES.has(strategyName) || RESERVED_CONFIG_IDS.has(configId) || !/^[a-zA-Z0-9_-]+$/.test(configId)) {
45
- return null;
46
- }
47
- return { strategyName, configId };
48
- };
38
+ var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
49
39
  var isRuntimeStrategyEnabled = (strategyConfig) => {
50
40
  const enabled = strategyConfig.ENABLE;
51
41
  return enabled !== false;
@@ -57,47 +47,6 @@ var isRuntimeTradeRecord = (value) => {
57
47
  const record = value;
58
48
  return typeof record.orderId === "string" && typeof record.strategy === "string" && typeof record.symbol === "string" && typeof record.entryTimestamp === "number" && typeof record.entryPrice === "number" && typeof record.qty === "number" && (record.direction === "LONG" || record.direction === "SHORT");
59
49
  };
60
- var resolveStrategyNameByConfigKey = (userName, key) => {
61
- return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
62
- };
63
- var getRuntimeStrategyConfigKeys = async (userName) => {
64
- const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
65
- return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
66
- };
67
- var loadRuntimeStrategyNames = async (userName) => [
68
- ...new Set(
69
- (await getRuntimeStrategyConfigKeys(userName)).map((key) => resolveStrategyNameByConfigKey(userName, key)).filter((value) => Boolean(value))
70
- )
71
- ].sort((left, right) => left.localeCompare(right));
72
- var loadRuntimeStrategyConfigs = async (userName, {
73
- onInvalidConfig
74
- } = {}) => {
75
- const configKeys = await getRuntimeStrategyConfigKeys(userName);
76
- const strategyConfigs = await Promise.all(
77
- configKeys.map(async (key) => {
78
- const strategyName = resolveStrategyNameByConfigKey(userName, key);
79
- const identity = resolveStrategyConfigIdentityByKey(userName, key);
80
- if (!strategyName || !identity) {
81
- return null;
82
- }
83
- const strategyConfig = await (0, import_redis.getData)(
84
- key,
85
- null
86
- );
87
- if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
88
- onInvalidConfig?.(key);
89
- return null;
90
- }
91
- return {
92
- key,
93
- strategyName,
94
- configId: identity.configId,
95
- strategyConfig
96
- };
97
- })
98
- );
99
- return strategyConfigs.filter(Boolean);
100
- };
101
50
  var loadRuntimeTrades = async (userName, {
102
51
  startTime,
103
52
  endTime
@@ -40,57 +40,11 @@ var import_chalk = __toESM(require("chalk"));
40
40
  // src/lib/runtimeRedis.ts
41
41
  var import_redis = require("@tradejs/infra/redis");
42
42
  var import_time = require("@tradejs/core/time");
43
- var RESERVED_STRATEGY_NAMES = /* @__PURE__ */ new Set(["charts"]);
44
- var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
45
- var resolveStrategyConfigIdentityByKey = (userName, key) => {
46
- const parts = key.split(":");
47
- if (parts.length !== 5) return null;
48
- const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
49
- if (users !== "users" || keyUserName !== userName || strategiesKey !== "strategies" || !strategyName || !configId || RESERVED_STRATEGY_NAMES.has(strategyName) || RESERVED_CONFIG_IDS.has(configId) || !/^[a-zA-Z0-9_-]+$/.test(configId)) {
50
- return null;
51
- }
52
- return { strategyName, configId };
53
- };
43
+ var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
54
44
  var isRuntimeStrategyEnabled = (strategyConfig) => {
55
45
  const enabled = strategyConfig.ENABLE;
56
46
  return enabled !== false;
57
47
  };
58
- var resolveStrategyNameByConfigKey = (userName, key) => {
59
- return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
60
- };
61
- var getRuntimeStrategyConfigKeys = async (userName) => {
62
- const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
63
- return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
64
- };
65
- var loadRuntimeStrategyConfigs = async (userName, {
66
- onInvalidConfig
67
- } = {}) => {
68
- const configKeys = await getRuntimeStrategyConfigKeys(userName);
69
- const strategyConfigs = await Promise.all(
70
- configKeys.map(async (key) => {
71
- const strategyName = resolveStrategyNameByConfigKey(userName, key);
72
- const identity = resolveStrategyConfigIdentityByKey(userName, key);
73
- if (!strategyName || !identity) {
74
- return null;
75
- }
76
- const strategyConfig = await (0, import_redis.getData)(
77
- key,
78
- null
79
- );
80
- if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
81
- onInvalidConfig?.(key);
82
- return null;
83
- }
84
- return {
85
- key,
86
- strategyName,
87
- configId: identity.configId,
88
- strategyConfig
89
- };
90
- })
91
- );
92
- return strategyConfigs.filter(Boolean);
93
- };
94
48
 
95
49
  // src/lib/runtimeStrategyBacktest.ts
96
50
  var BACKTEST_CLI_RUNTIME_CONFIG_KEYS = /* @__PURE__ */ new Set([
@@ -105,7 +59,7 @@ var toStrategyConfigGrid = (strategyConfig) => Object.fromEntries(
105
59
  Object.entries(strategyConfig).filter(([key]) => !BACKTEST_CLI_RUNTIME_CONFIG_KEYS.has(key)).map(([key, value]) => [key, [value]])
106
60
  );
107
61
  var loadRuntimeStrategyBacktestConfigs = async (userName) => {
108
- const configs = await loadRuntimeStrategyConfigs(userName, {
62
+ const configs = await (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName, {
109
63
  onInvalidConfig: (key) => {
110
64
  console.log(import_chalk.default.yellow(`Skip invalid runtime strategy config: ${key}`));
111
65
  }