@tradejs/node 3.1.24-beta.240 → 3.1.25-beta.242

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.
@@ -7774,6 +7774,48 @@ var resolveConnectorAccountId = async ({
7774
7774
  provider,
7775
7775
  universe: "crypto"
7776
7776
  }))?.id;
7777
+ var loadRuntimeConnectorScopes = async ({
7778
+ userName,
7779
+ provider,
7780
+ connectorCreator,
7781
+ runtimeDeployments
7782
+ }) => {
7783
+ const providerDeployments = runtimeDeployments.filter(
7784
+ (deployment) => deployment.provider === provider
7785
+ );
7786
+ if (!providerDeployments.length) {
7787
+ const accountId = await resolveConnectorAccountId({ userName, provider });
7788
+ return [
7789
+ {
7790
+ connector: await connectorCreator({
7791
+ userName,
7792
+ accountId,
7793
+ universe: "crypto"
7794
+ }),
7795
+ strategyNames: [
7796
+ ...new Set(
7797
+ runtimeDeployments.flatMap(
7798
+ (deployment) => deployment.strategies.map(({ strategyName }) => strategyName)
7799
+ )
7800
+ )
7801
+ ]
7802
+ }
7803
+ ];
7804
+ }
7805
+ return Promise.all(
7806
+ providerDeployments.map(async (deployment) => ({
7807
+ connector: await connectorCreator({
7808
+ userName,
7809
+ accountId: deployment.accountId,
7810
+ deploymentId: deployment.id,
7811
+ universe: "crypto"
7812
+ }),
7813
+ strategyNames: deployment.strategies.map(
7814
+ ({ strategyName }) => strategyName
7815
+ )
7816
+ }))
7817
+ );
7818
+ };
7777
7819
  var loadRuntimeTrades = async (userName, {
7778
7820
  startTime,
7779
7821
  endTime
@@ -7974,78 +8016,94 @@ var loadRuntimeDashboard = async ({
7974
8016
  if (!connectorCreator) {
7975
8017
  throw new Error(`No connector available for provider "${provider}"`);
7976
8018
  }
7977
- const connectorAccountId = await resolveConnectorAccountId({
7978
- userName,
7979
- provider
7980
- });
7981
- const connector = await connectorCreator({
7982
- userName,
7983
- accountId: connectorAccountId,
7984
- universe: "crypto"
7985
- });
7986
- const [
7987
- runtimeTrades,
7988
- activeOrderIds,
7989
- closedPnlRows,
7990
- entryRows,
7991
- openPositionsSnapshot,
7992
- runtimeDeployments,
7993
- tradingAccounts
7994
- ] = await Promise.all([
8019
+ const [runtimeTrades, activeOrderIds, runtimeDeployments, tradingAccounts] = await Promise.all([
7995
8020
  loadRuntimeTrades(userName, { startTime, endTime }),
7996
8021
  loadActiveRuntimeOrderIds(userName),
7997
- loadClosedPnlRows({
7998
- connector,
7999
- startTime,
8000
- endTime,
8001
- errors: exchangeErrors
8002
- }),
8003
- loadExchangeEntryRows({
8004
- connector,
8005
- startTime,
8006
- endTime,
8007
- errors: exchangeErrors
8008
- }),
8009
- loadOpenPositions(connector, exchangeErrors),
8010
8022
  listRuntimeDeployments({ userName, projectRoot }),
8011
8023
  (0, import_tradingAccounts3.listTradingAccounts)(userName)
8012
8024
  ]);
8025
+ const connectorScopes = await loadRuntimeConnectorScopes({
8026
+ userName,
8027
+ provider,
8028
+ connectorCreator,
8029
+ runtimeDeployments
8030
+ });
8031
+ const exchangeScopes = await Promise.all(
8032
+ connectorScopes.map(async ({ connector, strategyNames }) => {
8033
+ const [closedPnlRows, entryRows, openPositionsSnapshot] = await Promise.all([
8034
+ loadClosedPnlRows({
8035
+ connector,
8036
+ startTime,
8037
+ endTime,
8038
+ errors: exchangeErrors
8039
+ }),
8040
+ loadExchangeEntryRows({
8041
+ connector,
8042
+ startTime,
8043
+ endTime,
8044
+ errors: exchangeErrors
8045
+ }),
8046
+ loadOpenPositions(connector, exchangeErrors)
8047
+ ]);
8048
+ return {
8049
+ connector,
8050
+ strategyNames,
8051
+ closedPnlRows,
8052
+ entryRows,
8053
+ openPositionsSnapshot
8054
+ };
8055
+ })
8056
+ );
8013
8057
  const relevantTrades = (0, import_runtimeTrades3.selectTradesForWindow)(
8014
8058
  runtimeTrades,
8015
8059
  startTime,
8016
8060
  activeOrderIds
8017
8061
  );
8018
- const syncableTrades = relevantTrades.filter(
8019
- (trade) => isRuntimeTradeInConnectorScope(trade, connector)
8020
- );
8062
+ const claimedOrderIds = /* @__PURE__ */ new Set();
8063
+ const syncedConnectorTrades = [];
8064
+ for (const {
8065
+ connector,
8066
+ closedPnlRows,
8067
+ openPositionsSnapshot
8068
+ } of exchangeScopes) {
8069
+ const scopeTrades = relevantTrades.filter(
8070
+ (trade) => !claimedOrderIds.has(trade.orderId) && isRuntimeTradeInConnectorScope(trade, connector)
8071
+ );
8072
+ scopeTrades.forEach((trade) => claimedOrderIds.add(trade.orderId));
8073
+ syncedConnectorTrades.push(
8074
+ ...await syncRuntimeTrades({
8075
+ userName,
8076
+ connector,
8077
+ trades: scopeTrades,
8078
+ endTime,
8079
+ openPositions: openPositionsSnapshot.positions,
8080
+ openPositionsReliable: openPositionsSnapshot.reliable,
8081
+ closedPnlRows
8082
+ })
8083
+ );
8084
+ }
8021
8085
  const unsyncedTrades = relevantTrades.filter(
8022
- (trade) => !isRuntimeTradeInConnectorScope(trade, connector)
8086
+ (trade) => !claimedOrderIds.has(trade.orderId)
8023
8087
  );
8024
- const syncedConnectorTrades = await syncRuntimeTrades({
8025
- userName,
8026
- connector,
8027
- trades: syncableTrades,
8028
- endTime,
8029
- openPositions: openPositionsSnapshot.positions,
8030
- openPositionsReliable: openPositionsSnapshot.reliable,
8031
- closedPnlRows
8032
- });
8033
8088
  const syncedTrades = [...unsyncedTrades, ...syncedConnectorTrades];
8034
- const fallbackStrategyNames = [
8035
- ...new Set(
8036
- runtimeDeployments.flatMap(
8037
- (deployment) => deployment.strategies.map(({ strategyName }) => strategyName)
8038
- )
8039
- )
8040
- ];
8041
- const fallbackTrades = buildExchangeFallbackRuntimeTrades({
8089
+ const fallbackTrades = [];
8090
+ for (const {
8091
+ strategyNames,
8042
8092
  entryRows,
8043
8093
  closedPnlRows,
8044
- openPositions: openPositionsSnapshot.positions,
8045
- strategyNames: fallbackStrategyNames,
8046
- existingTrades: syncedTrades,
8047
- endTime
8048
- });
8094
+ openPositionsSnapshot
8095
+ } of exchangeScopes) {
8096
+ fallbackTrades.push(
8097
+ ...buildExchangeFallbackRuntimeTrades({
8098
+ entryRows,
8099
+ closedPnlRows,
8100
+ openPositions: openPositionsSnapshot.positions,
8101
+ strategyNames,
8102
+ existingTrades: [...syncedTrades, ...fallbackTrades],
8103
+ endTime
8104
+ })
8105
+ );
8106
+ }
8049
8107
  const allTrades = [...syncedTrades, ...fallbackTrades].filter(
8050
8108
  import_runtimeTrades3.isRuntimeTradeRecord
8051
8109
  );
@@ -265,6 +265,48 @@ var resolveConnectorAccountId = async ({
265
265
  provider,
266
266
  universe: "crypto"
267
267
  }))?.id;
268
+ var loadRuntimeConnectorScopes = async ({
269
+ userName,
270
+ provider,
271
+ connectorCreator,
272
+ runtimeDeployments
273
+ }) => {
274
+ const providerDeployments = runtimeDeployments.filter(
275
+ (deployment) => deployment.provider === provider
276
+ );
277
+ if (!providerDeployments.length) {
278
+ const accountId = await resolveConnectorAccountId({ userName, provider });
279
+ return [
280
+ {
281
+ connector: await connectorCreator({
282
+ userName,
283
+ accountId,
284
+ universe: "crypto"
285
+ }),
286
+ strategyNames: [
287
+ ...new Set(
288
+ runtimeDeployments.flatMap(
289
+ (deployment) => deployment.strategies.map(({ strategyName }) => strategyName)
290
+ )
291
+ )
292
+ ]
293
+ }
294
+ ];
295
+ }
296
+ return Promise.all(
297
+ providerDeployments.map(async (deployment) => ({
298
+ connector: await connectorCreator({
299
+ userName,
300
+ accountId: deployment.accountId,
301
+ deploymentId: deployment.id,
302
+ universe: "crypto"
303
+ }),
304
+ strategyNames: deployment.strategies.map(
305
+ ({ strategyName }) => strategyName
306
+ )
307
+ }))
308
+ );
309
+ };
268
310
  var loadRuntimeTrades = async (userName, {
269
311
  startTime,
270
312
  endTime
@@ -465,78 +507,94 @@ var loadRuntimeDashboard = async ({
465
507
  if (!connectorCreator) {
466
508
  throw new Error(`No connector available for provider "${provider}"`);
467
509
  }
468
- const connectorAccountId = await resolveConnectorAccountId({
469
- userName,
470
- provider
471
- });
472
- const connector = await connectorCreator({
473
- userName,
474
- accountId: connectorAccountId,
475
- universe: "crypto"
476
- });
477
- const [
478
- runtimeTrades,
479
- activeOrderIds,
480
- closedPnlRows,
481
- entryRows,
482
- openPositionsSnapshot,
483
- runtimeDeployments,
484
- tradingAccounts
485
- ] = await Promise.all([
510
+ const [runtimeTrades, activeOrderIds, runtimeDeployments, tradingAccounts] = await Promise.all([
486
511
  loadRuntimeTrades(userName, { startTime, endTime }),
487
512
  loadActiveRuntimeOrderIds(userName),
488
- loadClosedPnlRows({
489
- connector,
490
- startTime,
491
- endTime,
492
- errors: exchangeErrors
493
- }),
494
- loadExchangeEntryRows({
495
- connector,
496
- startTime,
497
- endTime,
498
- errors: exchangeErrors
499
- }),
500
- loadOpenPositions(connector, exchangeErrors),
501
513
  listRuntimeDeployments({ userName, projectRoot }),
502
514
  listTradingAccounts(userName)
503
515
  ]);
516
+ const connectorScopes = await loadRuntimeConnectorScopes({
517
+ userName,
518
+ provider,
519
+ connectorCreator,
520
+ runtimeDeployments
521
+ });
522
+ const exchangeScopes = await Promise.all(
523
+ connectorScopes.map(async ({ connector, strategyNames }) => {
524
+ const [closedPnlRows, entryRows, openPositionsSnapshot] = await Promise.all([
525
+ loadClosedPnlRows({
526
+ connector,
527
+ startTime,
528
+ endTime,
529
+ errors: exchangeErrors
530
+ }),
531
+ loadExchangeEntryRows({
532
+ connector,
533
+ startTime,
534
+ endTime,
535
+ errors: exchangeErrors
536
+ }),
537
+ loadOpenPositions(connector, exchangeErrors)
538
+ ]);
539
+ return {
540
+ connector,
541
+ strategyNames,
542
+ closedPnlRows,
543
+ entryRows,
544
+ openPositionsSnapshot
545
+ };
546
+ })
547
+ );
504
548
  const relevantTrades = selectTradesForWindow(
505
549
  runtimeTrades,
506
550
  startTime,
507
551
  activeOrderIds
508
552
  );
509
- const syncableTrades = relevantTrades.filter(
510
- (trade) => isRuntimeTradeInConnectorScope(trade, connector)
511
- );
553
+ const claimedOrderIds = /* @__PURE__ */ new Set();
554
+ const syncedConnectorTrades = [];
555
+ for (const {
556
+ connector,
557
+ closedPnlRows,
558
+ openPositionsSnapshot
559
+ } of exchangeScopes) {
560
+ const scopeTrades = relevantTrades.filter(
561
+ (trade) => !claimedOrderIds.has(trade.orderId) && isRuntimeTradeInConnectorScope(trade, connector)
562
+ );
563
+ scopeTrades.forEach((trade) => claimedOrderIds.add(trade.orderId));
564
+ syncedConnectorTrades.push(
565
+ ...await syncRuntimeTrades({
566
+ userName,
567
+ connector,
568
+ trades: scopeTrades,
569
+ endTime,
570
+ openPositions: openPositionsSnapshot.positions,
571
+ openPositionsReliable: openPositionsSnapshot.reliable,
572
+ closedPnlRows
573
+ })
574
+ );
575
+ }
512
576
  const unsyncedTrades = relevantTrades.filter(
513
- (trade) => !isRuntimeTradeInConnectorScope(trade, connector)
577
+ (trade) => !claimedOrderIds.has(trade.orderId)
514
578
  );
515
- const syncedConnectorTrades = await syncRuntimeTrades({
516
- userName,
517
- connector,
518
- trades: syncableTrades,
519
- endTime,
520
- openPositions: openPositionsSnapshot.positions,
521
- openPositionsReliable: openPositionsSnapshot.reliable,
522
- closedPnlRows
523
- });
524
579
  const syncedTrades = [...unsyncedTrades, ...syncedConnectorTrades];
525
- const fallbackStrategyNames = [
526
- ...new Set(
527
- runtimeDeployments.flatMap(
528
- (deployment) => deployment.strategies.map(({ strategyName }) => strategyName)
529
- )
530
- )
531
- ];
532
- const fallbackTrades = buildExchangeFallbackRuntimeTrades({
580
+ const fallbackTrades = [];
581
+ for (const {
582
+ strategyNames,
533
583
  entryRows,
534
584
  closedPnlRows,
535
- openPositions: openPositionsSnapshot.positions,
536
- strategyNames: fallbackStrategyNames,
537
- existingTrades: syncedTrades,
538
- endTime
539
- });
585
+ openPositionsSnapshot
586
+ } of exchangeScopes) {
587
+ fallbackTrades.push(
588
+ ...buildExchangeFallbackRuntimeTrades({
589
+ entryRows,
590
+ closedPnlRows,
591
+ openPositions: openPositionsSnapshot.positions,
592
+ strategyNames,
593
+ existingTrades: [...syncedTrades, ...fallbackTrades],
594
+ endTime
595
+ })
596
+ );
597
+ }
540
598
  const allTrades = [...syncedTrades, ...fallbackTrades].filter(
541
599
  isRuntimeTradeRecord
542
600
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/node",
3
- "version": "3.1.24-beta.240",
3
+ "version": "3.1.25-beta.242",
4
4
  "description": "Node-only runtime for the TradeJS TypeScript framework: strategies, backtests, Pine strategy loading, and plugin registries.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -89,9 +89,9 @@
89
89
  "dependencies": {
90
90
  "@langchain/core": "^1.2.3",
91
91
  "@langchain/openai": "^1.5.5",
92
- "@tradejs/core": "^3.1.24-beta.240",
93
- "@tradejs/infra": "^3.1.24-beta.240",
94
- "@tradejs/types": "^3.1.24-beta.240",
92
+ "@tradejs/core": "^3.1.25-beta.242",
93
+ "@tradejs/infra": "^3.1.25-beta.242",
94
+ "@tradejs/types": "^3.1.25-beta.242",
95
95
  "@types/node": "^24",
96
96
  "chalk": "4.1.2",
97
97
  "ioredis": "5.11.1",
@@ -104,7 +104,7 @@
104
104
  "typescript": "^5.9"
105
105
  },
106
106
  "devDependencies": {
107
- "@tradejs/indicators": "^3.1.24-beta.240",
107
+ "@tradejs/indicators": "^3.1.25-beta.242",
108
108
  "@tradejs/strategy-adaptive-momentum-ribbon": "3.0.2",
109
109
  "@tradejs/strategy-hyperliquid-consensus": "3.0.2",
110
110
  "@tradejs/strategy-kit": "3.0.4",