feat(frontend): S1 回测核心页(新建/进度/结果 + ECharts 图表)

- api/strategy.ts、api/backtest.ts(含类型)
- 回测-新建(策略下拉+动态参数表单+日期+提交)
- useTask 组合式(轮询+WS 实时阶段)+ 进度页
- 结果页:统计全表 + 资金曲线 + 每日盈亏(红涨绿跌) + 成交表 + K线买卖点
- build 通过;result 接口扩 symbol/start/end 供 K线调用
This commit is contained in:
2026-07-07 06:13:10 +08:00
parent 3a0e75fdc1
commit 80d7f58589
11 changed files with 531 additions and 7 deletions
+89
View File
@@ -0,0 +1,89 @@
import { apiClient } from './client'
export interface CtaSubmit {
symbol: string
strategy: string
params: Record<string, unknown>
start: string
end: string
}
export interface TaskStatus {
task_id: string
status: string
stage: string
}
export interface EquityPoint {
date: string
balance: number
}
export interface PnlPoint {
date: string
pnl: number
}
export interface Trade {
datetime: string
direction: string
offset: string
price: number
volume: number
vt_symbol?: string
}
export interface KlineBar {
datetime: string
open: number
high: number
low: number
close: number
volume: number
}
export async function submitCta(req: CtaSubmit): Promise<string> {
const { data } = await apiClient.post<{ task_id: string }>('/backtest/cta', req)
return data.task_id
}
export async function getStatus(taskId: string): Promise<TaskStatus> {
const { data } = await apiClient.get<TaskStatus>(`/task/${taskId}`)
return data
}
export interface BacktestResultInfo {
task_id: string
statistics: Record<string, unknown>
symbol: string
start: string
end: string
strategy: string
params: Record<string, unknown>
status: string
}
export async function getResult(taskId: string): Promise<BacktestResultInfo> {
const { data } = await apiClient.get<BacktestResultInfo>(`/task/${taskId}/result`)
return data
}
export async function getEquityCurve(taskId: string): Promise<EquityPoint[]> {
const { data } = await apiClient.get<{ equity_curve: EquityPoint[] }>(`/task/${taskId}/equity-curve`)
return data.equity_curve
}
export async function getDailyPnl(taskId: string): Promise<PnlPoint[]> {
const { data } = await apiClient.get<{ daily_pnl: PnlPoint[] }>(`/task/${taskId}/daily-pnl`)
return data.daily_pnl
}
export async function getTrades(taskId: string): Promise<Trade[]> {
const { data } = await apiClient.get<{ trades: Trade[] }>(`/task/${taskId}/trades`)
return data.trades
}
export async function getKline(symbol: string, start: string, end: string): Promise<KlineBar[]> {
const { data } = await apiClient.get<{ kline: KlineBar[] }>('/kline', { params: { symbol, start, end } })
return data.kline
}
+21
View File
@@ -0,0 +1,21 @@
import { apiClient } from './client'
export interface StrategyItem {
name: string
class_name: string
}
export interface StrategyParams {
parameters: string[]
defaults: Record<string, unknown>
}
export async function getStrategies(): Promise<StrategyItem[]> {
const { data } = await apiClient.get<{ strategies: StrategyItem[] }>('/strategy/list')
return data.strategies
}
export async function getParams(name: string): Promise<StrategyParams> {
const { data } = await apiClient.get<StrategyParams>(`/strategy/${name}/params`)
return data
}