diff --git a/dashboard/src/api/meetKevinStrategy.ts b/dashboard/src/api/meetKevinStrategy.ts new file mode 100644 index 0000000..043c641 --- /dev/null +++ b/dashboard/src/api/meetKevinStrategy.ts @@ -0,0 +1,60 @@ +import client from './client'; +import type { + BacktestRun, + BacktestRunDetail, + StrategyEquityCurve, + StrategyPerformance, + StrategyTicker, +} from '../types/meetKevin'; + +export async function runBacktest(params: { + holding_days?: number; + slippage_pct?: number; + dedupe_policy?: 'roll' | 'ignore'; + initial_capital?: number; +}): Promise<{ run_uuid: string; status: string }> { + const { data } = await client.post('/meet-kevin/backtest/run', params); + return data; +} + +export async function listBacktestRuns(limit = 20): Promise { + const { data } = await client.get('/meet-kevin/backtest/runs', { + params: { limit }, + }); + return data; +} + +export async function getBacktestRun(runUuid: string): Promise { + const { data } = await client.get(`/meet-kevin/backtest/runs/${runUuid}`); + return data; +} + +export async function getLatestBacktest(): Promise { + const { data } = await client.get('/meet-kevin/backtest/latest'); + return data; +} + +export async function getStrategyTickers(): Promise { + const { data } = await client.get('/meet-kevin/strategy/tickers'); + return data; +} + +export async function getStrategyEquityCurve(params: { + from?: string; + to?: string; + include_benchmark?: 'spy'; +}): Promise { + const { data } = await client.get('/meet-kevin/strategy/equity-curve', { + params, + }); + return data; +} + +export async function getStrategyPerformance(): Promise { + const { data } = await client.get('/meet-kevin/strategy/performance'); + return data; +} + +export async function closeKevinPosition(symbol: string): Promise { + await client.post(`/meet-kevin/positions/${symbol}/close`); +} diff --git a/dashboard/src/types/meetKevin.ts b/dashboard/src/types/meetKevin.ts index fd656ca..8a67325 100644 --- a/dashboard/src/types/meetKevin.ts +++ b/dashboard/src/types/meetKevin.ts @@ -112,3 +112,94 @@ export interface DashboardData { count: number; }[]; } + +// --- Strategy + backtest types (v2) --- + +export type BacktestRunStatus = 'running' | 'completed' | 'failed'; + +export interface BacktestTrade { + symbol: string; + entry_at: string; + entry_price: number; + exit_at: string | null; + exit_price: number | null; + qty: number; + pnl_usd: number | null; + pnl_pct: number | null; + holding_days_actual: number | null; +} + +export interface BacktestMetrics { + total_return_pct: number; + annualized_return_pct: number | null; + sharpe_ratio: number | null; + max_drawdown_pct: number | null; + win_rate: number | null; + trade_count: number; + alpha_vs_spy_pct: number | null; + beta_vs_spy: number | null; + winners: number | null; + losers: number | null; + best_trade_pct: number | null; + worst_trade_pct: number | null; +} + +export interface BacktestRun { + run_uuid: string; + status: BacktestRunStatus; + started_at: string; + finished_at: string | null; + trigger_source: 'manual' | 'scheduled'; + params_json: Record; + metrics_json: BacktestMetrics | null; + error_message: string | null; +} + +export interface BacktestRunDetail extends BacktestRun { + trades: BacktestTrade[]; + equity_curve_json: Array<{ timestamp: string; value: number }> | null; + benchmark_curve_json: Array<{ timestamp: string; value: number }> | null; +} + +export type BridgeStatus = + | 'emitted' + | 'skipped_non_tradable' + | 'skipped_blocklist' + | 'skipped_caps' + | 'deferred' + | 'broker_rejected' + | 'dry_run'; + +export interface StrategyTicker { + symbol: string; + latest_action: TickerAction; + latest_conviction: number; + mention_count: number; + last_mention_at: string; + bridge_status: BridgeStatus | null; + is_held: boolean; + current_price: number | null; + unrealized_pnl_pct: number | null; +} + +export interface EquityCurvePoint { + timestamp: string; + value: number; +} + +export interface StrategyEquityCurve { + strategy: EquityCurvePoint[]; + benchmark: EquityCurvePoint[] | null; +} + +export interface StrategyPerformance { + total_return_pct: number; + annualized_return_pct: number | null; + sharpe_ratio: number | null; + max_drawdown_pct: number | null; + win_rate: number | null; + trade_count: number; + alpha_vs_spy_pct: number | null; + open_positions: number; + last_backtest_at: string | null; +}