@tradejs/cli 2.0.18 → 2.0.20
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/dist/cli.js +14522 -15704
- package/dist/lib/aiExport.js +15 -1608
- package/dist/lib/aiPocketSearch.js +499 -67
- package/dist/lib/aiPocketSearchCli.js +113 -0
- package/dist/lib/aiTrainCharts.js +14 -1
- package/dist/lib/aiTrainMetrics.js +4 -1
- package/dist/lib/aiTrainResearch.js +88 -54
- package/dist/lib/binanceMarketContextBackfill.js +7 -6
- package/dist/lib/coinMarketCapContextBackfill.js +19 -18
- package/dist/lib/coreResearch.js +2738 -0
- package/dist/lib/derivativesContextBackfill.js +10 -9
- package/dist/lib/executionCalibration.js +6 -3
- package/dist/lib/hyperliquidWhaleBackfill.js +8 -8
- package/dist/lib/hyperliquidWhaleStream.js +4 -4
- package/dist/lib/marketContextPrepare.js +83 -1686
- package/dist/lib/runEnvironment.js +14 -1666
- package/dist/lib/runFormatting.js +1 -1607
- package/dist/lib/runtimeDebugEvidence.js +2 -48
- package/dist/lib/runtimeLineage.js +81 -48
- package/dist/lib/runtimeRedis.js +6 -57
- package/dist/lib/runtimeScorecard.js +153 -10
- package/dist/lib/runtimeStrategyBacktest.js +2 -48
- package/dist/lib/strategyGateFingerprint.js +80 -0
- package/dist/lib/strategyRelease.js +1365 -0
- package/dist/scripts/aiExport.js +17 -1610
- package/dist/scripts/aiPocketSearch.js +1070 -1770
- package/dist/scripts/aiTrain.js +108 -1688
- package/dist/scripts/backtest.js +120 -1760
- package/dist/scripts/binanceMarketIngest.js +5 -4
- package/dist/scripts/candlesMigrateProvider.js +6 -5186
- package/dist/scripts/cleanupMarketContext.js +4 -3
- package/dist/scripts/continuity.js +4 -3
- package/dist/scripts/coreResearch.js +2830 -0
- package/dist/scripts/derivativesIngest.js +6 -4
- package/dist/scripts/derivativesIngestCoinalyzeAll.js +5 -4
- package/dist/scripts/doctor.js +2 -5184
- package/dist/scripts/executionCalibration.js +6 -3
- package/dist/scripts/hyperliquidWhaleBackfill.js +8 -8
- package/dist/scripts/hyperliquidWhaleIngest.js +4 -4
- package/dist/scripts/hyperliquidWhalesUpdate.js +1 -1
- package/dist/scripts/migration.js +3 -3
- package/dist/scripts/mlExport.js +1 -1607
- package/dist/scripts/replay.js +239 -1855
- package/dist/scripts/replayRunner.js +239 -1855
- package/dist/scripts/replayRuntimeEvidence.js +29 -62
- package/dist/scripts/researchAuto.js +3 -49
- package/dist/scripts/results.js +1 -1607
- package/dist/scripts/runtimeEvidence.js +18 -56
- package/dist/scripts/runtimeParity.js +121 -1746
- package/dist/scripts/runtimeScorecard.js +883 -29
- package/dist/scripts/signals.js +1178 -2724
- package/dist/scripts/signalsDaemon.js +1183 -2696
- package/dist/scripts/signalsSummary.js +4 -26
- package/dist/scripts/strategyRelease.js +1469 -0
- package/dist/workers/testerWorker.js +2 -2
- package/package.json +13 -9
|
@@ -31,7 +31,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var replayRuntimeEvidence_exports = {};
|
|
32
32
|
__export(replayRuntimeEvidence_exports, {
|
|
33
33
|
main: () => main,
|
|
34
|
-
replayRuntimeEvidence: () => replayRuntimeEvidence
|
|
34
|
+
replayRuntimeEvidence: () => replayRuntimeEvidence,
|
|
35
|
+
summarizeReplayComparison: () => summarizeReplayComparison
|
|
35
36
|
});
|
|
36
37
|
module.exports = __toCommonJS(replayRuntimeEvidence_exports);
|
|
37
38
|
var import_promises = __toESM(require("fs/promises"));
|
|
@@ -46,17 +47,7 @@ var import_redis3 = require("@tradejs/infra/redis");
|
|
|
46
47
|
// src/lib/runtimeRedis.ts
|
|
47
48
|
var import_redis = require("@tradejs/infra/redis");
|
|
48
49
|
var import_time = require("@tradejs/core/time");
|
|
49
|
-
var
|
|
50
|
-
var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
|
|
51
|
-
var resolveStrategyConfigIdentityByKey = (userName, key) => {
|
|
52
|
-
const parts = key.split(":");
|
|
53
|
-
if (parts.length !== 5) return null;
|
|
54
|
-
const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
|
|
55
|
-
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)) {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
return { strategyName, configId };
|
|
59
|
-
};
|
|
50
|
+
var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
|
|
60
51
|
var isRuntimeTradeRecord = (value) => {
|
|
61
52
|
if (!value || typeof value !== "object") {
|
|
62
53
|
return false;
|
|
@@ -64,42 +55,6 @@ var isRuntimeTradeRecord = (value) => {
|
|
|
64
55
|
const record = value;
|
|
65
56
|
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");
|
|
66
57
|
};
|
|
67
|
-
var resolveStrategyNameByConfigKey = (userName, key) => {
|
|
68
|
-
return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
|
|
69
|
-
};
|
|
70
|
-
var getRuntimeStrategyConfigKeys = async (userName) => {
|
|
71
|
-
const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
|
|
72
|
-
return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
|
|
73
|
-
};
|
|
74
|
-
var loadRuntimeStrategyConfigs = async (userName, {
|
|
75
|
-
onInvalidConfig
|
|
76
|
-
} = {}) => {
|
|
77
|
-
const configKeys = await getRuntimeStrategyConfigKeys(userName);
|
|
78
|
-
const strategyConfigs = await Promise.all(
|
|
79
|
-
configKeys.map(async (key) => {
|
|
80
|
-
const strategyName = resolveStrategyNameByConfigKey(userName, key);
|
|
81
|
-
const identity = resolveStrategyConfigIdentityByKey(userName, key);
|
|
82
|
-
if (!strategyName || !identity) {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
const strategyConfig = await (0, import_redis.getData)(
|
|
86
|
-
key,
|
|
87
|
-
null
|
|
88
|
-
);
|
|
89
|
-
if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
|
|
90
|
-
onInvalidConfig?.(key);
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
return {
|
|
94
|
-
key,
|
|
95
|
-
strategyName,
|
|
96
|
-
configId: identity.configId,
|
|
97
|
-
strategyConfig
|
|
98
|
-
};
|
|
99
|
-
})
|
|
100
|
-
);
|
|
101
|
-
return strategyConfigs.filter(Boolean);
|
|
102
|
-
};
|
|
103
58
|
var loadRuntimeTrades = async (userName, {
|
|
104
59
|
startTime,
|
|
105
60
|
endTime
|
|
@@ -350,7 +305,7 @@ var collectRuntimeDebugEvidence = async ({
|
|
|
350
305
|
loadRuntimeSignals(userName, { startTime, endTime }),
|
|
351
306
|
loadRuntimeSignalEvaluations(userName, { startTime, endTime }),
|
|
352
307
|
loadRuntimeSignalEvaluationStatsBuckets(userName),
|
|
353
|
-
loadRuntimeStrategyConfigs(userName)
|
|
308
|
+
(0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName)
|
|
354
309
|
]);
|
|
355
310
|
const tradesByOrderId = new Map(
|
|
356
311
|
entryTrades.map((trade) => [trade.orderId, trade])
|
|
@@ -459,8 +414,6 @@ import_args.default.option(
|
|
|
459
414
|
"Output JSON path",
|
|
460
415
|
"output/replay-runtime-evidence.json"
|
|
461
416
|
);
|
|
462
|
-
var flags = import_args.default.parse(process.argv);
|
|
463
|
-
var projectRoot = String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
464
417
|
var toEpochMs = (value) => {
|
|
465
418
|
if (value == null || value === "") {
|
|
466
419
|
return null;
|
|
@@ -473,7 +426,7 @@ var toEpochMs = (value) => {
|
|
|
473
426
|
const parsed = Date.parse(raw);
|
|
474
427
|
return Number.isFinite(parsed) ? parsed : null;
|
|
475
428
|
};
|
|
476
|
-
var resolveWindow = () => {
|
|
429
|
+
var resolveWindow = (flags) => {
|
|
477
430
|
const endTime = toEpochMs(flags.endTime) ?? Date.now();
|
|
478
431
|
const hours = Math.max(
|
|
479
432
|
1,
|
|
@@ -563,9 +516,13 @@ var summarizeReplayComparison = (runtimeComparison, strategies) => {
|
|
|
563
516
|
[...matched, ...backtestOnly, ...runtimeOnly].map(resolveItemStrategy).filter((value) => typeof value === "string")
|
|
564
517
|
)
|
|
565
518
|
].sort((left, right) => left.localeCompare(right));
|
|
519
|
+
const comparisonLineage = asRecord(comparison.lineage);
|
|
520
|
+
const replayLineage = asArray(comparisonLineage.replay).filter(
|
|
521
|
+
(entry) => !useFilter || strategySet.has(String(asRecord(entry).strategy ?? ""))
|
|
522
|
+
);
|
|
566
523
|
return {
|
|
567
524
|
mode: comparison.mode ?? null,
|
|
568
|
-
lineage:
|
|
525
|
+
lineage: comparisonLineage ? { ...comparisonLineage, replay: replayLineage } : null,
|
|
569
526
|
rows: asArray(comparison.rows).filter(
|
|
570
527
|
(row) => !useFilter || strategySet.has(String(row.strategyName ?? ""))
|
|
571
528
|
),
|
|
@@ -671,9 +628,12 @@ var getReplayStrategies = (replayValue) => {
|
|
|
671
628
|
var loadRuntimePayload = async ({
|
|
672
629
|
startTime,
|
|
673
630
|
endTime,
|
|
674
|
-
strategies
|
|
631
|
+
strategies,
|
|
632
|
+
userName,
|
|
633
|
+
runtimeEvidenceFile,
|
|
634
|
+
projectRoot
|
|
675
635
|
}) => {
|
|
676
|
-
const runtimeEvidencePath = typeof
|
|
636
|
+
const runtimeEvidencePath = typeof runtimeEvidenceFile === "string" && runtimeEvidenceFile.trim() ? import_node_path.default.resolve(projectRoot, runtimeEvidenceFile.trim()) : null;
|
|
677
637
|
if (runtimeEvidencePath) {
|
|
678
638
|
const artifact = JSON.parse(
|
|
679
639
|
await import_promises.default.readFile(runtimeEvidencePath, "utf8")
|
|
@@ -685,7 +645,7 @@ var loadRuntimePayload = async ({
|
|
|
685
645
|
};
|
|
686
646
|
}
|
|
687
647
|
const runtimeEvidence = await collectRuntimeDebugEvidence({
|
|
688
|
-
userName
|
|
648
|
+
userName,
|
|
689
649
|
startTime,
|
|
690
650
|
endTime,
|
|
691
651
|
strategies: strategies.length ? strategies : void 0
|
|
@@ -694,7 +654,7 @@ var loadRuntimePayload = async ({
|
|
|
694
654
|
source: "local-redis",
|
|
695
655
|
path: null,
|
|
696
656
|
payload: buildRuntimeEvidenceReportPayload({
|
|
697
|
-
userName
|
|
657
|
+
userName,
|
|
698
658
|
startTime,
|
|
699
659
|
endTime,
|
|
700
660
|
signals: runtimeEvidence.signals,
|
|
@@ -706,9 +666,12 @@ var loadRuntimePayload = async ({
|
|
|
706
666
|
};
|
|
707
667
|
};
|
|
708
668
|
var replayRuntimeEvidence = async () => {
|
|
709
|
-
const
|
|
669
|
+
const flags = import_args.default.parse(process.argv);
|
|
670
|
+
const projectRoot = String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
671
|
+
const userName = String(flags.user ?? "root");
|
|
672
|
+
const { startTime, endTime, source } = resolveWindow(flags);
|
|
710
673
|
const replay = await loadReplayResult({
|
|
711
|
-
userName
|
|
674
|
+
userName,
|
|
712
675
|
replayKey: typeof flags.replayKey === "string" && flags.replayKey.trim() ? flags.replayKey.trim() : void 0
|
|
713
676
|
});
|
|
714
677
|
const explicitStrategies = parseStrategyFilter(flags.strategy);
|
|
@@ -716,13 +679,16 @@ var replayRuntimeEvidence = async () => {
|
|
|
716
679
|
const runtime = await loadRuntimePayload({
|
|
717
680
|
startTime,
|
|
718
681
|
endTime,
|
|
719
|
-
strategies
|
|
682
|
+
strategies,
|
|
683
|
+
userName,
|
|
684
|
+
runtimeEvidenceFile: flags.runtimeEvidence,
|
|
685
|
+
projectRoot
|
|
720
686
|
});
|
|
721
687
|
const replayValue = asRecord(replay.value);
|
|
722
688
|
const artifact = {
|
|
723
689
|
reportType: "replay-runtime-evidence",
|
|
724
690
|
generatedAt: Date.now(),
|
|
725
|
-
userName
|
|
691
|
+
userName,
|
|
726
692
|
window: {
|
|
727
693
|
startTime,
|
|
728
694
|
endTime,
|
|
@@ -774,5 +740,6 @@ var main = replayRuntimeEvidence;
|
|
|
774
740
|
// Annotate the CommonJS export names for ESM import in node:
|
|
775
741
|
0 && (module.exports = {
|
|
776
742
|
main,
|
|
777
|
-
replayRuntimeEvidence
|
|
743
|
+
replayRuntimeEvidence,
|
|
744
|
+
summarizeReplayComparison
|
|
778
745
|
});
|
|
@@ -45,7 +45,7 @@ __export(researchAuto_exports, {
|
|
|
45
45
|
parseJsonOutput: () => parseJsonOutput,
|
|
46
46
|
releaseResearchAutoLock: () => releaseResearchAutoLock,
|
|
47
47
|
resolveHeapMbFromEnv: () => resolveHeapMbFromEnv,
|
|
48
|
-
resolveStrategyNameByConfigKey: () => resolveStrategyNameByConfigKey,
|
|
48
|
+
resolveStrategyNameByConfigKey: () => import_runtimeStrategyConfigs.resolveStrategyNameByConfigKey,
|
|
49
49
|
resolveTarget: () => resolveTarget,
|
|
50
50
|
runCliCommand: () => runCliCommand,
|
|
51
51
|
toStrategyConfigGrid: () => toStrategyConfigGrid,
|
|
@@ -67,57 +67,11 @@ var import_strategies = require("@tradejs/strategies");
|
|
|
67
67
|
// src/lib/runtimeRedis.ts
|
|
68
68
|
var import_redis = require("@tradejs/infra/redis");
|
|
69
69
|
var import_time = require("@tradejs/core/time");
|
|
70
|
-
var
|
|
71
|
-
var RESERVED_CONFIG_IDS = /* @__PURE__ */ new Set(["results"]);
|
|
72
|
-
var resolveStrategyConfigIdentityByKey = (userName, key) => {
|
|
73
|
-
const parts = key.split(":");
|
|
74
|
-
if (parts.length !== 5) return null;
|
|
75
|
-
const [users, keyUserName, strategiesKey, strategyName, configId] = parts;
|
|
76
|
-
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)) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
return { strategyName, configId };
|
|
80
|
-
};
|
|
70
|
+
var import_runtimeStrategyConfigs = require("@tradejs/infra/runtimeStrategyConfigs");
|
|
81
71
|
var isRuntimeStrategyEnabled = (strategyConfig) => {
|
|
82
72
|
const enabled = strategyConfig.ENABLE;
|
|
83
73
|
return enabled !== false;
|
|
84
74
|
};
|
|
85
|
-
var resolveStrategyNameByConfigKey = (userName, key) => {
|
|
86
|
-
return resolveStrategyConfigIdentityByKey(userName, key)?.strategyName ?? null;
|
|
87
|
-
};
|
|
88
|
-
var getRuntimeStrategyConfigKeys = async (userName) => {
|
|
89
|
-
const keys = await (0, import_redis.getKeys)(`${import_redis.redisKeys.strategies(userName)}:`);
|
|
90
|
-
return keys.filter((key) => resolveStrategyConfigIdentityByKey(userName, key)).sort((left, right) => left.localeCompare(right));
|
|
91
|
-
};
|
|
92
|
-
var loadRuntimeStrategyConfigs = async (userName, {
|
|
93
|
-
onInvalidConfig
|
|
94
|
-
} = {}) => {
|
|
95
|
-
const configKeys = await getRuntimeStrategyConfigKeys(userName);
|
|
96
|
-
const strategyConfigs = await Promise.all(
|
|
97
|
-
configKeys.map(async (key) => {
|
|
98
|
-
const strategyName = resolveStrategyNameByConfigKey(userName, key);
|
|
99
|
-
const identity = resolveStrategyConfigIdentityByKey(userName, key);
|
|
100
|
-
if (!strategyName || !identity) {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
const strategyConfig = await (0, import_redis.getData)(
|
|
104
|
-
key,
|
|
105
|
-
null
|
|
106
|
-
);
|
|
107
|
-
if (!strategyConfig || typeof strategyConfig !== "object" || Array.isArray(strategyConfig)) {
|
|
108
|
-
onInvalidConfig?.(key);
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
key,
|
|
113
|
-
strategyName,
|
|
114
|
-
configId: identity.configId,
|
|
115
|
-
strategyConfig
|
|
116
|
-
};
|
|
117
|
-
})
|
|
118
|
-
);
|
|
119
|
-
return strategyConfigs.filter(Boolean);
|
|
120
|
-
};
|
|
121
75
|
|
|
122
76
|
// src/lib/runtimeStrategyBacktest.ts
|
|
123
77
|
var import_chalk = __toESM(require("chalk"));
|
|
@@ -413,7 +367,7 @@ var listMergedFiles = async (outDir, strategyName) => {
|
|
|
413
367
|
};
|
|
414
368
|
var getBacktestResultsPrefix = (userName, config) => `users:${userName}:backtests:results:${config}:`;
|
|
415
369
|
var listRuntimeStrategyNames = async (userName) => {
|
|
416
|
-
const strategyConfigs = await loadRuntimeStrategyConfigs(userName);
|
|
370
|
+
const strategyConfigs = await (0, import_runtimeStrategyConfigs.loadRuntimeStrategyConfigs)(userName);
|
|
417
371
|
return strategyConfigs.filter(({ strategyConfig }) => isRuntimeStrategyEnabled(strategyConfig)).map(({ strategyName }) => strategyName).sort((left, right) => left.localeCompare(right));
|
|
418
372
|
};
|
|
419
373
|
var toStrategyConfigGrid = (strategyConfig) => {
|