@tradejs/cli 1.0.9 → 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.
- package/dist/cli.js +29497 -13537
- package/dist/lib/aiPocketSearch.js +1316 -0
- package/dist/lib/aiTrainCharts.js +711 -0
- package/dist/lib/aiTrainDataset.js +40 -0
- package/dist/lib/aiTrainEvaluationDump.js +76 -0
- package/dist/lib/aiTrainMetrics.js +148 -8
- package/dist/lib/aiTrainOptions.js +130 -0
- package/dist/lib/aiTrainQuarantine.js +199 -0
- package/dist/lib/aiTrainResearch.js +467 -0
- package/dist/lib/binanceMarketContextBackfill.js +841 -0
- package/dist/lib/binanceMarketData.js +392 -0
- package/dist/lib/coinMarketCapContextBackfill.js +1088 -0
- package/dist/lib/continuity.js +60 -0
- package/dist/lib/derivativesContextBackfill.js +490 -77
- package/dist/lib/executionCalibration.js +705 -0
- package/dist/lib/marketContextPrepare.js +4403 -0
- package/dist/lib/paritySummary.js +101 -0
- package/dist/lib/runBot.js +1 -0
- package/dist/lib/runEnvironment.js +2254 -0
- package/dist/lib/runFormatting.js +1657 -0
- package/dist/lib/runtimeDebugEvidence.js +526 -0
- package/dist/lib/runtimeModeConfig.js +53 -0
- package/dist/lib/runtimeParity.js +88 -11
- package/dist/lib/runtimeParityDetails.js +751 -0
- package/dist/lib/runtimeRedis.js +157 -0
- package/dist/lib/runtimeSignalsLoader.js +40 -6
- package/dist/lib/runtimeSignalsStorage.js +45 -22
- package/dist/lib/runtimeStrategyBacktest.js +134 -0
- package/dist/lib/runtimeTradeSync.js +263 -0
- package/dist/lib/telegramReports.js +9 -0
- package/dist/lib/tickerUniverseCache.js +116 -0
- package/dist/lib/timeWindow.js +3 -3
- package/dist/scripts/agentRun.js +14 -8
- package/dist/scripts/aiExport.js +1721 -7
- package/dist/scripts/aiExportSelect.js +16 -4
- package/dist/scripts/aiPocketSearch.js +4190 -0
- package/dist/scripts/aiTrain.js +1866 -87
- package/dist/scripts/backtest.js +4509 -818
- package/dist/scripts/binanceMarketIngest.js +565 -0
- package/dist/scripts/bot.js +16 -2
- package/dist/scripts/candlesMigrateProvider.js +32 -22
- package/dist/scripts/cleanDir.js +15 -2
- package/dist/scripts/cleanRedis.js +15 -2
- package/dist/scripts/cleanTests.js +38 -2
- package/dist/scripts/cleanupMarketContext.js +69 -0
- package/dist/scripts/continuity.js +148 -67
- package/dist/scripts/derivativesIngest.js +14 -4
- package/dist/scripts/derivativesIngestCoinalyzeAll.js +14 -4
- package/dist/scripts/doctor.js +14 -4
- package/dist/scripts/executionCalibration.js +792 -0
- package/dist/scripts/infraCommon.js +10 -0
- package/dist/scripts/infraDown.js +14 -4
- package/dist/scripts/infraInit.js +24 -4
- package/dist/scripts/infraUp.js +14 -4
- package/dist/scripts/marketWs.js +222 -0
- package/dist/scripts/migration.js +15 -2
- package/dist/scripts/mlExport.js +1698 -10
- package/dist/scripts/mlExportSelect.js +16 -4
- package/dist/scripts/mlInspect.js +13 -3
- package/dist/scripts/mlTrainLatestSelect.js +14 -4
- package/dist/scripts/replay.js +8824 -0
- package/dist/scripts/replayRunner.js +8827 -0
- package/dist/scripts/replayRuntimeEvidence.js +868 -0
- package/dist/scripts/researchAuto.js +286 -59
- package/dist/scripts/results.js +3 -3
- package/dist/scripts/runtimeEvidence.js +605 -0
- package/dist/scripts/runtimeParity.js +6362 -1043
- package/dist/scripts/serverHealth.js +588 -0
- package/dist/scripts/signals.js +5590 -511
- package/dist/scripts/signalsDaemon.js +6167 -0
- package/dist/scripts/signalsSummary.js +833 -248
- package/dist/scripts/test-ml.js +25 -3
- package/dist/scripts/test.js +26 -1
- package/dist/scripts/user-add.js +15 -2
- package/dist/workers/testerWorker.js +130 -21
- 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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|