@tradejs/cli 1.0.9 → 1.0.11

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 (77) hide show
  1. package/README.md +13 -4
  2. package/dist/cli.js +29531 -13520
  3. package/dist/lib/aiPocketSearch.js +1316 -0
  4. package/dist/lib/aiTrainCharts.js +711 -0
  5. package/dist/lib/aiTrainDataset.js +40 -0
  6. package/dist/lib/aiTrainEvaluationDump.js +76 -0
  7. package/dist/lib/aiTrainMetrics.js +148 -8
  8. package/dist/lib/aiTrainOptions.js +130 -0
  9. package/dist/lib/aiTrainQuarantine.js +199 -0
  10. package/dist/lib/aiTrainResearch.js +467 -0
  11. package/dist/lib/binanceMarketContextBackfill.js +841 -0
  12. package/dist/lib/binanceMarketData.js +392 -0
  13. package/dist/lib/coinMarketCapContextBackfill.js +1126 -0
  14. package/dist/lib/continuity.js +60 -0
  15. package/dist/lib/derivativesContextBackfill.js +490 -77
  16. package/dist/lib/executionCalibration.js +705 -0
  17. package/dist/lib/marketContextPrepare.js +4441 -0
  18. package/dist/lib/paritySummary.js +101 -0
  19. package/dist/lib/runBot.js +1 -0
  20. package/dist/lib/runEnvironment.js +2259 -0
  21. package/dist/lib/runFormatting.js +1657 -0
  22. package/dist/lib/runtimeDebugEvidence.js +526 -0
  23. package/dist/lib/runtimeModeConfig.js +53 -0
  24. package/dist/lib/runtimeParity.js +88 -11
  25. package/dist/lib/runtimeParityDetails.js +751 -0
  26. package/dist/lib/runtimeRedis.js +157 -0
  27. package/dist/lib/runtimeSignalsLoader.js +40 -6
  28. package/dist/lib/runtimeSignalsStorage.js +45 -22
  29. package/dist/lib/runtimeStrategyBacktest.js +134 -0
  30. package/dist/lib/runtimeTradeSync.js +263 -0
  31. package/dist/lib/telegramReports.js +9 -0
  32. package/dist/lib/tickerUniverseCache.js +116 -0
  33. package/dist/lib/timeWindow.js +3 -3
  34. package/dist/scripts/agentRun.js +14 -8
  35. package/dist/scripts/aiExport.js +1721 -7
  36. package/dist/scripts/aiExportSelect.js +16 -4
  37. package/dist/scripts/aiPocketSearch.js +4190 -0
  38. package/dist/scripts/aiTrain.js +1866 -87
  39. package/dist/scripts/backtest.js +4534 -803
  40. package/dist/scripts/binanceMarketIngest.js +565 -0
  41. package/dist/scripts/bot.js +16 -2
  42. package/dist/scripts/candlesMigrateProvider.js +32 -22
  43. package/dist/scripts/cleanDir.js +15 -2
  44. package/dist/scripts/cleanRedis.js +15 -2
  45. package/dist/scripts/cleanTests.js +38 -2
  46. package/dist/scripts/cleanupMarketContext.js +69 -0
  47. package/dist/scripts/continuity.js +148 -67
  48. package/dist/scripts/derivativesIngest.js +14 -4
  49. package/dist/scripts/derivativesIngestCoinalyzeAll.js +14 -4
  50. package/dist/scripts/doctor.js +14 -4
  51. package/dist/scripts/executionCalibration.js +792 -0
  52. package/dist/scripts/infraCommon.js +18 -5
  53. package/dist/scripts/infraDown.js +14 -4
  54. package/dist/scripts/infraInit.js +32 -9
  55. package/dist/scripts/infraUp.js +24 -6
  56. package/dist/scripts/marketWs.js +222 -0
  57. package/dist/scripts/migration.js +15 -2
  58. package/dist/scripts/mlExport.js +1698 -10
  59. package/dist/scripts/mlExportSelect.js +16 -4
  60. package/dist/scripts/mlInspect.js +13 -3
  61. package/dist/scripts/mlTrainLatestSelect.js +14 -4
  62. package/dist/scripts/replay.js +8867 -0
  63. package/dist/scripts/replayRunner.js +8870 -0
  64. package/dist/scripts/replayRuntimeEvidence.js +868 -0
  65. package/dist/scripts/researchAuto.js +286 -59
  66. package/dist/scripts/results.js +3 -3
  67. package/dist/scripts/runtimeEvidence.js +605 -0
  68. package/dist/scripts/runtimeParity.js +6400 -1043
  69. package/dist/scripts/serverHealth.js +588 -0
  70. package/dist/scripts/signals.js +5628 -511
  71. package/dist/scripts/signalsDaemon.js +6205 -0
  72. package/dist/scripts/signalsSummary.js +833 -248
  73. package/dist/scripts/test-ml.js +25 -3
  74. package/dist/scripts/test.js +26 -1
  75. package/dist/scripts/user-add.js +15 -2
  76. package/dist/workers/testerWorker.js +130 -21
  77. package/package.json +18 -12
@@ -25,12 +25,19 @@ __export(runtimeParity_exports, {
25
25
  extractBacktestEntryParityEntries: () => extractBacktestEntryParityEntries,
26
26
  extractRuntimeParityEntries: () => extractRuntimeParityEntries,
27
27
  findRuntimeDuplicateGroups: () => findRuntimeDuplicateGroups,
28
+ getBacktestParityComparisonTimestamp: () => getBacktestParityComparisonTimestamp,
28
29
  summarizeMatchedParity: () => summarizeMatchedParity
29
30
  });
30
31
  module.exports = __toCommonJS(runtimeParity_exports);
31
32
  var toFiniteNumberOrNull = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
32
33
  var toGroupKey = (entry) => `${entry.strategy}::${entry.symbol}::${entry.direction}`;
33
34
  var toRuntimeDuplicateKey = (entry) => `${toGroupKey(entry)}::${entry.timestamp}`;
35
+ var getBacktestParityComparisonTimestamp = (entry, timestampOffsetMs = 0) => {
36
+ if (timestampOffsetMs > 0 && entry.signalTimestamp != null && entry.timestamp >= entry.signalTimestamp + timestampOffsetMs) {
37
+ return entry.timestamp;
38
+ }
39
+ return (entry.signalTimestamp ?? entry.timestamp) + timestampOffsetMs;
40
+ };
34
41
  var sortTradeParityEntries = (left, right) => left.timestamp - right.timestamp || left.strategy.localeCompare(right.strategy) || left.symbol.localeCompare(right.symbol) || left.direction.localeCompare(right.direction) || left.id.localeCompare(right.id);
35
42
  var buildPriceDeltaPct = (leftPrice, rightPrice) => {
36
43
  if (leftPrice == null || rightPrice == null || !Number.isFinite(leftPrice) || !Number.isFinite(rightPrice) || leftPrice === 0) {
@@ -38,26 +45,82 @@ var buildPriceDeltaPct = (leftPrice, rightPrice) => {
38
45
  }
39
46
  return Math.abs((rightPrice - leftPrice) / leftPrice * 100);
40
47
  };
48
+ var toExitType = (type) => {
49
+ if (!type) return null;
50
+ if (type === "CLOSE_LONG" || type === "CLOSE_SHORT") return "exit";
51
+ if (type === "TAKE_PROFIT_LONG" || type === "TAKE_PROFIT_SHORT") return "tp";
52
+ if (type === "STOP_LOSS_LONG" || type === "STOP_LOSS_SHORT") return "sl";
53
+ return null;
54
+ };
55
+ var resolveBacktestExitType = (values) => {
56
+ const unique = [...new Set(values.filter(Boolean))];
57
+ if (!unique.length) return "open";
58
+ return unique.length === 1 ? unique[0] : "mixed";
59
+ };
41
60
  var extractBacktestEntryParityEntries = (orderLog) => {
42
61
  if (!Array.isArray(orderLog)) {
43
62
  return [];
44
63
  }
45
- return orderLog.filter(
46
- (item) => (item.type === "OPEN_LONG" || item.type === "OPEN_SHORT") && item.signal && typeof item.signal.strategy === "string" && typeof item.signal.symbol === "string" && (item.signal.direction === "LONG" || item.signal.direction === "SHORT")
47
- ).map((item, index) => {
64
+ const entries = [];
65
+ for (let index = 0; index < orderLog.length; index += 1) {
66
+ const item = orderLog[index];
67
+ if (item.type !== "OPEN_LONG" && item.type !== "OPEN_SHORT") {
68
+ continue;
69
+ }
70
+ if (!item.signal || typeof item.signal.strategy !== "string" || typeof item.signal.symbol !== "string" || item.signal.direction !== "LONG" && item.signal.direction !== "SHORT") {
71
+ continue;
72
+ }
48
73
  const signal = item.signal;
49
- const timestamp = typeof signal.timestamp === "number" && Number.isFinite(signal.timestamp) ? signal.timestamp : item.timestamp;
50
- return {
74
+ const signalTimestamp = typeof signal.timestamp === "number" && Number.isFinite(signal.timestamp) ? signal.timestamp : null;
75
+ const timestamp = item.timestamp;
76
+ const exitItems = [];
77
+ for (const candidate of orderLog.slice(index + 1)) {
78
+ if (candidate.symbol !== item.symbol) {
79
+ continue;
80
+ }
81
+ if (candidate.type === "OPEN_LONG" || candidate.type === "OPEN_SHORT") {
82
+ break;
83
+ }
84
+ exitItems.push(candidate);
85
+ }
86
+ const closingExitItems = exitItems.filter(
87
+ (candidate) => toExitType(candidate.type)
88
+ );
89
+ const finalExit = closingExitItems[closingExitItems.length - 1] ?? null;
90
+ const entryFee = toFiniteNumberOrNull(item.fee);
91
+ const exitFee = closingExitItems.reduce((sum, candidate) => {
92
+ const fee = toFiniteNumberOrNull(candidate.fee);
93
+ return sum + (fee ?? 0);
94
+ }, 0);
95
+ const expectedPnl = [item, ...closingExitItems].reduce((sum, candidate) => {
96
+ const profit = toFiniteNumberOrNull(candidate.profit);
97
+ return sum + (profit ?? 0);
98
+ }, 0);
99
+ const totalFee = (entryFee ?? 0) + exitFee;
100
+ entries.push({
51
101
  id: typeof signal.signalId === "string" && signal.signalId.trim() ? signal.signalId : `backtest-${index}-${timestamp}`,
52
102
  source: "backtest",
53
103
  strategy: signal.strategy,
54
104
  symbol: signal.symbol,
55
105
  direction: signal.direction,
106
+ qty: toFiniteNumberOrNull(item.qty),
56
107
  timestamp,
108
+ signalTimestamp,
57
109
  price: toFiniteNumberOrNull(item.price),
58
- signalId: typeof signal.signalId === "string" ? signal.signalId : void 0
59
- };
60
- }).sort((left, right) => left.timestamp - right.timestamp);
110
+ signalId: typeof signal.signalId === "string" ? signal.signalId : void 0,
111
+ exitType: resolveBacktestExitType(
112
+ closingExitItems.map((candidate) => toExitType(candidate.type))
113
+ ),
114
+ exitTimestamp: finalExit?.timestamp ?? null,
115
+ exitPrice: toFiniteNumberOrNull(finalExit?.price),
116
+ expectedPnl,
117
+ entryFee,
118
+ exitFee,
119
+ fundingFee: 0,
120
+ totalFee
121
+ });
122
+ }
123
+ return entries.sort((left, right) => left.timestamp - right.timestamp);
61
124
  };
62
125
  var extractRuntimeParityEntries = (trades) => trades.filter(
63
126
  (trade) => typeof trade.strategy === "string" && typeof trade.symbol === "string" && (trade.direction === "LONG" || trade.direction === "SHORT") && typeof trade.entryTimestamp === "number" && Number.isFinite(trade.entryTimestamp)
@@ -67,10 +130,19 @@ var extractRuntimeParityEntries = (trades) => trades.filter(
67
130
  strategy: trade.strategy,
68
131
  symbol: trade.symbol,
69
132
  direction: trade.direction,
133
+ qty: toFiniteNumberOrNull(trade.qty),
70
134
  timestamp: trade.entryTimestamp,
71
135
  price: toFiniteNumberOrNull(trade.entryPrice),
72
136
  orderId: trade.orderId,
73
- signalId: typeof trade.signalId === "string" ? trade.signalId : void 0
137
+ signalId: typeof trade.signalId === "string" ? trade.signalId : void 0,
138
+ exitType: trade.exitType ?? null,
139
+ exitTimestamp: trade.exitTimestamp ?? null,
140
+ exitPrice: trade.exitPrice ?? null,
141
+ realizedPnl: trade.closedPnl ?? trade.currentPnl ?? null,
142
+ entryFee: trade.openFee ?? null,
143
+ exitFee: trade.closeFee ?? null,
144
+ fundingFee: trade.fundingFee ?? null,
145
+ totalFee: trade.totalFee ?? null
74
146
  })).sort((left, right) => left.timestamp - right.timestamp);
75
147
  var findRuntimeDuplicateGroups = (entries) => {
76
148
  const groups = /* @__PURE__ */ new Map();
@@ -117,7 +189,8 @@ var dedupeRuntimeParityEntries = (entries) => {
117
189
  var compareTradeParityEntries = ({
118
190
  runtimeEntries,
119
191
  backtestEntries,
120
- toleranceMs
192
+ toleranceMs,
193
+ backtestTimestampOffsetMs = 0
121
194
  }) => {
122
195
  const matched = [];
123
196
  const runtimeOnly = [];
@@ -160,7 +233,10 @@ var compareTradeParityEntries = ({
160
233
  continue;
161
234
  }
162
235
  const diff = Math.abs(
163
- candidate.entry.timestamp - runtimeEntry.timestamp
236
+ getBacktestParityComparisonTimestamp(
237
+ candidate.entry,
238
+ backtestTimestampOffsetMs
239
+ ) - runtimeEntry.timestamp
164
240
  );
165
241
  if (diff > toleranceMs || diff >= bestDiff) {
166
242
  continue;
@@ -230,5 +306,6 @@ var summarizeMatchedParity = (matched) => {
230
306
  extractBacktestEntryParityEntries,
231
307
  extractRuntimeParityEntries,
232
308
  findRuntimeDuplicateGroups,
309
+ getBacktestParityComparisonTimestamp,
233
310
  summarizeMatchedParity
234
311
  });