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;