@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.
@@ -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
- breadthLimit
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 breadthSymbols = includeBreadth ? Math.max(0, breadthLimit) : 0;
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 breadthLimit = asInt(flags.breadthLimit, 30);
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
- breadthLimit
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 tickers = await connector.getTickers();
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 universe = `binance_top${breadthSymbols.length}_usdt`;
545
- const rows = buildMarketBreadthRows({
546
- universe,
547
- interval,
548
- candlesBySymbol
528
+ const btcCandles = await connector.kline({
529
+ symbol: "BTCUSDT",
530
+ interval: connectorInterval,
531
+ start: fromMs,
532
+ end: toMs,
533
+ silent: true
549
534
  });
550
- await (0, import_timescale.upsertMarketBreadthRows)(rows);
551
- breadthRows += rows.length;
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}`);