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

227 lines
5.9 KiB
TypeScript

import { apiClient } from './client'
/** 实盘模拟账户(API 返回行) */
export interface LiveAccount {
id: number
name: string
account: string
vt_symbol: string
strategy_class: string
strategy_name: string
/** JSON 字符串,前端 JSON.parse 得到策略参数 */
setting: string
status: string
interval: string
initial_capital: number
connect_wait_sec?: number
init_wait_sec?: number
mini_path?: string
error_msg?: string | null
created_at?: string
updated_at?: string
/** 列表端点附带(单账户 GET 不含) */
latest_equity?: number | null
latest_date?: string | null
total_return?: number | null
position_count?: number
instance?: string
/** 'cta' 个股 / 'portfolio' 组合 */
strategy_type?: string
pool?: string | null
max_pool?: number | null
benchmark?: string | null
}
export interface LiveCreateRequest {
name: string
account: string
vt_symbol: string
strategy_class: string
strategy_name: string
setting: Record<string, unknown>
interval: string
initial_capital: number
connect_wait_sec?: number
init_wait_sec?: number
mini_path?: string
strategy_type?: string
pool?: string
max_pool?: number
benchmark?: string
// §12.6 实例做实:绑档案发起(空=发起即建档)
instance_id?: number | null
}
export interface LiveStatus {
account_id: number
status: string
name: string
account: string
vt_symbol: string
strategy_name: string
updated_at?: string
error_msg?: string
}
export interface LivePosition {
symbol: string
volume: number
frozen: number
avg_price: number
updated_at?: string
}
export interface LiveTrade {
account_id: number
strategy_name: string
symbol: string
direction: string
offset: string
price: number
volume: number
traded_at: string
vt_tradeid?: string
}
export interface LiveBalance {
account_id?: number
date?: string
cash?: number
market_value?: number
total?: number
}
export async function createLive(req: LiveCreateRequest): Promise<{ accountId: number; status: string }> {
const { data } = await apiClient.post<{ account_id: number; status: string }>('/live/create', req)
return { accountId: data.account_id, status: data.status }
}
export async function listLives(): Promise<LiveAccount[]> {
const { data } = await apiClient.get<{ accounts: LiveAccount[] }>('/live')
return data.accounts
}
export async function getLive(aid: number): Promise<LiveAccount> {
const { data } = await apiClient.get<LiveAccount>(`/live/${aid}`)
return data
}
export async function startLive(aid: number): Promise<{ accountId: number; status: string }> {
const { data } = await apiClient.post<{ account_id: number; status: string }>(`/live/${aid}/start`)
return { accountId: data.account_id, status: data.status }
}
export async function stopLive(aid: number): Promise<{ accountId: number; status: string }> {
const { data } = await apiClient.post<{ account_id: number; status: string }>(`/live/${aid}/stop`)
return { accountId: data.account_id, status: data.status }
}
export async function getLivePositions(aid: number): Promise<LivePosition[]> {
const { data } = await apiClient.get<LivePosition[]>(`/live/${aid}/positions`)
return data
}
export async function getLiveTrades(aid: number): Promise<LiveTrade[]> {
const { data } = await apiClient.get<LiveTrade[]>(`/live/${aid}/trades`)
return data
}
export async function getLiveAccountBalance(aid: number): Promise<LiveBalance> {
const { data } = await apiClient.get<LiveBalance>(`/live/${aid}/account`)
return data ?? {}
}
export async function getLiveStatus(aid: number): Promise<LiveStatus> {
const { data } = await apiClient.get<LiveStatus>(`/live/${aid}/status`)
return data
}
export async function deleteLive(aid: number): Promise<{ account_id: number; deleted: boolean }> {
const { data } = await apiClient.delete(`/live/${aid}`)
return data
}
export interface LiveUpdateReq {
name?: string
account?: string
vt_symbol?: string
strategy_name?: string
interval?: string
}
export interface LiveUpdateReq {
name?: string
account?: string
vt_symbol?: string
strategy_name?: string
interval?: string
/** B3 预算(initial_capital 含义升级为资金额度) */
initial_capital?: number
}
export async function updateLive(aid: number, req: LiveUpdateReq): Promise<{ updated: boolean }> {
const { data } = await apiClient.put(`/live/${aid}`, req)
return data
}
// ===== B3/B4 预算制 + 账户实况 =====
/** B3 预算信息(GET /live/budget-info) */
export interface BudgetInfo {
account: string
/** 快照是否新鲜(10 分钟内);false 时 remaining=null(fail-closed) */
fresh: boolean
account_cash: number | null
allocated: number
remaining: number | null
snapshot_at?: string | null
}
export async function getBudgetInfo(account: string): Promise<BudgetInfo> {
const { data } = await apiClient.get<BudgetInfo>('/live/budget-info', {
params: { account },
})
return data
}
/** B4 账户实况持仓行(qmt_account_snapshot.positions JSON) */
export interface AccountPositionRow {
symbol: string
volume: number
can_use: number
avg_price: number
mv: number
}
/** B4 账户实况实例分解行 */
export interface SnapshotInstanceRow {
id: number
name: string
status: string
initial_capital: number
cash: number | null
market_value: number | null
equity: number | null
}
/** B4 账户实况(GET /live/account-snapshot) */
export interface AccountSnapshotView {
account: string
fresh: boolean
cash: number | null
market_value: number | null
total: number | null
positions: AccountPositionRow[]
updated_at?: string | null
instances: SnapshotInstanceRow[]
instance_mv_total: number
unattributed_mv: number | null
}
export async function getAccountSnapshot(account: string): Promise<AccountSnapshotView> {
const { data } = await apiClient.get<AccountSnapshotView>('/live/account-snapshot', {
params: { account },
})
return data
}