diff --git a/src/Managing.Api/Controllers/BacktestController.cs b/src/Managing.Api/Controllers/BacktestController.cs
index c3b78e37..182e52c9 100644
--- a/src/Managing.Api/Controllers/BacktestController.cs
+++ b/src/Managing.Api/Controllers/BacktestController.cs
@@ -233,7 +233,7 @@ public class BacktestController : BaseController
/// A list of backtests associated with the specified request ID.
[HttpGet]
[Route("ByRequestId/{requestId}")]
- public async Task>> GetBacktestsByRequestId(string requestId)
+ public async Task>> GetBacktestsByRequestId(string requestId)
{
if (string.IsNullOrEmpty(requestId))
{
@@ -246,7 +246,7 @@ public class BacktestController : BaseController
}
var backtests = await _backtester.GetBacktestsByRequestIdAsync(requestGuid);
- return Ok(backtests);
+ return Ok(backtests.Select(b => LightBacktestResponseMapper.MapFromDomain(b)));
}
///
diff --git a/src/Managing.Common/Enums.cs b/src/Managing.Common/Enums.cs
index 57c0ec8e..c521677c 100644
--- a/src/Managing.Common/Enums.cs
+++ b/src/Managing.Common/Enums.cs
@@ -511,6 +511,7 @@ public static class Enums
{
Score,
FinalPnl,
+ NetPnl,
WinRate,
GrowthPercentage,
HodlPercentage,
diff --git a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBacktestRepository.cs b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBacktestRepository.cs
index 2f544271..df18a0ad 100644
--- a/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBacktestRepository.cs
+++ b/src/Managing.Infrastructure.Database/PostgreSql/PostgreSqlBacktestRepository.cs
@@ -518,6 +518,9 @@ public class PostgreSqlBacktestRepository : IBacktestRepository
BacktestSortableColumn.FinalPnl => sortOrder == "desc"
? baseQuery.OrderByDescending(b => b.FinalPnl)
: baseQuery.OrderBy(b => b.FinalPnl),
+ BacktestSortableColumn.NetPnl => sortOrder == "desc"
+ ? baseQuery.OrderByDescending(b => b.NetPnl)
+ : baseQuery.OrderBy(b => b.NetPnl),
BacktestSortableColumn.WinRate => sortOrder == "desc"
? baseQuery.OrderByDescending(b => b.WinRate)
: baseQuery.OrderBy(b => b.WinRate),
@@ -654,6 +657,9 @@ public class PostgreSqlBacktestRepository : IBacktestRepository
BacktestSortableColumn.FinalPnl => sortOrder == "desc"
? baseQuery.OrderByDescending(b => b.FinalPnl)
: baseQuery.OrderBy(b => b.FinalPnl),
+ BacktestSortableColumn.NetPnl => sortOrder == "desc"
+ ? baseQuery.OrderByDescending(b => b.NetPnl)
+ : baseQuery.OrderBy(b => b.NetPnl),
BacktestSortableColumn.WinRate => sortOrder == "desc"
? baseQuery.OrderByDescending(b => b.WinRate)
: baseQuery.OrderBy(b => b.WinRate),
diff --git a/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx b/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx
index cd447473..8ad14e1a 100644
--- a/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx
+++ b/src/Managing.WebApp/src/components/organism/Backtest/backtestTable.tsx
@@ -76,6 +76,7 @@ const ServerSortableTable = ({
const enumToColumnMapping: { [key in BacktestSortableColumn]?: string } = {
[BacktestSortableColumn.Score]: 'score',
[BacktestSortableColumn.FinalPnl]: 'finalPnl',
+ [BacktestSortableColumn.NetPnl]: 'netPnl',
[BacktestSortableColumn.WinRate]: 'winRate',
[BacktestSortableColumn.GrowthPercentage]: 'growthPercentage',
[BacktestSortableColumn.HodlPercentage]: 'hodlPercentage',
@@ -169,6 +170,7 @@ const BacktestTable: React.FC = ({list, isFetching, onSortCh
const [rows, setRows] = useState([])
const {apiUrl} = useApiUrlStore()
const {removeBacktest} = useBacktestStore()
+ console.log('list', list)
// Bot configuration modal state
const [showBotConfigModal, setShowBotConfigModal] = useState(false)
@@ -350,6 +352,7 @@ const BacktestTable: React.FC = ({list, isFetching, onSortCh
const sortByMapping: { [key: string]: BacktestSortableColumn } = {
'score': BacktestSortableColumn.Score,
'finalPnl': BacktestSortableColumn.FinalPnl,
+ 'netPnl': BacktestSortableColumn.NetPnl,
'winRate': BacktestSortableColumn.WinRate,
'growthPercentage': BacktestSortableColumn.GrowthPercentage,
'hodlPercentage': BacktestSortableColumn.HodlPercentage,
@@ -525,10 +528,10 @@ const BacktestTable: React.FC = ({list, isFetching, onSortCh
columns: [
{
Cell: ({cell}: any) => (
- <>{cell.row.values.finalPnl.toFixed(2)} $>
+ <>{cell.row.values.netPnl.toFixed(2)} $>
),
Header: 'Pnl $',
- accessor: 'finalPnl',
+ accessor: 'netPnl',
disableFilters: true,
disableSortBy: false,
sortType: 'basic',
diff --git a/src/Managing.WebApp/src/generated/ManagingApi.ts b/src/Managing.WebApp/src/generated/ManagingApi.ts
index 54003db2..6145bec0 100644
--- a/src/Managing.WebApp/src/generated/ManagingApi.ts
+++ b/src/Managing.WebApp/src/generated/ManagingApi.ts
@@ -800,7 +800,7 @@ export class BacktestClient extends AuthorizedApiBase {
return Promise.resolve(null as any);
}
- backtest_GetBacktestsByRequestId(requestId: string): Promise {
+ backtest_GetBacktestsByRequestId(requestId: string): Promise {
let url_ = this.baseUrl + "/Backtest/ByRequestId/{requestId}";
if (requestId === undefined || requestId === null)
throw new Error("The parameter 'requestId' must be defined.");
@@ -821,13 +821,13 @@ export class BacktestClient extends AuthorizedApiBase {
});
}
- protected processBacktest_GetBacktestsByRequestId(response: Response): Promise {
+ protected processBacktest_GetBacktestsByRequestId(response: Response): Promise {
const status = response.status;
let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
if (status === 200) {
return response.text().then((_responseText) => {
let result200: any = null;
- result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as Backtest[];
+ result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as LightBacktestResponse[];
return result200;
});
} else if (status !== 200 && status !== 204) {
@@ -835,7 +835,7 @@ export class BacktestClient extends AuthorizedApiBase {
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
});
}
- return Promise.resolve(null as any);
+ return Promise.resolve(null as any);
}
backtest_GetBacktestsByRequestIdPaginated(requestId: string, page: number | undefined, pageSize: number | undefined, sortBy: string | null | undefined, sortOrder: string | null | undefined): Promise {
@@ -5010,16 +5010,6 @@ export interface DeleteBacktestsRequest {
backtestIds: string[];
}
-export interface PaginatedBacktestsResponse {
- backtests?: LightBacktestResponse[] | null;
- totalCount?: number;
- currentPage?: number;
- pageSize?: number;
- totalPages?: number;
- hasNextPage?: boolean;
- hasPreviousPage?: boolean;
-}
-
export interface LightBacktestResponse {
id: string;
config: TradingBotConfig;
@@ -5038,9 +5028,20 @@ export interface LightBacktestResponse {
netPnl: number;
}
+export interface PaginatedBacktestsResponse {
+ backtests?: LightBacktestResponse[] | null;
+ totalCount?: number;
+ currentPage?: number;
+ pageSize?: number;
+ totalPages?: number;
+ hasNextPage?: boolean;
+ hasPreviousPage?: boolean;
+}
+
export enum BacktestSortableColumn {
Score = "Score",
FinalPnl = "FinalPnl",
+ NetPnl = "NetPnl",
WinRate = "WinRate",
GrowthPercentage = "GrowthPercentage",
HodlPercentage = "HodlPercentage",
diff --git a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts
index 1426bef9..f6c2d3ae 100644
--- a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts
+++ b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts
@@ -572,16 +572,6 @@ export interface DeleteBacktestsRequest {
backtestIds: string[];
}
-export interface PaginatedBacktestsResponse {
- backtests?: LightBacktestResponse[] | null;
- totalCount?: number;
- currentPage?: number;
- pageSize?: number;
- totalPages?: number;
- hasNextPage?: boolean;
- hasPreviousPage?: boolean;
-}
-
export interface LightBacktestResponse {
id: string;
config: TradingBotConfig;
@@ -600,9 +590,20 @@ export interface LightBacktestResponse {
netPnl: number;
}
+export interface PaginatedBacktestsResponse {
+ backtests?: LightBacktestResponse[] | null;
+ totalCount?: number;
+ currentPage?: number;
+ pageSize?: number;
+ totalPages?: number;
+ hasNextPage?: boolean;
+ hasPreviousPage?: boolean;
+}
+
export enum BacktestSortableColumn {
Score = "Score",
FinalPnl = "FinalPnl",
+ NetPnl = "NetPnl",
WinRate = "WinRate",
GrowthPercentage = "GrowthPercentage",
HodlPercentage = "HodlPercentage",
diff --git a/src/Managing.WebApp/src/pages/backtestPage/BundleRequestModal.tsx b/src/Managing.WebApp/src/pages/backtestPage/BundleRequestModal.tsx
index c3f1d335..179537ea 100644
--- a/src/Managing.WebApp/src/pages/backtestPage/BundleRequestModal.tsx
+++ b/src/Managing.WebApp/src/pages/backtestPage/BundleRequestModal.tsx
@@ -299,40 +299,16 @@ const BundleRequestModal: React.FC = ({
queryFn: async () => {
if (!open || !bundle) return [];
const res = await backtestClient.backtest_GetBacktestsByRequestId(bundle.requestId);
- if (!res) return [];
- return res.map((b: any) => {
- // Map enums for ticker and timeframe
- if (b.config) {
- if (typeof b.config.ticker === 'number') {
- b.config.ticker = Ticker[b.config.ticker as keyof typeof Ticker];
- }
- if (typeof b.config.timeframe === 'number') {
- b.config.timeframe = Timeframe[b.config.timeframe as keyof typeof Timeframe];
- }
- }
- return {
- id: b.id,
- config: b.config,
- finalPnl: b.finalPnl,
- winRate: b.winRate,
- growthPercentage: b.growthPercentage,
- hodlPercentage: b.hodlPercentage,
- startDate: b.startDate,
- endDate: b.endDate,
- maxDrawdown: b.maxDrawdown ?? null,
- fees: b.fees,
- sharpeRatio: b.sharpeRatio ?? null,
- score: b.score ?? 0,
- scoreMessage: b.scoreMessage ?? '',
- };
- });
+ if (!res) return [] as LightBacktestResponse[];
+ console.log('res', res)
+ return res as LightBacktestResponse[];
},
enabled: !!open && !!bundle,
refetchOnWindowFocus: false,
});
useEffect(() => {
- if (queryBacktests) setBacktests(queryBacktests);
+ if (queryBacktests) setBacktests(queryBacktests as LightBacktestResponse[]);
}, [queryBacktests]);
if (!open) return null;