export interface AccountConfig { prefix: string; profitTarget: number; consistency: number; minDayPnL: number; minTradingDays: number; accountSize: number; maxLoss: number; // 0 = no limit; positive = account is "Dead" when loss exceeds this maxPositionSize: number; // 0 = no limit; positive = max contracts per trade } export interface FirmConfig { id: number; firm: string; username: string; password: string; bannedSymbols: string[]; accounts: AccountConfig[]; } export interface AccountState { id: number; name: string; active: boolean; amount: number; realizedPnL: number; daysTraded: number; hasPosition: boolean; /** Balance floor from Tradovate's auto-liquidation profile (0 = not set) */ autoLiqThreshold: number; /** Sum of all historical daily P&L entries */ totalProfit: number; /** True when today's realizedPnL has met or exceeded the computed daily target */ targetHit: boolean; /** Next trading day's target, computed server-side. null when account is dead or config is missing. */ dailyTarget: { amount: number; path: 'first_day' | 'normal_day' | 'reduced_day' } | null; /** FIFO daily P&L history — used by the equity curve and calendar. */ dailyPnL: { date: string; pnl: number }[]; } export interface FirmState { firm: string; connected: boolean; accounts: AccountState[]; }