@tradejs/cli 1.0.8 → 1.0.10

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 (76) hide show
  1. package/dist/cli.js +29748 -13641
  2. package/dist/lib/aiPocketSearch.js +1316 -0
  3. package/dist/lib/aiTrainCharts.js +711 -0
  4. package/dist/lib/aiTrainDataset.js +40 -0
  5. package/dist/lib/aiTrainEvaluationDump.js +76 -0
  6. package/dist/lib/aiTrainMetrics.js +148 -8
  7. package/dist/lib/aiTrainOptions.js +130 -0
  8. package/dist/lib/aiTrainQuarantine.js +199 -0
  9. package/dist/lib/aiTrainResearch.js +467 -0
  10. package/dist/lib/binanceMarketContextBackfill.js +841 -0
  11. package/dist/lib/binanceMarketData.js +392 -0
  12. package/dist/lib/coinMarketCapContextBackfill.js +1088 -0
  13. package/dist/lib/continuity.js +60 -0
  14. package/dist/lib/derivativesContextBackfill.js +490 -77
  15. package/dist/lib/executionCalibration.js +705 -0
  16. package/dist/lib/marketContextPrepare.js +4403 -0
  17. package/dist/lib/paritySummary.js +101 -0
  18. package/dist/lib/runBot.js +1 -0
  19. package/dist/lib/runEnvironment.js +2254 -0
  20. package/dist/lib/runFormatting.js +1657 -0
  21. package/dist/lib/runtimeDebugEvidence.js +526 -0
  22. package/dist/lib/runtimeModeConfig.js +53 -0
  23. package/dist/lib/runtimeParity.js +88 -11
  24. package/dist/lib/runtimeParityDetails.js +751 -0
  25. package/dist/lib/runtimeRedis.js +157 -0
  26. package/dist/lib/runtimeSignalsLoader.js +187 -0
  27. package/dist/lib/runtimeSignalsStorage.js +185 -0
  28. package/dist/lib/runtimeStrategyBacktest.js +134 -0
  29. package/dist/lib/runtimeTradeSync.js +263 -0
  30. package/dist/lib/telegramReports.js +9 -0
  31. package/dist/lib/tickerUniverseCache.js +116 -0
  32. package/dist/lib/timeWindow.js +3 -3
  33. package/dist/scripts/agentRun.js +28 -8
  34. package/dist/scripts/aiExport.js +1721 -7
  35. package/dist/scripts/aiExportSelect.js +16 -4
  36. package/dist/scripts/aiPocketSearch.js +4190 -0
  37. package/dist/scripts/aiTrain.js +1866 -87
  38. package/dist/scripts/backtest.js +4509 -818
  39. package/dist/scripts/binanceMarketIngest.js +565 -0
  40. package/dist/scripts/bot.js +16 -2
  41. package/dist/scripts/candlesMigrateProvider.js +32 -22
  42. package/dist/scripts/cleanDir.js +15 -2
  43. package/dist/scripts/cleanRedis.js +15 -2
  44. package/dist/scripts/cleanTests.js +38 -2
  45. package/dist/scripts/cleanupMarketContext.js +69 -0
  46. package/dist/scripts/continuity.js +148 -67
  47. package/dist/scripts/derivativesIngest.js +14 -4
  48. package/dist/scripts/derivativesIngestCoinalyzeAll.js +14 -4
  49. package/dist/scripts/doctor.js +14 -4
  50. package/dist/scripts/executionCalibration.js +792 -0
  51. package/dist/scripts/infraCommon.js +10 -0
  52. package/dist/scripts/infraDown.js +14 -4
  53. package/dist/scripts/infraInit.js +24 -4
  54. package/dist/scripts/infraUp.js +14 -4
  55. package/dist/scripts/marketWs.js +222 -0
  56. package/dist/scripts/migration.js +15 -2
  57. package/dist/scripts/mlExport.js +1698 -10
  58. package/dist/scripts/mlExportSelect.js +16 -4
  59. package/dist/scripts/mlInspect.js +13 -3
  60. package/dist/scripts/mlTrainLatestSelect.js +14 -4
  61. package/dist/scripts/replay.js +8824 -0
  62. package/dist/scripts/replayRunner.js +8827 -0
  63. package/dist/scripts/replayRuntimeEvidence.js +868 -0
  64. package/dist/scripts/researchAuto.js +289 -60
  65. package/dist/scripts/results.js +3 -3
  66. package/dist/scripts/runtimeEvidence.js +605 -0
  67. package/dist/scripts/runtimeParity.js +6360 -1004
  68. package/dist/scripts/serverHealth.js +588 -0
  69. package/dist/scripts/signals.js +5623 -486
  70. package/dist/scripts/signalsDaemon.js +6167 -0
  71. package/dist/scripts/signalsSummary.js +954 -312
  72. package/dist/scripts/test-ml.js +25 -3
  73. package/dist/scripts/test.js +26 -1
  74. package/dist/scripts/user-add.js +15 -2
  75. package/dist/workers/testerWorker.js +130 -21
  76. package/package.json +18 -12
@@ -1,6 +1,28 @@
1
1
  "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
2
19
 
3
20
  // src/scripts/test-ml.ts
21
+ var test_ml_exports = {};
22
+ __export(test_ml_exports, {
23
+ main: () => main
24
+ });
25
+ module.exports = __toCommonJS(test_ml_exports);
4
26
  var import_config = require("dotenv/config");
5
27
  var import_constants = require("@tradejs/core/constants");
6
28
  var import_ml = require("@tradejs/infra/ml");
@@ -128,7 +150,7 @@ var main = async () => {
128
150
  }
129
151
  console.log("ML result:", mlResult);
130
152
  };
131
- main().catch((err) => {
132
- console.error("test-ml failed:", err);
133
- process.exit(1);
153
+ // Annotate the CommonJS export names for ESM import in node:
154
+ 0 && (module.exports = {
155
+ main
134
156
  });
@@ -1,6 +1,28 @@
1
1
  "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
2
19
 
3
20
  // src/scripts/test.ts
21
+ var test_exports = {};
22
+ __export(test_exports, {
23
+ main: () => main
24
+ });
25
+ module.exports = __toCommonJS(test_exports);
4
26
  var import_config = require("dotenv/config");
5
27
  var import_connectors = require("@tradejs/connectors");
6
28
  var getPositions = async (connector) => {
@@ -13,4 +35,7 @@ var main = async () => {
13
35
  });
14
36
  await getPositions(byBitConnector);
15
37
  };
16
- main();
38
+ // Annotate the CommonJS export names for ESM import in node:
39
+ 0 && (module.exports = {
40
+ main
41
+ });
@@ -5,6 +5,10 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
8
12
  var __copyProps = (to, from, except, desc) => {
9
13
  if (from && typeof from === "object" || typeof from === "function") {
10
14
  for (let key of __getOwnPropNames(from))
@@ -21,8 +25,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
29
 
25
30
  // src/scripts/user-add.ts
31
+ var user_add_exports = {};
32
+ __export(user_add_exports, {
33
+ main: () => main
34
+ });
35
+ module.exports = __toCommonJS(user_add_exports);
26
36
  var import_args = __toESM(require("args"));
27
37
  var import_chalk = __toESM(require("chalk"));
28
38
  var import_bcryptjs = __toESM(require("bcryptjs"));
@@ -31,7 +41,7 @@ import_args.default.example("yarn user-add -u myname -p 123456", "Create or upda
31
41
  import_args.default.option(["u", "user"], "Username", "");
32
42
  import_args.default.option(["p", "password"], "Password (plain text)", "");
33
43
  var flags = import_args.default.parse(process.argv);
34
- var run = async () => {
44
+ var main = async () => {
35
45
  const userName = String(flags.user || "").trim();
36
46
  const password = String(flags.password || "");
37
47
  if (!userName || !password) {
@@ -52,4 +62,7 @@ var run = async () => {
52
62
  console.log(import_chalk.default.green(`User ${userName} updated`));
53
63
  process.exit(0);
54
64
  };
55
- run();
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ main
68
+ });
@@ -2,51 +2,160 @@
2
2
 
3
3
  // src/workers/testerWorker.ts
4
4
  var import_backtest = require("@tradejs/node/backtest");
5
+ var import_backtest2 = require("@tradejs/core/backtest");
6
+ var import_backtestArtifacts = require("@tradejs/infra/backtestArtifacts");
5
7
  var import_ai = require("@tradejs/infra/ai");
6
8
  var import_logger = require("@tradejs/infra/logger");
7
9
  var import_ml = require("@tradejs/infra/ml");
8
10
  var import_redis = require("@tradejs/infra/redis");
9
11
  var isProcessing = false;
12
+ var resolveTestSuite = async ({
13
+ chunk,
14
+ chunkId,
15
+ userName
16
+ }) => {
17
+ if (Array.isArray(chunk)) {
18
+ return chunk;
19
+ }
20
+ return await (0, import_redis.getData)(
21
+ import_redis.redisKeys.cacheChunk(userName, String(chunkId))
22
+ );
23
+ };
24
+ var cacheTestResultArtifacts = async (userName, testResult) => {
25
+ if (!testResult) {
26
+ return;
27
+ }
28
+ const { orderLogId, inlineOrderLog, inlinePositionLog } = testResult;
29
+ if (!Array.isArray(inlineOrderLog) || !Array.isArray(inlinePositionLog)) {
30
+ return;
31
+ }
32
+ await (0, import_backtestArtifacts.writeCachedBacktestArtifacts)({
33
+ userName,
34
+ orderLogId,
35
+ orderLog: inlineOrderLog,
36
+ positionLog: inlinePositionLog
37
+ });
38
+ };
39
+ var buildResultStat = (testResult) => {
40
+ if (!testResult) {
41
+ return testResult;
42
+ }
43
+ const { inlinePositionLog, stat } = testResult;
44
+ if (!Array.isArray(inlinePositionLog) || inlinePositionLog.length === 0) {
45
+ return stat;
46
+ }
47
+ return (0, import_backtest2.calculateStatsFull)(inlinePositionLog) ?? stat;
48
+ };
49
+ var sendTestResult = async ({
50
+ userName,
51
+ test,
52
+ testResult
53
+ }) => {
54
+ await cacheTestResultArtifacts(userName, testResult);
55
+ const stat = buildResultStat(testResult);
56
+ const {
57
+ inlineOrderLog,
58
+ inlinePositionLog,
59
+ inlineReplaySignalEvaluations,
60
+ stat: _rawStat,
61
+ ...resultWithoutLogs
62
+ } = testResult;
63
+ process.send?.({
64
+ ...resultWithoutLogs,
65
+ stat,
66
+ test
67
+ });
68
+ };
69
+ var collectSharedLoopGroup = (testSuite, startIndex) => {
70
+ const group = [testSuite[startIndex]];
71
+ for (let index = startIndex + 1; index < testSuite.length; index += 1) {
72
+ const nextGroup = [...group, testSuite[index]];
73
+ if (!(0, import_backtest.canRunTestsInSharedCandleLoop)(nextGroup)) {
74
+ break;
75
+ }
76
+ group.push(testSuite[index]);
77
+ }
78
+ return group;
79
+ };
10
80
  process.on(
11
81
  "message",
12
- async ({ chunkId, userName }) => {
82
+ async ({
83
+ chunk,
84
+ chunkId,
85
+ userName
86
+ }) => {
13
87
  if (isProcessing) {
14
88
  return;
15
89
  }
16
90
  isProcessing = true;
17
91
  try {
18
- const testSuite = await (0, import_redis.getData)(
19
- import_redis.redisKeys.cacheChunk(userName, chunkId)
20
- );
21
- for await (const test of testSuite) {
92
+ const testSuite = await resolveTestSuite({
93
+ chunk,
94
+ chunkId,
95
+ userName
96
+ });
97
+ let previousTest = null;
98
+ for (let index = 0; index < testSuite.length; ) {
99
+ const test = testSuite[index];
100
+ const group = collectSharedLoopGroup(testSuite, index);
101
+ if (previousTest && (previousTest.symbol !== test.symbol || previousTest.userName !== test.userName || previousTest.connectorName !== test.connectorName)) {
102
+ (0, import_backtest.releaseTestingSymbolCache)({
103
+ userName: previousTest.userName,
104
+ connectorName: previousTest.connectorName,
105
+ symbol: previousTest.symbol
106
+ });
107
+ }
108
+ let completedTest = group[group.length - 1] ?? test;
22
109
  try {
110
+ if (group.length > 1) {
111
+ const groupResults = await (0, import_backtest.testingGroupInSharedCandleLoop)(group);
112
+ for (const { test: groupTest, result } of groupResults) {
113
+ await sendTestResult({
114
+ userName,
115
+ test: groupTest,
116
+ testResult: result
117
+ });
118
+ }
119
+ index += group.length;
120
+ continue;
121
+ }
23
122
  const testResult = await (0, import_backtest.testing)(test);
24
123
  if (!testResult) {
25
124
  throw new Error("No result");
26
125
  }
27
- const { stat, orderLogId, inlineOrderLog, inlinePositionLog } = testResult;
28
- process.send?.({
29
- stat,
30
- orderLogId,
31
- inlineOrderLog,
32
- inlinePositionLog,
33
- test
126
+ await sendTestResult({
127
+ userName,
128
+ test,
129
+ testResult
34
130
  });
131
+ index += 1;
35
132
  } catch (error) {
36
133
  const errorMessage = error instanceof Error ? error.message : String(error);
37
134
  const errorStack = error instanceof Error ? error.stack : void 0;
38
135
  import_logger.logger.error("tester worker error: %s", errorMessage);
39
- process.send?.({
40
- error: true,
41
- id: test.name,
42
- symbol: test.symbol,
43
- msg: {
44
- message: errorMessage,
45
- stack: errorStack
46
- }
47
- });
136
+ for (const failedTest of group) {
137
+ process.send?.({
138
+ error: true,
139
+ id: failedTest.name,
140
+ symbol: failedTest.symbol,
141
+ msg: {
142
+ message: errorMessage,
143
+ stack: errorStack
144
+ }
145
+ });
146
+ }
147
+ index += group.length;
148
+ } finally {
149
+ previousTest = completedTest;
48
150
  }
49
151
  }
152
+ if (previousTest) {
153
+ (0, import_backtest.releaseTestingSymbolCache)({
154
+ userName: previousTest.userName,
155
+ connectorName: previousTest.connectorName,
156
+ symbol: previousTest.symbol
157
+ });
158
+ }
50
159
  } finally {
51
160
  await (0, import_ai.closeAllAiDatasetWriters)();
52
161
  await (0, import_ml.closeAllMlDatasetWriters)();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/cli",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "Official CLI for the TradeJS open-source framework: infra setup, backtests, signals, bots, and ML workflows.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -14,7 +14,7 @@
14
14
  "homepage": "https://tradejs.dev",
15
15
  "repository": {
16
16
  "type": "git",
17
- "url": "git+https://github.com/tradejs-dev/tradejs.git",
17
+ "url": "https://github.com/TradeJS-Dev/TradeJS",
18
18
  "directory": "packages/cli"
19
19
  },
20
20
  "bugs": {
@@ -29,14 +29,14 @@
29
29
  "tradejs": "dist/cli.js"
30
30
  },
31
31
  "dependencies": {
32
- "@tradejs/base": "^1.0.8",
33
- "@tradejs/connectors": "^1.0.8",
34
- "@tradejs/core": "^1.0.8",
35
- "@tradejs/indicators": "^1.0.8",
36
- "@tradejs/infra": "^1.0.8",
37
- "@tradejs/node": "^1.0.8",
38
- "@tradejs/strategies": "^1.0.8",
39
- "@tradejs/types": "^1.0.8",
32
+ "@tradejs/base": "^1.0.10",
33
+ "@tradejs/connectors": "^1.0.10",
34
+ "@tradejs/core": "^1.0.10",
35
+ "@tradejs/indicators": "^1.0.10",
36
+ "@tradejs/infra": "^1.0.10",
37
+ "@tradejs/node": "^1.0.10",
38
+ "@tradejs/strategies": "^1.0.10",
39
+ "@tradejs/types": "^1.0.10",
40
40
  "args": "^5.0.3",
41
41
  "bcryptjs": "^2.4.3",
42
42
  "chalk": "4.1.2",
@@ -44,10 +44,12 @@
44
44
  "dotenv": "^16.4.1",
45
45
  "ioredis": "5.8.0",
46
46
  "lodash": "^4.18.1",
47
- "progress": "^2.0.3"
47
+ "progress": "^2.0.3",
48
+ "ws": "^8.18.0"
48
49
  },
49
50
  "devDependencies": {
50
- "@types/node": "^20",
51
+ "@types/node": "^24",
52
+ "@types/ws": "^8.18.1",
51
53
  "dotenv-cli": "^11.0.0",
52
54
  "ts-node": "^10.9.2",
53
55
  "tsconfig-paths": "^4.2.0",
@@ -65,17 +67,21 @@
65
67
  "clean-tests": "yarn run run:dist clean-tests",
66
68
  "doctor": "yarn run run:dist doctor",
67
69
  "ai-export": "yarn run run:dist ai-export",
70
+ "ai-pocket-search": "yarn run run:dist ai-pocket-search",
68
71
  "ai-train": "yarn run run:dist ai-train",
69
72
  "backtest": "yarn run run:dist backtest",
70
73
  "bot": "yarn run run:dist bot",
71
74
  "candles:migrate-provider": "yarn run run:dist candles:migrate-provider",
72
75
  "signals": "yarn run run:dist signals",
73
76
  "results": "yarn run run:dist results",
77
+ "replay-runtime-evidence": "yarn run run:dist replay-runtime-evidence",
78
+ "runtime-evidence": "yarn run run:dist runtime-evidence",
74
79
  "continuity": "yarn run run:dist continuity",
75
80
  "derivatives:ingest": "yarn run run:dist derivatives:ingest",
76
81
  "derivatives:ingest:coinalyze:all": "yarn run run:dist derivatives:ingest:coinalyze:all",
77
82
  "infra-init": "yarn run run:dist infra-init",
78
83
  "infra-up": "yarn run run:dist infra-up",
84
+ "market-ws": "yarn run run:dist market-ws",
79
85
  "infra-down": "yarn run run:dist infra-down",
80
86
  "spread:ingest": "yarn run run:dist spread:ingest",
81
87
  "migration": "yarn run run:dist migration",