Files
sanguo_vnpy_v2/frontend/src/api/paper.ts
T
claude_dev 5c8a7e12c6
CI/CD / test (push) Successful in 18s
CI/CD / nas-deploy (push) Failing after 17s
CI/CD / nas-verify (push) Has been skipped
feat(frontend): 终端化重构+策略管理(代码→实例→4运行)+撮合设计+回测参数 [nas]
- 终端化: 科幻色板(tokens/EP/reset/chips/echarts)+Layout(Cmd+K/时钟/状态灯)+mock全接口+Dashboard/Result/Monitor样板+6图表配色
- 策略管理: 策略库三层(代码→实例→4运行)+新建策略(组合/CTA模板+Monaco)+在线代码编辑(Monaco)+实例CRUD(参数反射/标的池type切/interval/match_session)
- 实例→运行关联: backtest/paper/live New页读instance预填
- 撮合设计: match_session(下一根K线开盘/收盘/集合竞价)+interval定频率+实走限日线/分钟走miniQMT
- 回测参数: 基准下拉+日期默认1年localStorage记忆+滑点/手续费UI
- 账户管理页+命名重整(模拟盘/实盘,消除撞名)
- spec §11-13(菜单/策略管理/撮合设计) + Monaco编辑器 + 策略实例删除/编辑入口 + 列表实例列
2026-08-12 23:23:23 +08:00

127 lines
2.9 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
}
export interface PaperAccount {
id: number
name: string
mode: string
interval: string
status: string
symbols?: string
initial_capital?: number
start_date?: string
end_date?: 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
}