Remove playground because not working anymore and make backtest properties required
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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',
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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
|
|
||||||
Reference in New Issue
Block a user