@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.
- package/dist/cli.js +6122 -12724
- package/dist/lib/aiExport.js +1 -1607
- package/dist/lib/binanceMarketContextBackfill.js +7 -6
- package/dist/lib/coinMarketCapContextBackfill.js +19 -18
- package/dist/lib/derivativesContextBackfill.js +10 -9
- 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/runtimeEvidenceArtifacts.js +13 -1
- package/dist/lib/runtimeRedis.js +6 -57
- package/dist/lib/runtimeStrategyBacktest.js +2 -48
- package/dist/scripts/aiExport.js +1 -1607
- package/dist/scripts/aiPocketSearch.js +1 -1607
- package/dist/scripts/aiTrain.js +17 -1623
- package/dist/scripts/backtest.js +110 -1759
- 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/derivativesIngest.js +6 -4
- package/dist/scripts/derivativesIngestCoinalyzeAll.js +5 -4
- package/dist/scripts/doctor.js +2 -5184
- 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 +291 -1807
- package/dist/scripts/replayRunner.js +291 -1807
- package/dist/scripts/replayRuntimeEvidence.js +2 -48
- package/dist/scripts/researchAuto.js +3 -49
- package/dist/scripts/results.js +1 -1607
- package/dist/scripts/runtimeEvidence.js +15 -49
- package/dist/scripts/runtimeParity.js +121 -1746
- package/dist/scripts/signals.js +1057 -2647
- package/dist/scripts/signalsDaemon.js +1051 -2608
- package/dist/scripts/signalsSummary.js +4 -26
- package/dist/workers/testerWorker.js +2 -2
- 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
|
|
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
|
-
|
|
135
|
+
identitySha256.slice(0, 16)
|
|
124
136
|
].join("_");
|
|
125
137
|
const createdAt = Date.now();
|
|
126
138
|
const manifest = {
|
package/dist/lib/runtimeRedis.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
}
|