/** * Type definitions for the scheduler module. * @module openfinclaw/scheduler/types */ import type { MarketType } from "../types.js"; // ── News ────────────────────────────────────────────────────────────────── /** Single news item from any provider. */ export interface NewsItem { /** Unique identifier for deduplication. */ id: string; title: string; summary: string; source: string; url: string; /** ISO 8601 publish time. */ publishedAt: string; /** Symbols related to this news. */ symbols: string[]; sentiment?: "positive" | "negative" | "neutral"; /** 0-1 relevance score (provider-specific). */ relevanceScore?: number; } /** News result grouped by symbol. */ export interface SymbolNewsResult { symbol: string; market: MarketType; news: NewsItem[]; /** 24h price change percentage. */ priceChange24h?: number; currentPrice?: number; } /** Interface that all news providers must implement. */ export interface NewsProvider { readonly name: string; fetchNews(symbols: string[], market: MarketType): Promise; } // ── Scan Report ─────────────────────────────────────────────────────────── /** Per-strategy section in the scan report. */ export interface StrategyScanEntry { strategyId: string; strategyName: string; level: string; symbols: string[]; /** Latest backtest metrics (if available). */ lastBacktest?: { totalReturn?: number; sharpe?: number; maxDrawdown?: number; }; /** Per-symbol news and price data. */ symbolData: SymbolNewsResult[]; /** Number of significant news items. */ significantNewsCount: number; } /** Full scan report returned by strategy_daily_scan. */ export interface ScanReport { scanId: string; scannedAt: string; strategiesScanned: number; totalNewsFound: number; entries: StrategyScanEntry[]; } // ── Periodic Report ─────────────────────────────────────────────────────── /** Periodic (weekly/monthly) performance report. */ export interface PeriodicReport { period: "weekly" | "monthly"; startDate: string; endDate: string; strategySummaries: Array<{ id: string; name: string; level: string; backtestCount: number; bestReturn?: number; latestReturn?: number; latestSharpe?: number; }>; alertCount: number; scanCount: number; }