feat(frontend): S1 回测核心页(新建/进度/结果 + ECharts 图表)
- api/strategy.ts、api/backtest.ts(含类型) - 回测-新建(策略下拉+动态参数表单+日期+提交) - useTask 组合式(轮询+WS 实时阶段)+ 进度页 - 结果页:统计全表 + 资金曲线 + 每日盈亏(红涨绿跌) + 成交表 + K线买卖点 - build 通过;result 接口扩 symbol/start/end 供 K线调用
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user