Remove playground because not working anymore and make backtest properties required

This commit is contained in:
2025-07-17 22:54:02 +07:00
parent 03a4e179f7
commit 6d1f0d612b
7 changed files with 67 additions and 146 deletions

View File

@@ -1,20 +1,22 @@
using System.ComponentModel.DataAnnotations;
using Managing.Domain.Bots; using Managing.Domain.Bots;
namespace Managing.Api.Models.Requests; namespace Managing.Api.Models.Requests;
public class LightBacktestResponse public class LightBacktestResponse
{ {
public string Id { get; set; } = string.Empty; [Required] public string Id { get; set; } = string.Empty;
public TradingBotConfig Config { get; set; } = new(); [Required] public TradingBotConfig Config { get; set; } = new();
public decimal FinalPnl { get; set; } [Required] public decimal FinalPnl { get; set; }
public int WinRate { get; set; } [Required] public int WinRate { get; set; }
public decimal GrowthPercentage { get; set; } [Required] public decimal GrowthPercentage { get; set; }
public decimal HodlPercentage { get; set; } [Required] public decimal HodlPercentage { get; set; }
public DateTime StartDate { get; set; } [Required] public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; } [Required] public DateTime EndDate { get; set; }
public decimal? MaxDrawdown { get; set; } [Required] public decimal? MaxDrawdown { get; set; }
public decimal Fees { get; set; } [Required] public decimal Fees { get; set; }
public double? SharpeRatio { get; set; }
public double Score { get; set; } [Required] public double? SharpeRatio { get; set; }
public string ScoreMessage { get; set; } = string.Empty; [Required] public double Score { get; set; }
} [Required] public string ScoreMessage { get; set; } = string.Empty;
}

View File

@@ -7,7 +7,6 @@ import useBacktestStore from '../../../app/store/backtestStore'
import type { import type {
Backtest, Backtest,
MoneyManagement, MoneyManagement,
RunBacktestRequest,
StartBotRequest, StartBotRequest,
TradingBotConfig, TradingBotConfig,
TradingBotConfigRequest TradingBotConfigRequest
@@ -151,39 +150,6 @@ const BacktestCards: React.FC<BacktestCardsProps> = ({list}) => {
setShowBotNameModal(false) setShowBotNameModal(false)
} }
async function runOptimizedBacktest(backtest: Backtest) {
const t = new Toast('Optimized backtest is running')
const client = new BacktestClient({}, apiUrl)
// Calculate dates for the API call
const startDate = backtest.candles[0].date
const endDate = backtest.candles[backtest.candles.length - 1].date
// Create optimized backtest config
const optimizedConfig: TradingBotConfig = {
...backtest.config,
name: `${backtest.config.ticker}-${backtest.config.scenarioName}-Optimized`,
moneyManagement: backtest.optimizedMoneyManagement || backtest.config.moneyManagement
}
const request: RunBacktestRequest = {
config: optimizedConfig as unknown as TradingBotConfigRequest,
startDate: startDate,
endDate: endDate,
save: false,
}
await client
.backtest_Run(request)
.then((backtest: Backtest) => {
t.update('success', `${backtest.config.ticker} Backtest Succeeded`)
addBacktest(backtest)
})
.catch((err) => {
t.update('error', 'Error :' + err)
})
}
async function deleteBacktest(id: string) { async function deleteBacktest(id: string) {
const t = new Toast('Deleting backtest') const t = new Toast('Deleting backtest')
const client = new BacktestClient({}, apiUrl) const client = new BacktestClient({}, apiUrl)
@@ -217,7 +183,7 @@ const BacktestCards: React.FC<BacktestCardsProps> = ({list}) => {
<div className="tooltip" data-tip="Delete backtest"> <div className="tooltip" data-tip="Delete backtest">
<button <button
className="btn btn-primary h-5 min-h-0 px-2 mr-5 rounded-full" className="btn btn-primary h-5 min-h-0 px-2 mr-5 rounded-full"
onClick={() => deleteBacktest(backtest.id)} onClick={() => deleteBacktest(backtest.id ?? '')}
> >
<TrashIcon width={15}></TrashIcon> <TrashIcon width={15}></TrashIcon>
</button> </button>
@@ -279,14 +245,6 @@ const BacktestCards: React.FC<BacktestCardsProps> = ({list}) => {
Save money management Save money management
</button> </button>
</li> </li>
<li>
<button
className="text-xs"
onClick={() => runOptimizedBacktest(backtest)}
>
Run optimized money management
</button>
</li>
</ul> </ul>
</div> </div>
{backtest.config.ticker} {backtest.config.ticker}

View File

@@ -7,24 +7,25 @@ import useBacktestStore from '../../../app/store/backtestStore'
import {useCustomMoneyManagement} from '../../../app/store/customMoneyManagement' import {useCustomMoneyManagement} from '../../../app/store/customMoneyManagement'
import {useCustomScenario} from '../../../app/store/customScenario' import {useCustomScenario} from '../../../app/store/customScenario'
import { import {
AccountClient, AccountClient,
BacktestClient, BacktestClient,
BotClient, BotClient,
DataClient, DataClient,
MoneyManagement, LightBacktestResponse,
MoneyManagementClient, MoneyManagement,
RiskManagement, MoneyManagementClient,
RiskToleranceLevel, RiskManagement,
RunBacktestRequest, RiskToleranceLevel,
Scenario, RunBacktestRequest,
ScenarioClient, Scenario,
ScenarioRequest, ScenarioClient,
SignalType, ScenarioRequest,
StartBotRequest, SignalType,
Ticker, StartBotRequest,
Timeframe, Ticker,
TradingBotConfigRequest, Timeframe,
UpdateBotConfigRequest, TradingBotConfigRequest,
UpdateBotConfigRequest,
} from '../../../generated/ManagingApi' } from '../../../generated/ManagingApi'
import type {IUnifiedTradingConfigInput, UnifiedTradingModalProps} from '../../../global/type' import type {IUnifiedTradingConfigInput, UnifiedTradingModalProps} from '../../../global/type'
import {Loader} from '../../atoms' import {Loader} from '../../atoms'
@@ -713,7 +714,7 @@ const UnifiedTradingModal: React.FC<UnifiedTradingModalProps> = ({
const backtest = await backtestClient.backtest_Run(request); const backtest = await backtestClient.backtest_Run(request);
t.update('success', `${ticker} Backtest Succeeded`); t.update('success', `${ticker} Backtest Succeeded`);
addBacktest(backtest); addBacktest(backtest as unknown as LightBacktestResponse);
} catch (err: any) { } catch (err: any) {

View File

@@ -3805,19 +3805,19 @@ export interface PaginatedBacktestsResponse {
} }
export interface LightBacktestResponse { export interface LightBacktestResponse {
id?: string | null; id: string;
config?: TradingBotConfig | null; config: TradingBotConfig;
finalPnl?: number; finalPnl: number;
winRate?: number; winRate: number;
growthPercentage?: number; growthPercentage: number;
hodlPercentage?: number; hodlPercentage: number;
startDate?: Date; startDate: Date;
endDate?: Date; endDate: Date;
maxDrawdown?: number | null; maxDrawdown: number;
fees?: number; fees: number;
sharpeRatio?: number | null; sharpeRatio: number;
score?: number; score: number;
scoreMessage?: string | null; scoreMessage: string;
} }
export interface RunBacktestRequest { export interface RunBacktestRequest {

View File

@@ -611,19 +611,19 @@ export interface PaginatedBacktestsResponse {
} }
export interface LightBacktestResponse { export interface LightBacktestResponse {
id?: string | null; id: string;
config?: TradingBotConfig | null; config: TradingBotConfig;
finalPnl?: number; finalPnl: number;
winRate?: number; winRate: number;
growthPercentage?: number; growthPercentage: number;
hodlPercentage?: number; hodlPercentage: number;
startDate?: Date; startDate: Date;
endDate?: Date; endDate: Date;
maxDrawdown?: number | null; maxDrawdown: number;
fees?: number; fees: number;
sharpeRatio?: number | null; sharpeRatio: number;
score?: number; score: number;
scoreMessage?: string | null; scoreMessage: string;
} }
export interface RunBacktestRequest { export interface RunBacktestRequest {

View File

@@ -2,7 +2,6 @@ import React, {useState} from 'react'
import 'react-toastify/dist/ReactToastify.css' import 'react-toastify/dist/ReactToastify.css'
import {Tabs} from '../../components/mollecules' import {Tabs} from '../../components/mollecules'
import BacktestPlayground from './backtestPlayground'
import BacktestScanner from './backtestScanner' import BacktestScanner from './backtestScanner'
import BacktestUpload from './backtestUpload' import BacktestUpload from './backtestUpload'
import BacktestGenetic from './backtestGenetic' import BacktestGenetic from './backtestGenetic'
@@ -11,29 +10,24 @@ import type {TabsType} from '../../global/type.tsx'
// Tabs Array // Tabs Array
const tabs: TabsType = [ const tabs: TabsType = [
{
Component: BacktestPlayground,
index: 1,
label: 'Playground',
},
{ {
Component: BacktestScanner, Component: BacktestScanner,
index: 2, index: 1,
label: 'Scanner', label: 'Scanner',
}, },
{ {
Component: BacktestUpload, Component: BacktestUpload,
index: 3, index: 2,
label: 'Upload', label: 'Upload',
}, },
{ {
Component: BacktestGenetic, Component: BacktestGenetic,
index: 4, index: 3,
label: 'Genetic', label: 'Genetic',
}, },
{ {
Component: BacktestGeneticBundle, Component: BacktestGeneticBundle,
index: 5, index: 4,
label: 'GeneticBundle', label: 'GeneticBundle',
}, },
] ]

View File

@@ -1,34 +0,0 @@
import React, {useState} from 'react'
import 'react-toastify/dist/ReactToastify.css'
import useBacktestStore from '../../app/store/backtestStore'
import {BacktestCards, UnifiedTradingModal} from '../../components/organism'
const BacktestPlayground: React.FC = () => {
const { backtests: backtestingResult } = useBacktestStore()
const [showModal, setShowModal] = useState(false)
function openModal() {
setShowModal(true)
}
function closeModal() {
setShowModal(false)
}
return (
<div className="container mx-auto">
<button className="btn" onClick={openModal}>
Run New Backtest
</button>
<BacktestCards list={backtestingResult} />
<UnifiedTradingModal
mode="backtest"
showModal={showModal}
closeModal={closeModal}
/>
</div>
)
}
export default BacktestPlayground