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 targetSameEquity: boolean; // if true, reduce profitTarget by priorProfit after withdrawal withdrawalStages: { profit: number; consistency: number; minTradingDays: number }[]; // per-stage fresh profit + consistency (empty = use base values) } 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; positionDirection: 'long' | 'short' | null; /** 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; /** Current stage = 1 + number of withdrawals (negative fund transactions). Stage 1 = fresh account. */ stage: number; /** 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; /** Actual profit target to hit — max(stage profit target, consistency realTarget = maxDay/consistency). */ effectiveProfitTarget: number | null; /** Current cycle daily P&L — used for target calculations. */ dailyPnL: { date: string; pnl: number }[]; /** Full P&L history across all cycles — used for calendar and equity curve display. */ fullDailyPnL: { date: string; pnl: number }[]; /** Fund transactions (deposits/withdrawals) — used by the calendar and equity curve. */ fundTransactions: { date: string; amount: number }[]; } export interface FirmState { firm: string; connected: boolean; accounts: AccountState[]; }