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 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 { const { data } = await apiClient.get<{ accounts: LiveAccount[] }>('/live') return data.accounts } export async function getLive(aid: number): Promise { const { data } = await apiClient.get(`/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 { const { data } = await apiClient.get(`/live/${aid}/positions`) return data } export async function getLiveTrades(aid: number): Promise { const { data } = await apiClient.get(`/live/${aid}/trades`) return data } export async function getLiveAccountBalance(aid: number): Promise { const { data } = await apiClient.get(`/live/${aid}/account`) return data ?? {} } export async function getLiveStatus(aid: number): Promise { const { data } = await apiClient.get(`/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 { const { data } = await apiClient.get('/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 { const { data } = await apiClient.get('/live/account-snapshot', { params: { account }, }) return data }