@tradejs/app 1.0.8 → 1.0.10

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.
Files changed (119) hide show
  1. package/README.md +7 -2
  2. package/bin/tradejs-app.mjs +146 -2
  3. package/next.config.mjs +0 -14
  4. package/package.json +35 -19
  5. package/src/app/actions/backtest.ts +54 -0
  6. package/src/app/actions/kline.ts +10 -5
  7. package/src/app/actions/scanner.ts +8 -3
  8. package/src/app/actions/strategies.ts +39 -0
  9. package/src/app/api/ai/route.ts +5 -4
  10. package/src/app/api/auth/[...nextauth]/route.ts +1 -1
  11. package/src/app/api/backtest/configs/route.ts +25 -0
  12. package/src/app/api/backtest/files/route.ts +5 -2
  13. package/src/app/api/backtest/order-log/[strategy]/[name]/route.ts +26 -2
  14. package/src/app/api/backtest/result/[strategy]/[name]/route.ts +27 -2
  15. package/src/app/api/backtest/runs/[jobId]/route.ts +124 -0
  16. package/src/app/api/backtest/runs/route.ts +45 -0
  17. package/src/app/api/backtest/test/[strategy]/[name]/route.ts +19 -2
  18. package/src/app/api/derivatives/summary/route.ts +8 -1
  19. package/src/app/api/kline/[provider]/[universe]/[symbol]/[interval]/route.ts +1 -0
  20. package/src/app/api/kline/{[provider]/[symbol]/[interval]/route.ts → handler.ts} +61 -39
  21. package/src/app/api/scanner/[provider]/[universe]/route.ts +1 -0
  22. package/src/app/api/scanner/[provider]/route.ts +30 -12
  23. package/src/app/api/scanner/route.ts +3 -3
  24. package/src/app/api/signal/[symbol]/[signalId]/route.ts +4 -7
  25. package/src/app/api/strategies/ai/[cardId]/route.ts +22 -0
  26. package/src/app/api/strategies/ai/route.ts +139 -0
  27. package/src/app/api/strategies/replay/[cardId]/route.ts +18 -0
  28. package/src/app/api/strategies/replay/route.ts +44 -0
  29. package/src/app/api/strategies/runtime/route.ts +831 -0
  30. package/src/app/api/user/runtime-deployments/[deploymentId]/route.ts +25 -0
  31. package/src/app/api/user/runtime-deployments/route.ts +94 -0
  32. package/src/app/api/user/runtime-strategy-configs/route.ts +241 -0
  33. package/src/app/api/user/settings/route.ts +18 -1
  34. package/src/app/api/user/trading-accounts/[accountId]/route.ts +35 -0
  35. package/src/app/api/user/trading-accounts/route.ts +134 -0
  36. package/src/app/components/Backtest/CompareList/index.tsx +1 -1
  37. package/src/app/components/Backtest/ResultsPageClient.tsx +376 -0
  38. package/src/app/components/Backtest/TestCard/ActionsMenu/index.tsx +123 -0
  39. package/src/app/components/Backtest/TestCard/Chart/index.tsx +1 -1
  40. package/src/app/components/Backtest/TestCard/CompareButton/index.tsx +1 -1
  41. package/src/app/components/Backtest/TestCard/ConfigDrawer/index.tsx +28 -12
  42. package/src/app/components/Backtest/TestCard/DeleteButton/index.tsx +33 -17
  43. package/src/app/components/Backtest/TestCard/FavoriteIndicator/index.tsx +2 -2
  44. package/src/app/components/Backtest/TestCard/OpenDashboardButton/index.tsx +10 -1
  45. package/src/app/components/Backtest/TestCard/OrdersDrawer/index.tsx +128 -0
  46. package/src/app/components/Backtest/TestCard/Root/index.tsx +1 -1
  47. package/src/app/components/Backtest/TestCard/Stat/index.tsx +2 -0
  48. package/src/app/components/Backtest/TestCard/StatDrawer/index.tsx +66 -0
  49. package/src/app/components/Backtest/TestCard/index.ts +6 -2
  50. package/src/app/components/Backtest/TestList/index.tsx +4 -9
  51. package/src/app/components/Dashboard/AiDrawer/index.tsx +1 -1
  52. package/src/app/components/Dashboard/KlineChart/hooks/useBacktest.ts +1 -1
  53. package/src/app/components/Dashboard/KlineChart/hooks/useBbIndicator.ts +10 -5
  54. package/src/app/components/Dashboard/KlineChart/hooks/useBtcCorrelation.ts +1 -1
  55. package/src/app/components/Dashboard/KlineChart/hooks/useBtcIndicator.ts +4 -1
  56. package/src/app/components/Dashboard/KlineChart/hooks/useEmaIndicator.ts +3 -1
  57. package/src/app/components/Dashboard/KlineChart/hooks/usePluginIndicators.ts +1 -1
  58. package/src/app/components/Dashboard/KlineChart/hooks/useSetup.ts +1 -1
  59. package/src/app/components/Dashboard/KlineChart/hooks/useSignal.ts +1 -1
  60. package/src/app/components/Dashboard/KlineChart/hooks/useSpreadIndicator.ts +1 -1
  61. package/src/app/components/Dashboard/KlineChart/hooks/useTrendLine.ts +1 -1
  62. package/src/app/components/Dashboard/KlineChart/hooks/useWmaIndicator.ts +3 -1
  63. package/src/app/components/Dashboard/KlineChart/index.tsx +16 -6
  64. package/src/app/components/Dashboard/MainChart/index.tsx +3 -22
  65. package/src/app/components/Shared/AppShell.tsx +1 -1
  66. package/src/app/components/Shared/BulkSelection/index.tsx +140 -0
  67. package/src/app/components/Shared/BulkSelection/useBulkSelection.ts +97 -0
  68. package/src/app/components/Shared/BulkSelection/utils.ts +126 -0
  69. package/src/app/components/Shared/Filters/Backtest/index.tsx +33 -48
  70. package/src/app/components/Shared/Filters/FavoriteIndicator/index.tsx +5 -3
  71. package/src/app/components/Shared/Filters/Indicators/index.tsx +2 -2
  72. package/src/app/components/Shared/Filters/Interval/index.tsx +1 -1
  73. package/src/app/components/Shared/Filters/Provider/index.tsx +8 -2
  74. package/src/app/components/Shared/Filters/Symbol/index.tsx +4 -3
  75. package/src/app/components/Shared/Filters/Universe/index.tsx +36 -0
  76. package/src/app/components/Shared/Filters/index.ts +2 -0
  77. package/src/app/components/Shared/OrdersDrawer.tsx +629 -0
  78. package/src/app/components/Shared/Sidebar/AccountSettingsDrawer.tsx +55 -28
  79. package/src/app/components/Shared/Sidebar/TradingAccountsPanel.tsx +445 -0
  80. package/src/app/components/Shared/Sidebar/index.tsx +17 -3
  81. package/src/app/components/Strategies/AdvancedMetricsPanel.tsx +727 -0
  82. package/src/app/components/Strategies/RuntimeStrategyCard.tsx +2204 -0
  83. package/src/app/components/Strategies/RuntimeStrategyCardSkeleton.tsx +40 -0
  84. package/src/app/components/Strategies/RuntimeStrategyChart.tsx +121 -0
  85. package/src/app/components/Strategies/RuntimeStrategyConfigDrawer.tsx +458 -0
  86. package/src/app/components/Strategies/StrategySnapshotCard.tsx +2890 -0
  87. package/src/app/components/Strategies/StrategySnapshotChart.tsx +94 -0
  88. package/src/app/components/Strategies/StrategySnapshotList.tsx +82 -0
  89. package/src/app/components/UI/Segment/index.tsx +8 -1
  90. package/src/app/components/UI/Select/index.tsx +24 -13
  91. package/src/app/components/UI/SelectWithSearch/index.tsx +46 -5
  92. package/src/app/layout.tsx +1 -1
  93. package/src/app/lib/backtestJobs.ts +792 -0
  94. package/src/app/lib/cardPageLayout.ts +1 -0
  95. package/src/app/lib/connectorCreator.ts +28 -0
  96. package/src/app/lib/currentUser.ts +1 -1
  97. package/src/app/lib/errorMessage.ts +34 -0
  98. package/src/app/lib/marketDefaults.ts +12 -0
  99. package/src/app/lib/marketRoutes.ts +58 -0
  100. package/src/app/lib/runtimeStrategies.ts +1376 -0
  101. package/src/app/lib/runtimeStrategyConfigForm.ts +86 -0
  102. package/src/app/provider.tsx +1 -1
  103. package/src/app/routes/backtest/page.tsx +1051 -304
  104. package/src/app/routes/dashboard/{[provider]/[symbol]/[interval]/page.tsx → Dashboard.tsx} +35 -15
  105. package/src/app/routes/dashboard/[provider]/[universe]/[symbol]/[interval]/page.tsx +1 -0
  106. package/src/app/routes/dashboard/page.tsx +15 -3
  107. package/src/app/routes/derivatives/page.tsx +1222 -165
  108. package/src/app/routes/strategies/StrategiesPageClient.tsx +593 -0
  109. package/src/app/routes/strategies/[mode]/page.tsx +20 -0
  110. package/src/app/routes/strategies/page.tsx +7 -0
  111. package/src/app/store/ai.ts +1 -1
  112. package/src/app/store/data.ts +73 -17
  113. package/src/app/store/filters.ts +1 -0
  114. package/src/app/store/marketKlineStream.ts +87 -0
  115. package/src/app/store/tests.ts +1 -1
  116. package/src/app/store/tickers.ts +59 -22
  117. package/tsconfig.json +17 -12
  118. package/src/app/components/Backtest/TestCard/OpenReportButton/index.tsx +0 -24
  119. package/src/app/routes/backtest/[test]/page.tsx +0 -33
@@ -0,0 +1 @@
1
+ export const CARD_PAGE_CONTENT_MAX_WIDTH = '1400px';
@@ -0,0 +1,28 @@
1
+ import { getConnectorCreatorByProvider as getBuiltinConnectorCreatorByProvider } from '@tradejs/connectors';
2
+ import { getConnectorCreatorByProvider as getRegisteredConnectorCreatorByProvider } from '@tradejs/node/connectors';
3
+ import { ConnectorCreator } from '@tradejs/types';
4
+
5
+ export const DEFAULT_CONNECTOR_PROVIDER = 'bybit';
6
+
7
+ export const resolveConnectorCreatorByProvider = async (
8
+ provider: string,
9
+ projectRoot: string,
10
+ fallbackProvider = DEFAULT_CONNECTOR_PROVIDER,
11
+ ): Promise<ConnectorCreator | null> => {
12
+ const registeredConnector =
13
+ (await getRegisteredConnectorCreatorByProvider(provider, projectRoot)) ||
14
+ (await getRegisteredConnectorCreatorByProvider(
15
+ fallbackProvider,
16
+ projectRoot,
17
+ ));
18
+
19
+ if (registeredConnector) {
20
+ return registeredConnector as ConnectorCreator;
21
+ }
22
+
23
+ return (
24
+ getBuiltinConnectorCreatorByProvider(provider) ||
25
+ getBuiltinConnectorCreatorByProvider(fallbackProvider) ||
26
+ null
27
+ );
28
+ };
@@ -1,4 +1,4 @@
1
- import { auth } from '@app/auth';
1
+ import { auth } from '#app/auth';
2
2
 
3
3
  type SessionLike = {
4
4
  user?: {
@@ -0,0 +1,34 @@
1
+ const getStringField = (value: unknown, key: string) => {
2
+ if (!value || typeof value !== 'object') return null;
3
+
4
+ const field = (value as Record<string, unknown>)[key];
5
+ if (typeof field === 'string' && field.trim()) return field.trim();
6
+ if (key === 'code' && typeof field === 'number') return String(field);
7
+ return null;
8
+ };
9
+
10
+ export const getErrorMessage = (error: unknown) => {
11
+ if (error instanceof Error && error.message.trim()) {
12
+ return error.message.trim();
13
+ }
14
+
15
+ if (typeof error === 'string' && error.trim()) {
16
+ return error.trim();
17
+ }
18
+
19
+ const code = getStringField(error, 'code');
20
+ const message = getStringField(error, 'message');
21
+ const body = getStringField(error, 'body');
22
+ const details = [code, message].filter(Boolean).join(' ');
23
+
24
+ if (details || body) {
25
+ return [details, body].filter(Boolean).join(': ');
26
+ }
27
+
28
+ try {
29
+ const serialized = JSON.stringify(error);
30
+ return serialized && serialized !== '{}' ? serialized : 'Unknown error';
31
+ } catch {
32
+ return 'Unknown error';
33
+ }
34
+ };
@@ -0,0 +1,12 @@
1
+ import type { MarketUniverse, Provider } from '@tradejs/types';
2
+
3
+ export const getDefaultMarketSymbol = (
4
+ provider: Provider,
5
+ universe: MarketUniverse,
6
+ ) => {
7
+ if (universe === 'tradfi') {
8
+ return 'AAPLUSDT';
9
+ }
10
+
11
+ return provider === 'coinbase' ? 'BTC-USD' : 'BTCUSDT';
12
+ };
@@ -0,0 +1,58 @@
1
+ import {
2
+ Interval,
3
+ isMarketUniverse,
4
+ MarketUniverse,
5
+ Provider,
6
+ } from '@tradejs/types';
7
+
8
+ interface MarketRouteParts {
9
+ provider: string;
10
+ universe: MarketUniverse;
11
+ symbol: string;
12
+ interval: string;
13
+ }
14
+
15
+ interface DashboardRouteParts {
16
+ provider: Provider;
17
+ universe: MarketUniverse;
18
+ symbol: string;
19
+ interval: Interval;
20
+ }
21
+
22
+ const appendRouteQuery = (pathname: string, searchParams?: URLSearchParams) => {
23
+ const params = new URLSearchParams(searchParams);
24
+ const search = params.toString();
25
+ return `${pathname}${search ? `?${search}` : ''}`;
26
+ };
27
+
28
+ export const buildKlinePath = ({
29
+ provider,
30
+ universe,
31
+ symbol,
32
+ interval,
33
+ }: MarketRouteParts) =>
34
+ `/api/kline/${provider}/${universe}/${symbol}/${interval}`;
35
+
36
+ export const buildDashboardPath = (
37
+ { provider, universe, symbol, interval }: MarketRouteParts,
38
+ searchParams?: URLSearchParams,
39
+ ) =>
40
+ appendRouteQuery(
41
+ `/routes/dashboard/${provider}/${universe}/${symbol}/${interval}`,
42
+ searchParams,
43
+ );
44
+
45
+ export const parseDashboardPath = (
46
+ pathname: string,
47
+ fallback: Omit<DashboardRouteParts, 'universe'>,
48
+ ): DashboardRouteParts => {
49
+ const parts = pathname.split('/').filter(Boolean);
50
+ const rawUniverse = parts[3];
51
+
52
+ return {
53
+ provider: (parts[2] || fallback.provider) as Provider,
54
+ universe: isMarketUniverse(rawUniverse) ? rawUniverse : 'crypto',
55
+ symbol: parts[4] || fallback.symbol,
56
+ interval: (parts[5] || fallback.interval) as Interval,
57
+ };
58
+ };