Files
sanguo_vnpy_v2/frontend/src/api/paper.ts
T

163 lines
4.1 KiB
TypeScript

import { apiClient } from './client'
export interface StrategyCfg {
name: string
params: Record<string, unknown>
match_session: string
symbol: string
listing_days?: number
}
export interface PaperCreate {
mode: string
interval: string
symbols: string[]
strategies: StrategyCfg[]
initial_capital: number
start: string
end: string
// 组合策略实走(E1):strategy_type=portfolio 时 mode 须 live
strategy_type?: string
pool?: string
max_pool?: number
benchmark?: string
// 撮合引擎(影子柜台 P1):eod_replay=日终回放 / shadow=影子柜台
engine?: string
}
export interface PaperAccount {
id: number
name: string
mode: string
interval: string
status: string
strategy_type?: string
engine?: string
symbols?: string
initial_capital?: number
start_date?: string
end_date?: string
created_at?: string
last_run_date?: string | null
next_run_at?: string | null
checkpoint_date?: string | null
error_msg?: string | null
/** 列表端点附带的最新净值 / 收益(单账户 GET 不含) */
latest_equity?: number | null
latest_date?: string | null
total_return?: number | null
instance?: string
}
export interface BalancePoint {
date: string
cash: number
market_value: number
total_equity: number
is_checkpoint: number
}
export interface PaperTrade {
strategy_id: string
symbol: string
direction: string
price: number
volume: number
commission: number
rejected: number
reject_reason: string
bar_date: string
}
export interface StrategySummary {
strategy_id: string
total_orders: number
filled: number
rejected: number
commission: number
}
export interface PositionRow {
symbol: string
volume: number
frozen: number
avg_price: number
}
export interface PendingOrder {
strategy_id: string
symbol: string
side: string
price: number
volume: number
is_market: boolean
match_session: string
listing_days: number
}
export async function createPaper(req: PaperCreate): Promise<number> {
const { data } = await apiClient.post<{ account_id: number }>('/paper/create', req)
return data.account_id
}
export async function listPapers(): Promise<PaperAccount[]> {
const { data } = await apiClient.get<{ accounts: PaperAccount[] }>('/paper')
return data.accounts
}
export async function getPaper(aid: number): Promise<PaperAccount> {
const { data } = await apiClient.get<PaperAccount>(`/paper/${aid}`)
return data
}
export async function getEquity(aid: number): Promise<BalancePoint[]> {
const { data } = await apiClient.get<BalancePoint[]>(`/paper/${aid}/equity`)
return data
}
export async function getTrades(aid: number): Promise<PaperTrade[]> {
const { data } = await apiClient.get<PaperTrade[]>(`/paper/${aid}/trades`)
return data
}
export async function getStrategies(aid: number): Promise<StrategySummary[]> {
const { data } = await apiClient.get<StrategySummary[]>(`/paper/${aid}/strategies`)
return data
}
export async function getPositions(aid: number): Promise<PositionRow[]> {
const { data } = await apiClient.get<PositionRow[]>(`/paper/${aid}/positions`)
return data
}
export async function getPending(aid: number): Promise<PendingOrder[]> {
const { data } = await apiClient.get<PendingOrder[]>(`/paper/${aid}/pending`)
return data
}
export async function stopPaper(aid: number): Promise<{ account_id: number; status: string }> {
const { data } = await apiClient.post(`/paper/${aid}/stop`)
return data
}
export async function resumePaper(aid: number): Promise<{ account_id: number; status: string }> {
const { data } = await apiClient.post(`/paper/${aid}/resume`)
return data
}
export async function deletePaper(aid: number): Promise<{ account_id: number; deleted: boolean }> {
const { data } = await apiClient.delete(`/paper/${aid}`)
return data
}
export interface PaperUpdateReq {
name?: string
symbols?: string[]
initial_capital?: number
}
export async function updatePaper(aid: number, req: PaperUpdateReq): Promise<{ updated: boolean }> {
const { data } = await apiClient.put(`/paper/${aid}`, req)
return data
}