@tradejs/cli 3.1.27 → 3.1.28-beta.252

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.
@@ -4614,6 +4614,7 @@ var createSignalsTickerEvaluator = ({
4614
4614
  primaryEthClosedData,
4615
4615
  primaryEthByTimestamp,
4616
4616
  runtimeStrategies,
4617
+ matchesStrategySymbol,
4617
4618
  strategyStats,
4618
4619
  runtimeCloseNotifications,
4619
4620
  lifecycle,
@@ -4654,6 +4655,9 @@ var createSignalsTickerEvaluator = ({
4654
4655
  );
4655
4656
  const strategySignals = [];
4656
4657
  for (const runtimeStrategy of runtimeStrategies) {
4658
+ if (matchesStrategySymbol && !matchesStrategySymbol(runtimeStrategy, symbol)) {
4659
+ continue;
4660
+ }
4657
4661
  const {
4658
4662
  strategyName,
4659
4663
  strategyRevision,
@@ -4858,6 +4862,28 @@ var createSignalsTickerEvaluator = ({
4858
4862
 
4859
4863
  // src/lib/signals/configuredScopes.ts
4860
4864
  var sorted = (values) => values ? [...values].sort() : [];
4865
+ var normalizeSymbol = (value) => value.trim().toUpperCase();
4866
+ var isActiveTradeInScope = ({
4867
+ trade,
4868
+ deploymentId,
4869
+ universe,
4870
+ accountId,
4871
+ interval
4872
+ }) => trade.status === "active" && trade.deploymentId === deploymentId && (trade.universe ?? "crypto") === universe && (!trade.accountId || trade.accountId === accountId) && (!trade.interval || String(trade.interval) === String(interval));
4873
+ var mergeConfiguredStrategySelections = (strategies) => {
4874
+ if (strategies.some(({ selection }) => !selection)) {
4875
+ return void 0;
4876
+ }
4877
+ return {
4878
+ tickers: [
4879
+ ...new Set(
4880
+ strategies.flatMap(
4881
+ ({ selection }) => (selection?.tickers ?? []).map(normalizeSymbol)
4882
+ )
4883
+ )
4884
+ ].sort()
4885
+ };
4886
+ };
4861
4887
  var formatConfiguredStrategyIdentity = (strategy) => `${strategy.strategyName}@${strategy.strategyRevision}[${strategy.controlState}]`;
4862
4888
  var getConfiguredScopeActiveSymbols = ({
4863
4889
  trades,
@@ -4871,11 +4897,48 @@ var getConfiguredScopeActiveSymbols = ({
4871
4897
  return [
4872
4898
  ...new Set(
4873
4899
  trades.filter(
4874
- (trade) => trade.status === "active" && trade.deploymentId === deploymentId && strategyNameSet.has(trade.strategy) && (trade.universe ?? "crypto") === universe && (!trade.accountId || trade.accountId === accountId) && (!trade.interval || String(trade.interval) === String(interval))
4875
- ).map(({ symbol }) => symbol)
4900
+ (trade) => isActiveTradeInScope({
4901
+ trade,
4902
+ deploymentId,
4903
+ universe,
4904
+ accountId,
4905
+ interval
4906
+ }) && strategyNameSet.has(trade.strategy) && Boolean(trade.symbol)
4907
+ ).map(({ symbol }) => normalizeSymbol(symbol))
4876
4908
  )
4877
4909
  ].sort();
4878
4910
  };
4911
+ var createConfiguredStrategySymbolMatcher = ({
4912
+ trades,
4913
+ deploymentId,
4914
+ universe,
4915
+ accountId,
4916
+ interval
4917
+ }) => {
4918
+ const activeStrategySymbols = new Set(
4919
+ trades.filter(
4920
+ (trade) => isActiveTradeInScope({
4921
+ trade,
4922
+ deploymentId,
4923
+ universe,
4924
+ accountId,
4925
+ interval
4926
+ })
4927
+ ).map(
4928
+ ({ strategy, symbol }) => `${strategy}\0${normalizeSymbol(symbol)}`
4929
+ )
4930
+ );
4931
+ return (strategy, symbol) => {
4932
+ if (!strategy.selection) return true;
4933
+ const normalizedSymbol = normalizeSymbol(symbol);
4934
+ return strategy.selection.tickers.some((ticker) => {
4935
+ const normalizedTicker = normalizeSymbol(ticker);
4936
+ return normalizedTicker === normalizedSymbol || universe === "crypto" && `${normalizedTicker}USDT` === normalizedSymbol;
4937
+ }) || activeStrategySymbols.has(
4938
+ `${strategy.strategyName}\0${normalizedSymbol}`
4939
+ );
4940
+ };
4941
+ };
4879
4942
  var buildConfiguredSignalsScopes = ({
4880
4943
  connectorName,
4881
4944
  deployment,
@@ -4893,15 +4956,11 @@ var buildConfiguredSignalsScopes = ({
4893
4956
  });
4894
4957
  const groups = /* @__PURE__ */ new Map();
4895
4958
  for (const strategy of strategies) {
4896
- const selectionIdentity = JSON.stringify({
4897
- tickers: sorted(strategy.selection?.tickers)
4898
- });
4899
4959
  const baseKey = [
4900
4960
  connectorName,
4901
4961
  strategy.universe,
4902
4962
  strategy.accountId ?? "default",
4903
- strategy.interval,
4904
- selectionIdentity
4963
+ strategy.interval
4905
4964
  ].join(":");
4906
4965
  const group = groups.get(baseKey) ?? {
4907
4966
  scope: {
@@ -4909,26 +4968,31 @@ var buildConfiguredSignalsScopes = ({
4909
4968
  universe: strategy.universe,
4910
4969
  accountId: strategy.accountId,
4911
4970
  interval: strategy.interval,
4912
- strategyNames: [],
4913
- ...strategy.selection ? {
4914
- selection: { tickers: [...strategy.selection.tickers] }
4915
- } : {}
4971
+ strategyNames: []
4916
4972
  },
4917
- strategyIdentities: []
4973
+ strategyIdentities: [],
4974
+ strategies: []
4918
4975
  };
4919
4976
  group.scope.strategyNames.push(strategy.strategyName);
4920
4977
  group.strategyIdentities.push(formatConfiguredStrategyIdentity(strategy));
4978
+ group.strategies.push(strategy);
4921
4979
  groups.set(baseKey, group);
4922
4980
  }
4923
- return [...groups.entries()].map(([baseKey, group]) => ({
4924
- key: [baseKey, deploymentIdentity, ...group.strategyIdentities.sort()].join(
4925
- ":"
4926
- ),
4927
- scope: {
4928
- ...group.scope,
4929
- strategyNames: [...group.scope.strategyNames].sort()
4930
- }
4931
- }));
4981
+ return [...groups.entries()].map(([baseKey, group]) => {
4982
+ const selection = mergeConfiguredStrategySelections(group.strategies);
4983
+ return {
4984
+ key: [
4985
+ baseKey,
4986
+ deploymentIdentity,
4987
+ ...group.strategyIdentities.sort()
4988
+ ].join(":"),
4989
+ scope: {
4990
+ ...group.scope,
4991
+ strategyNames: [...group.scope.strategyNames].sort(),
4992
+ ...selection ? { selection } : {}
4993
+ }
4994
+ };
4995
+ });
4932
4996
  };
4933
4997
 
4934
4998
  // src/lib/runtimeEvidenceCompositionSnapshots.ts
@@ -5453,10 +5517,12 @@ var createSignalsRunner = (config2) => {
5453
5517
  selection
5454
5518
  } = session;
5455
5519
  const universe = sessionUniverse ?? marketConnector.universe ?? "crypto";
5456
- const selectedActiveSymbols = !config2.tickers && selection?.tickers?.length && strategyNames?.length ? getConfiguredScopeActiveSymbols({
5457
- trades: await loadRuntimeActiveTrades(config2.userName),
5520
+ const activeScopeStrategyNames = strategyNames?.length ? strategyNames : deployment?.strategies.filter(({ enabled }) => enabled).map(({ strategyName }) => strategyName) ?? [];
5521
+ const runtimeActiveTrades = deployment?.id && activeScopeStrategyNames.length ? await loadRuntimeActiveTrades(config2.userName) : [];
5522
+ const selectedActiveSymbols = !config2.tickers && activeScopeStrategyNames.length ? getConfiguredScopeActiveSymbols({
5523
+ trades: runtimeActiveTrades,
5458
5524
  deploymentId: deployment?.id ?? "",
5459
- strategyNames,
5525
+ strategyNames: activeScopeStrategyNames,
5460
5526
  universe,
5461
5527
  accountId,
5462
5528
  interval: interval2
@@ -5465,11 +5531,11 @@ var createSignalsRunner = (config2) => {
5465
5531
  if (selectedActiveSymbols.length) {
5466
5532
  import_logger4.logger.info(
5467
5533
  import_chalk7.default.gray(
5468
- `strategy selection retained active symbols: ${selectedActiveSymbols.join(", ")}`
5534
+ `runtime scope retained active symbols: ${selectedActiveSymbols.join(", ")}`
5469
5535
  )
5470
5536
  );
5471
5537
  }
5472
- const tickers = await timeOperation2("tickers load", () => {
5538
+ const loadedTickers = await timeOperation2("tickers load", () => {
5473
5539
  const baseArgs = [
5474
5540
  marketConnector,
5475
5541
  config2.tickers || selectedTickers?.join(",") || deployment?.tickers?.join(","),
@@ -5482,6 +5548,7 @@ var createSignalsRunner = (config2) => {
5482
5548
  assetClasses: deployment?.assetClasses
5483
5549
  }) : (0, import_cli2.getTickers)(...baseArgs);
5484
5550
  });
5551
+ const tickers = config2.tickers ? loadedTickers : [.../* @__PURE__ */ new Set([...loadedTickers, ...selectedActiveSymbols])];
5485
5552
  if (universe === "tradfi" && typeof marketConnector.listInstruments !== "function") {
5486
5553
  throw new Error("TradFi connector must implement listInstruments");
5487
5554
  }
@@ -5635,10 +5702,19 @@ var createSignalsRunner = (config2) => {
5635
5702
  );
5636
5703
  return;
5637
5704
  }
5705
+ const matchesStrategySymbol = createConfiguredStrategySymbolMatcher({
5706
+ trades: runtimeActiveTrades,
5707
+ deploymentId: deployment?.id ?? "",
5708
+ universe,
5709
+ accountId,
5710
+ interval: interval2
5711
+ });
5638
5712
  lifecycle.retain(
5639
5713
  new Set(
5640
5714
  tickers.flatMap(
5641
- (symbol) => runtimeStrategies.map(
5715
+ (symbol) => runtimeStrategies.filter(
5716
+ (runtimeStrategy) => matchesStrategySymbol(runtimeStrategy, symbol)
5717
+ ).map(
5642
5718
  ({ strategyName, strategyRevision }) => buildSignalsStrategyLifecycleKey({
5643
5719
  connectorName,
5644
5720
  universe: sessionUniverse,
@@ -5705,6 +5781,7 @@ var createSignalsRunner = (config2) => {
5705
5781
  primaryEthClosedData,
5706
5782
  primaryEthByTimestamp,
5707
5783
  runtimeStrategies,
5784
+ matchesStrategySymbol,
5708
5785
  strategyStats,
5709
5786
  runtimeCloseNotifications,
5710
5787
  lifecycle,
@@ -4612,6 +4612,7 @@ var createSignalsTickerEvaluator = ({
4612
4612
  primaryEthClosedData,
4613
4613
  primaryEthByTimestamp,
4614
4614
  runtimeStrategies,
4615
+ matchesStrategySymbol,
4615
4616
  strategyStats,
4616
4617
  runtimeCloseNotifications,
4617
4618
  lifecycle,
@@ -4652,6 +4653,9 @@ var createSignalsTickerEvaluator = ({
4652
4653
  );
4653
4654
  const strategySignals = [];
4654
4655
  for (const runtimeStrategy of runtimeStrategies) {
4656
+ if (matchesStrategySymbol && !matchesStrategySymbol(runtimeStrategy, symbol)) {
4657
+ continue;
4658
+ }
4655
4659
  const {
4656
4660
  strategyName,
4657
4661
  strategyRevision,
@@ -4856,6 +4860,28 @@ var createSignalsTickerEvaluator = ({
4856
4860
 
4857
4861
  // src/lib/signals/configuredScopes.ts
4858
4862
  var sorted = (values) => values ? [...values].sort() : [];
4863
+ var normalizeSymbol = (value) => value.trim().toUpperCase();
4864
+ var isActiveTradeInScope = ({
4865
+ trade,
4866
+ deploymentId,
4867
+ universe,
4868
+ accountId,
4869
+ interval
4870
+ }) => trade.status === "active" && trade.deploymentId === deploymentId && (trade.universe ?? "crypto") === universe && (!trade.accountId || trade.accountId === accountId) && (!trade.interval || String(trade.interval) === String(interval));
4871
+ var mergeConfiguredStrategySelections = (strategies) => {
4872
+ if (strategies.some(({ selection }) => !selection)) {
4873
+ return void 0;
4874
+ }
4875
+ return {
4876
+ tickers: [
4877
+ ...new Set(
4878
+ strategies.flatMap(
4879
+ ({ selection }) => (selection?.tickers ?? []).map(normalizeSymbol)
4880
+ )
4881
+ )
4882
+ ].sort()
4883
+ };
4884
+ };
4859
4885
  var formatConfiguredStrategyIdentity = (strategy) => `${strategy.strategyName}@${strategy.strategyRevision}[${strategy.controlState}]`;
4860
4886
  var getConfiguredScopeActiveSymbols = ({
4861
4887
  trades,
@@ -4869,11 +4895,48 @@ var getConfiguredScopeActiveSymbols = ({
4869
4895
  return [
4870
4896
  ...new Set(
4871
4897
  trades.filter(
4872
- (trade) => trade.status === "active" && trade.deploymentId === deploymentId && strategyNameSet.has(trade.strategy) && (trade.universe ?? "crypto") === universe && (!trade.accountId || trade.accountId === accountId) && (!trade.interval || String(trade.interval) === String(interval))
4873
- ).map(({ symbol }) => symbol)
4898
+ (trade) => isActiveTradeInScope({
4899
+ trade,
4900
+ deploymentId,
4901
+ universe,
4902
+ accountId,
4903
+ interval
4904
+ }) && strategyNameSet.has(trade.strategy) && Boolean(trade.symbol)
4905
+ ).map(({ symbol }) => normalizeSymbol(symbol))
4874
4906
  )
4875
4907
  ].sort();
4876
4908
  };
4909
+ var createConfiguredStrategySymbolMatcher = ({
4910
+ trades,
4911
+ deploymentId,
4912
+ universe,
4913
+ accountId,
4914
+ interval
4915
+ }) => {
4916
+ const activeStrategySymbols = new Set(
4917
+ trades.filter(
4918
+ (trade) => isActiveTradeInScope({
4919
+ trade,
4920
+ deploymentId,
4921
+ universe,
4922
+ accountId,
4923
+ interval
4924
+ })
4925
+ ).map(
4926
+ ({ strategy, symbol }) => `${strategy}\0${normalizeSymbol(symbol)}`
4927
+ )
4928
+ );
4929
+ return (strategy, symbol) => {
4930
+ if (!strategy.selection) return true;
4931
+ const normalizedSymbol = normalizeSymbol(symbol);
4932
+ return strategy.selection.tickers.some((ticker) => {
4933
+ const normalizedTicker = normalizeSymbol(ticker);
4934
+ return normalizedTicker === normalizedSymbol || universe === "crypto" && `${normalizedTicker}USDT` === normalizedSymbol;
4935
+ }) || activeStrategySymbols.has(
4936
+ `${strategy.strategyName}\0${normalizedSymbol}`
4937
+ );
4938
+ };
4939
+ };
4877
4940
  var buildConfiguredSignalsScopes = ({
4878
4941
  connectorName,
4879
4942
  deployment,
@@ -4891,15 +4954,11 @@ var buildConfiguredSignalsScopes = ({
4891
4954
  });
4892
4955
  const groups = /* @__PURE__ */ new Map();
4893
4956
  for (const strategy of strategies) {
4894
- const selectionIdentity = JSON.stringify({
4895
- tickers: sorted(strategy.selection?.tickers)
4896
- });
4897
4957
  const baseKey = [
4898
4958
  connectorName,
4899
4959
  strategy.universe,
4900
4960
  strategy.accountId ?? "default",
4901
- strategy.interval,
4902
- selectionIdentity
4961
+ strategy.interval
4903
4962
  ].join(":");
4904
4963
  const group = groups.get(baseKey) ?? {
4905
4964
  scope: {
@@ -4907,26 +4966,31 @@ var buildConfiguredSignalsScopes = ({
4907
4966
  universe: strategy.universe,
4908
4967
  accountId: strategy.accountId,
4909
4968
  interval: strategy.interval,
4910
- strategyNames: [],
4911
- ...strategy.selection ? {
4912
- selection: { tickers: [...strategy.selection.tickers] }
4913
- } : {}
4969
+ strategyNames: []
4914
4970
  },
4915
- strategyIdentities: []
4971
+ strategyIdentities: [],
4972
+ strategies: []
4916
4973
  };
4917
4974
  group.scope.strategyNames.push(strategy.strategyName);
4918
4975
  group.strategyIdentities.push(formatConfiguredStrategyIdentity(strategy));
4976
+ group.strategies.push(strategy);
4919
4977
  groups.set(baseKey, group);
4920
4978
  }
4921
- return [...groups.entries()].map(([baseKey, group]) => ({
4922
- key: [baseKey, deploymentIdentity, ...group.strategyIdentities.sort()].join(
4923
- ":"
4924
- ),
4925
- scope: {
4926
- ...group.scope,
4927
- strategyNames: [...group.scope.strategyNames].sort()
4928
- }
4929
- }));
4979
+ return [...groups.entries()].map(([baseKey, group]) => {
4980
+ const selection = mergeConfiguredStrategySelections(group.strategies);
4981
+ return {
4982
+ key: [
4983
+ baseKey,
4984
+ deploymentIdentity,
4985
+ ...group.strategyIdentities.sort()
4986
+ ].join(":"),
4987
+ scope: {
4988
+ ...group.scope,
4989
+ strategyNames: [...group.scope.strategyNames].sort(),
4990
+ ...selection ? { selection } : {}
4991
+ }
4992
+ };
4993
+ });
4930
4994
  };
4931
4995
 
4932
4996
  // src/lib/runtimeEvidenceCompositionSnapshots.ts
@@ -5451,10 +5515,12 @@ var createSignalsRunner = (config2) => {
5451
5515
  selection
5452
5516
  } = session;
5453
5517
  const universe = sessionUniverse ?? marketConnector.universe ?? "crypto";
5454
- const selectedActiveSymbols = !config2.tickers && selection?.tickers?.length && strategyNames?.length ? getConfiguredScopeActiveSymbols({
5455
- trades: await loadRuntimeActiveTrades(config2.userName),
5518
+ const activeScopeStrategyNames = strategyNames?.length ? strategyNames : deployment?.strategies.filter(({ enabled }) => enabled).map(({ strategyName }) => strategyName) ?? [];
5519
+ const runtimeActiveTrades = deployment?.id && activeScopeStrategyNames.length ? await loadRuntimeActiveTrades(config2.userName) : [];
5520
+ const selectedActiveSymbols = !config2.tickers && activeScopeStrategyNames.length ? getConfiguredScopeActiveSymbols({
5521
+ trades: runtimeActiveTrades,
5456
5522
  deploymentId: deployment?.id ?? "",
5457
- strategyNames,
5523
+ strategyNames: activeScopeStrategyNames,
5458
5524
  universe,
5459
5525
  accountId,
5460
5526
  interval: interval2
@@ -5463,11 +5529,11 @@ var createSignalsRunner = (config2) => {
5463
5529
  if (selectedActiveSymbols.length) {
5464
5530
  import_logger4.logger.info(
5465
5531
  import_chalk7.default.gray(
5466
- `strategy selection retained active symbols: ${selectedActiveSymbols.join(", ")}`
5532
+ `runtime scope retained active symbols: ${selectedActiveSymbols.join(", ")}`
5467
5533
  )
5468
5534
  );
5469
5535
  }
5470
- const tickers = await timeOperation2("tickers load", () => {
5536
+ const loadedTickers = await timeOperation2("tickers load", () => {
5471
5537
  const baseArgs = [
5472
5538
  marketConnector,
5473
5539
  config2.tickers || selectedTickers?.join(",") || deployment?.tickers?.join(","),
@@ -5480,6 +5546,7 @@ var createSignalsRunner = (config2) => {
5480
5546
  assetClasses: deployment?.assetClasses
5481
5547
  }) : (0, import_cli2.getTickers)(...baseArgs);
5482
5548
  });
5549
+ const tickers = config2.tickers ? loadedTickers : [.../* @__PURE__ */ new Set([...loadedTickers, ...selectedActiveSymbols])];
5483
5550
  if (universe === "tradfi" && typeof marketConnector.listInstruments !== "function") {
5484
5551
  throw new Error("TradFi connector must implement listInstruments");
5485
5552
  }
@@ -5633,10 +5700,19 @@ var createSignalsRunner = (config2) => {
5633
5700
  );
5634
5701
  return;
5635
5702
  }
5703
+ const matchesStrategySymbol = createConfiguredStrategySymbolMatcher({
5704
+ trades: runtimeActiveTrades,
5705
+ deploymentId: deployment?.id ?? "",
5706
+ universe,
5707
+ accountId,
5708
+ interval: interval2
5709
+ });
5636
5710
  lifecycle.retain(
5637
5711
  new Set(
5638
5712
  tickers.flatMap(
5639
- (symbol) => runtimeStrategies.map(
5713
+ (symbol) => runtimeStrategies.filter(
5714
+ (runtimeStrategy) => matchesStrategySymbol(runtimeStrategy, symbol)
5715
+ ).map(
5640
5716
  ({ strategyName, strategyRevision }) => buildSignalsStrategyLifecycleKey({
5641
5717
  connectorName,
5642
5718
  universe: sessionUniverse,
@@ -5703,6 +5779,7 @@ var createSignalsRunner = (config2) => {
5703
5779
  primaryEthClosedData,
5704
5780
  primaryEthByTimestamp,
5705
5781
  runtimeStrategies,
5782
+ matchesStrategySymbol,
5706
5783
  strategyStats,
5707
5784
  runtimeCloseNotifications,
5708
5785
  lifecycle,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/cli",
3
- "version": "3.1.27",
3
+ "version": "3.1.28-beta.252",
4
4
  "description": "Official CLI for the TradeJS TypeScript framework: infra setup, backtests, signals, bots, and ML workflows.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -36,13 +36,13 @@
36
36
  "tradejs": "dist/cli.js"
37
37
  },
38
38
  "dependencies": {
39
- "@tradejs/connectors": "^3.1.27",
40
- "@tradejs/core": "^3.1.27",
41
- "@tradejs/indicators": "^3.1.27",
42
- "@tradejs/infra": "^3.1.27",
43
- "@tradejs/node": "^3.1.27",
39
+ "@tradejs/connectors": "^3.1.28-beta.252",
40
+ "@tradejs/core": "^3.1.28-beta.252",
41
+ "@tradejs/indicators": "^3.1.28-beta.252",
42
+ "@tradejs/infra": "^3.1.28-beta.252",
43
+ "@tradejs/node": "^3.1.28-beta.252",
44
44
  "@tradejs/strategy-kit": "3.0.4",
45
- "@tradejs/types": "^3.1.27",
45
+ "@tradejs/types": "^3.1.28-beta.252",
46
46
  "args": "^5.0.3",
47
47
  "bcryptjs": "^2.4.3",
48
48
  "chalk": "4.1.2",