@tradejs/cli 2.0.5 → 2.0.7
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 +3145 -1827
- package/dist/lib/aiExport.js +1822 -0
- package/dist/lib/binanceMarketContextBackfill.js +97 -88
- package/dist/lib/binanceMarketData.js +6 -3
- package/dist/lib/marketContextPrepare.js +149 -125
- package/dist/lib/runEnvironment.js +100 -55
- package/dist/lib/runFormatting.js +52 -37
- package/dist/lib/runtimeLineage.js +255 -0
- package/dist/lib/runtimeParityDetails.js +24 -1
- package/dist/lib/runtimeSignalsLoader.js +19 -0
- package/dist/lib/runtimeSignalsStorage.js +3 -0
- package/dist/lib/runtimeTradeSync.js +40 -11
- package/dist/lib/timeWindow.js +44 -16
- package/dist/scripts/aiExport.js +252 -125
- package/dist/scripts/aiPocketSearch.js +52 -37
- package/dist/scripts/aiTrain.js +52 -37
- package/dist/scripts/backtest.js +222 -144
- package/dist/scripts/binanceBreadthUniversesUpdate.js +120 -0
- package/dist/scripts/binanceMarketIngest.js +32 -33
- package/dist/scripts/candlesMigrateProvider.js +648 -419
- package/dist/scripts/doctor.js +648 -419
- package/dist/scripts/mlExport.js +57 -39
- package/dist/scripts/replay.js +1040 -255
- package/dist/scripts/replayRunner.js +1040 -255
- package/dist/scripts/replayRuntimeEvidence.js +3 -1
- package/dist/scripts/resolveExportStrategy.js +7 -2
- package/dist/scripts/results.js +52 -37
- package/dist/scripts/runtimeParity.js +193 -141
- package/dist/scripts/signals.js +433 -144
- package/dist/scripts/signalsDaemon.js +433 -144
- package/dist/scripts/signalsSummary.js +40 -11
- package/package.json +15 -14
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
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
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/scripts/binanceBreadthUniversesUpdate.ts
|
|
31
|
+
var binanceBreadthUniversesUpdate_exports = {};
|
|
32
|
+
__export(binanceBreadthUniversesUpdate_exports, {
|
|
33
|
+
BINANCE_BREADTH_UNIVERSES_RELATIVE_PATH: () => BINANCE_BREADTH_UNIVERSES_RELATIVE_PATH,
|
|
34
|
+
main: () => main
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(binanceBreadthUniversesUpdate_exports);
|
|
37
|
+
var import_config = require("dotenv/config");
|
|
38
|
+
var import_args = __toESM(require("args"));
|
|
39
|
+
var import_promises = __toESM(require("fs/promises"));
|
|
40
|
+
var import_node_path = __toESM(require("path"));
|
|
41
|
+
var import_chalk = __toESM(require("chalk"));
|
|
42
|
+
var import_connectors = require("@tradejs/connectors");
|
|
43
|
+
var import_connectors2 = require("@tradejs/node/connectors");
|
|
44
|
+
var import_strategies = require("@tradejs/node/strategies");
|
|
45
|
+
|
|
46
|
+
// src/lib/binanceMarketData.ts
|
|
47
|
+
var STABLE_QUOTE_SYMBOLS = /* @__PURE__ */ new Set([
|
|
48
|
+
"USDCUSDT",
|
|
49
|
+
"FDUSDUSDT",
|
|
50
|
+
"TUSDUSDT",
|
|
51
|
+
"BUSDUSDT",
|
|
52
|
+
"USDPUSDT",
|
|
53
|
+
"DAIUSDT"
|
|
54
|
+
]);
|
|
55
|
+
var selectBreadthUniverseFromTickers = (tickers, limit) => tickers.filter(
|
|
56
|
+
(ticker) => ticker.symbol.endsWith("USDT") && ticker.symbol !== "BTCUSDT" && !STABLE_QUOTE_SYMBOLS.has(ticker.symbol) && Number.isFinite(ticker.turnover24h) && ticker.turnover24h > 0
|
|
57
|
+
).sort((a, b) => b.turnover24h - a.turnover24h).slice(0, Math.max(0, limit)).map((ticker) => ticker.symbol);
|
|
58
|
+
|
|
59
|
+
// src/scripts/binanceBreadthUniversesUpdate.ts
|
|
60
|
+
import_args.default.example(
|
|
61
|
+
"yarn breadth:universes:update --write",
|
|
62
|
+
"Refresh the versioned Binance top5/top10/top30/top50/top100 breadth snapshot"
|
|
63
|
+
);
|
|
64
|
+
import_args.default.option(
|
|
65
|
+
["w", "write"],
|
|
66
|
+
"Write the snapshot; without this flag only print the proposed update",
|
|
67
|
+
false
|
|
68
|
+
);
|
|
69
|
+
import_args.default.option(["u", "user"], "Connector user name", "root");
|
|
70
|
+
var flags = import_args.default.parse(process.argv);
|
|
71
|
+
var BINANCE_BREADTH_UNIVERSES_RELATIVE_PATH = "packages/node/src/config/binanceBreadthUniverses.json";
|
|
72
|
+
var main = async () => {
|
|
73
|
+
const projectRoot = String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
74
|
+
const connectorCreator = await (0, import_connectors2.getConnectorCreatorByName)(
|
|
75
|
+
import_connectors.ConnectorNames.Binance,
|
|
76
|
+
projectRoot
|
|
77
|
+
);
|
|
78
|
+
if (!connectorCreator) {
|
|
79
|
+
throw new Error("Binance connector is not registered");
|
|
80
|
+
}
|
|
81
|
+
const connector = await connectorCreator({
|
|
82
|
+
userName: String(flags.user || "root"),
|
|
83
|
+
universe: "crypto"
|
|
84
|
+
});
|
|
85
|
+
const rankedSymbols = selectBreadthUniverseFromTickers(
|
|
86
|
+
await connector.getTickers(),
|
|
87
|
+
100
|
|
88
|
+
);
|
|
89
|
+
const snapshot = (0, import_strategies.buildBinanceBreadthUniverseSnapshot)({ rankedSymbols });
|
|
90
|
+
const serialized = `${JSON.stringify(snapshot, null, 2)}
|
|
91
|
+
`;
|
|
92
|
+
console.log(
|
|
93
|
+
import_chalk.default.cyan(
|
|
94
|
+
`Binance breadth snapshot ${snapshot.fingerprint}: ${Object.entries(
|
|
95
|
+
snapshot.universes
|
|
96
|
+
).map(
|
|
97
|
+
([key, definition]) => `${key}=${definition.size}:${definition.fingerprint}`
|
|
98
|
+
).join(" ")}`
|
|
99
|
+
)
|
|
100
|
+
);
|
|
101
|
+
if (!flags.write) {
|
|
102
|
+
console.log(serialized);
|
|
103
|
+
console.log(
|
|
104
|
+
import_chalk.default.yellow("Dry run only. Pass --write to update the snapshot file.")
|
|
105
|
+
);
|
|
106
|
+
return snapshot;
|
|
107
|
+
}
|
|
108
|
+
const outputPath = import_node_path.default.join(
|
|
109
|
+
projectRoot,
|
|
110
|
+
BINANCE_BREADTH_UNIVERSES_RELATIVE_PATH
|
|
111
|
+
);
|
|
112
|
+
await import_promises.default.writeFile(outputPath, serialized, "utf8");
|
|
113
|
+
console.log(import_chalk.default.green(`Updated ${outputPath}`));
|
|
114
|
+
return snapshot;
|
|
115
|
+
};
|
|
116
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
117
|
+
0 && (module.exports = {
|
|
118
|
+
BINANCE_BREADTH_UNIVERSES_RELATIVE_PATH,
|
|
119
|
+
main
|
|
120
|
+
});
|
|
@@ -37,6 +37,7 @@ var import_config = require("dotenv/config");
|
|
|
37
37
|
var import_args = __toESM(require("args"));
|
|
38
38
|
var import_chalk = __toESM(require("chalk"));
|
|
39
39
|
var import_connectors = require("@tradejs/connectors");
|
|
40
|
+
var import_strategies = require("@tradejs/node/strategies");
|
|
40
41
|
var import_timescale = require("@tradejs/infra/timescale");
|
|
41
42
|
|
|
42
43
|
// src/lib/binanceMarketData.ts
|
|
@@ -46,14 +47,6 @@ var MARKET_FEATURE_INTERVAL_MS = {
|
|
|
46
47
|
"15m": 9e5,
|
|
47
48
|
"1h": 36e5
|
|
48
49
|
};
|
|
49
|
-
var STABLE_QUOTE_SYMBOLS = /* @__PURE__ */ new Set([
|
|
50
|
-
"USDCUSDT",
|
|
51
|
-
"FDUSDUSDT",
|
|
52
|
-
"TUSDUSDT",
|
|
53
|
-
"BUSDUSDT",
|
|
54
|
-
"USDPUSDT",
|
|
55
|
-
"DAIUSDT"
|
|
56
|
-
]);
|
|
57
50
|
var safeDivide = (num, den) => Number.isFinite(num) && Number.isFinite(den) && den !== 0 ? num / den : null;
|
|
58
51
|
var mean = (values) => values.length ? values.reduce((sum, value) => sum + value, 0) / values.length : null;
|
|
59
52
|
var standardDeviation = (values) => {
|
|
@@ -106,23 +99,23 @@ var normalizeMarketFeatureInterval = (value) => {
|
|
|
106
99
|
return "15m";
|
|
107
100
|
};
|
|
108
101
|
var normalizeBinanceSymbols = (value) => String(value || "").split(",").map((item) => item.trim().toUpperCase()).filter(Boolean);
|
|
109
|
-
var selectBreadthUniverseFromTickers = (tickers, limit) => tickers.filter(
|
|
110
|
-
(ticker) => ticker.symbol.endsWith("USDT") && ticker.symbol !== "BTCUSDT" && !STABLE_QUOTE_SYMBOLS.has(ticker.symbol) && Number.isFinite(ticker.turnover24h) && ticker.turnover24h > 0
|
|
111
|
-
).sort((a, b) => b.turnover24h - a.turnover24h).slice(0, Math.max(0, limit)).map((ticker) => ticker.symbol);
|
|
112
102
|
var estimateBinanceMarketDataVolume = ({
|
|
113
103
|
symbols,
|
|
114
104
|
days,
|
|
115
105
|
interval,
|
|
116
106
|
includeAggTrades,
|
|
117
107
|
includeBreadth,
|
|
118
|
-
|
|
108
|
+
breadthSizes
|
|
119
109
|
}) => {
|
|
120
110
|
const intervalMs = MARKET_FEATURE_INTERVAL_MS[interval];
|
|
121
111
|
const bucketRowsPerSymbol = Math.ceil(days * 864e5 / intervalMs);
|
|
122
112
|
const aggTradeBucketRows = includeAggTrades ? symbols.length * bucketRowsPerSymbol : 0;
|
|
123
|
-
const
|
|
113
|
+
const normalizedBreadthSizes = breadthSizes.filter(
|
|
114
|
+
(size) => Number.isFinite(size) && size > 0
|
|
115
|
+
);
|
|
116
|
+
const breadthSymbols = includeBreadth ? Math.max(0, ...normalizedBreadthSizes) : 0;
|
|
124
117
|
const breadthCandleRows = breadthSymbols * bucketRowsPerSymbol;
|
|
125
|
-
const breadthRows = includeBreadth ? bucketRowsPerSymbol : 0;
|
|
118
|
+
const breadthRows = includeBreadth ? bucketRowsPerSymbol * normalizedBreadthSizes.length : 0;
|
|
126
119
|
return {
|
|
127
120
|
interval,
|
|
128
121
|
days,
|
|
@@ -379,11 +372,6 @@ import_args.default.option(
|
|
|
379
372
|
["w", "write"],
|
|
380
373
|
"Write rows to Timescale; without this flag only estimate"
|
|
381
374
|
);
|
|
382
|
-
import_args.default.option(
|
|
383
|
-
["B", "breadthLimit"],
|
|
384
|
-
"Top USDT symbols used for breadth universe",
|
|
385
|
-
30
|
|
386
|
-
);
|
|
387
375
|
import_args.default.option(
|
|
388
376
|
["M", "batchMinutes"],
|
|
389
377
|
"aggTrades request window size in minutes",
|
|
@@ -463,7 +451,7 @@ var main = async () => {
|
|
|
463
451
|
const interval = normalizeMarketFeatureInterval(flags.interval);
|
|
464
452
|
const hours = flags.hours == null ? null : asFloat(flags.hours, 0);
|
|
465
453
|
const days = hours != null && hours > 0 ? hours / 24 : asFloat(flags.days, 1);
|
|
466
|
-
const
|
|
454
|
+
const breadthUniverses = (0, import_strategies.getBinanceBreadthUniverses)();
|
|
467
455
|
const batchMinutes = asInt(flags.batchMinutes, 15);
|
|
468
456
|
const requestDelayMs = asInt(flags.requestDelayMs, 75);
|
|
469
457
|
const includeAll = Boolean(flags.all);
|
|
@@ -481,7 +469,7 @@ var main = async () => {
|
|
|
481
469
|
interval,
|
|
482
470
|
includeAggTrades: modes.includeAggTrades,
|
|
483
471
|
includeBreadth: modes.includeBreadth,
|
|
484
|
-
|
|
472
|
+
breadthSizes: breadthUniverses.map(({ size }) => size)
|
|
485
473
|
});
|
|
486
474
|
printEstimate(estimate);
|
|
487
475
|
if (!flags.write) {
|
|
@@ -520,11 +508,7 @@ var main = async () => {
|
|
|
520
508
|
}
|
|
521
509
|
}
|
|
522
510
|
if (modes.includeBreadth) {
|
|
523
|
-
const
|
|
524
|
-
const breadthSymbols = selectBreadthUniverseFromTickers(
|
|
525
|
-
tickers,
|
|
526
|
-
breadthLimit
|
|
527
|
-
);
|
|
511
|
+
const breadthSymbols = breadthUniverses.at(-1)?.symbols ?? [];
|
|
528
512
|
const connectorInterval = intervalToConnectorInterval(interval);
|
|
529
513
|
const candlesBySymbol = {};
|
|
530
514
|
for (const symbol of breadthSymbols) {
|
|
@@ -541,14 +525,29 @@ var main = async () => {
|
|
|
541
525
|
process.stdout.write(`${candles.length}
|
|
542
526
|
`);
|
|
543
527
|
}
|
|
544
|
-
const
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
528
|
+
const btcCandles = await connector.kline({
|
|
529
|
+
symbol: "BTCUSDT",
|
|
530
|
+
interval: connectorInterval,
|
|
531
|
+
start: fromMs,
|
|
532
|
+
end: toMs,
|
|
533
|
+
silent: true
|
|
549
534
|
});
|
|
550
|
-
|
|
551
|
-
|
|
535
|
+
for (const definition of breadthUniverses) {
|
|
536
|
+
const symbolSet = new Set(definition.symbols);
|
|
537
|
+
const universeCandles = Object.fromEntries(
|
|
538
|
+
Object.entries(candlesBySymbol).filter(
|
|
539
|
+
([symbol]) => symbolSet.has(symbol)
|
|
540
|
+
)
|
|
541
|
+
);
|
|
542
|
+
const rows = buildMarketBreadthRows({
|
|
543
|
+
universe: definition.universe,
|
|
544
|
+
interval,
|
|
545
|
+
candlesBySymbol: universeCandles,
|
|
546
|
+
btcCandles
|
|
547
|
+
});
|
|
548
|
+
await (0, import_timescale.upsertMarketBreadthRows)(rows);
|
|
549
|
+
breadthRows += rows.length;
|
|
550
|
+
}
|
|
552
551
|
}
|
|
553
552
|
console.log(import_chalk.default.green("Binance market ingest done"));
|
|
554
553
|
console.log(`aggTrades raw rows: ${aggTradesRaw}`);
|