@tradejs/node 3.1.24 → 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.
- package/dist/runtimeDashboard.js +115 -57
- package/dist/runtimeDashboard.mjs +115 -57
- package/package.json +5 -5
package/dist/runtimeDashboard.js
CHANGED
|
@@ -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
|
|
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
|
|
8019
|
-
|
|
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) => !
|
|
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
|
|
8035
|
-
|
|
8036
|
-
|
|
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
|
-
|
|
8045
|
-
|
|
8046
|
-
|
|
8047
|
-
|
|
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
|
|
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
|
|
510
|
-
|
|
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) => !
|
|
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
|
|
526
|
-
|
|
527
|
-
|
|
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
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
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.
|
|
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.
|
|
93
|
-
"@tradejs/infra": "^3.1.
|
|
94
|
-
"@tradejs/types": "^3.1.
|
|
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.
|
|
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",
|