messy work. backtests / mock-data
This commit is contained in:
parent
4e4a048988
commit
fa70ada2bb
51 changed files with 2576 additions and 887 deletions
119
apps/stock/web-app/src/features/backtest/services/backtestApi.ts
Normal file
119
apps/stock/web-app/src/features/backtest/services/backtestApi.ts
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:2003';
|
||||
|
||||
export interface BacktestRequest {
|
||||
strategy: string;
|
||||
symbols: string[];
|
||||
startDate: string;
|
||||
endDate: string;
|
||||
initialCapital: number;
|
||||
config?: Record<string, any>;
|
||||
}
|
||||
|
||||
export interface BacktestJob {
|
||||
id: string;
|
||||
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
||||
strategy: string;
|
||||
symbols: string[];
|
||||
startDate: string;
|
||||
endDate: string;
|
||||
initialCapital: number;
|
||||
config: Record<string, any>;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
error?: string;
|
||||
}
|
||||
|
||||
export interface BacktestResult {
|
||||
backtestId: string;
|
||||
metrics: {
|
||||
totalReturn: number;
|
||||
sharpeRatio: number;
|
||||
maxDrawdown: number;
|
||||
winRate: number;
|
||||
totalTrades: number;
|
||||
profitFactor?: number;
|
||||
};
|
||||
equity: Array<{ date: string; value: number }>;
|
||||
trades?: Array<{
|
||||
symbol: string;
|
||||
entryDate: string;
|
||||
exitDate: string;
|
||||
entryPrice: number;
|
||||
exitPrice: number;
|
||||
quantity: number;
|
||||
pnl: number;
|
||||
}>;
|
||||
ohlcData?: Record<string, Array<{
|
||||
time: number;
|
||||
open: number;
|
||||
high: number;
|
||||
low: number;
|
||||
close: number;
|
||||
volume?: number;
|
||||
}>>;
|
||||
}
|
||||
|
||||
export const backtestApi = {
|
||||
// Create a new backtest
|
||||
async createBacktest(request: BacktestRequest): Promise<BacktestJob> {
|
||||
const response = await fetch(`${API_BASE_URL}/api/backtests`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(request),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to create backtest: ${response.statusText}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
},
|
||||
|
||||
// Get backtest status
|
||||
async getBacktest(id: string): Promise<BacktestJob> {
|
||||
const response = await fetch(`${API_BASE_URL}/api/backtests/${id}`);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to get backtest: ${response.statusText}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
},
|
||||
|
||||
// Get backtest results
|
||||
async getBacktestResults(id: string): Promise<BacktestResult> {
|
||||
const response = await fetch(`${API_BASE_URL}/api/backtests/${id}/results`);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to get results: ${response.statusText}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
},
|
||||
|
||||
// List all backtests
|
||||
async listBacktests(limit = 50, offset = 0): Promise<BacktestJob[]> {
|
||||
const response = await fetch(
|
||||
`${API_BASE_URL}/api/backtests?limit=${limit}&offset=${offset}`
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to list backtests: ${response.statusText}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
},
|
||||
|
||||
// Cancel a running backtest
|
||||
async cancelBacktest(id: string): Promise<void> {
|
||||
const response = await fetch(`${API_BASE_URL}/api/backtests/${id}/cancel`, {
|
||||
method: 'POST',
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to cancel backtest: ${response.statusText}`);
|
||||
}
|
||||
},
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue