5c8a7e12c6
- 终端化: 科幻色板(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编辑器 + 策略实例删除/编辑入口 + 列表实例列
127 lines
2.9 KiB
TypeScript
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
|
|
}
|