export class CacheKeyGenerator { /** * Generate cache key for market data */ static marketData(symbol: string, timeframe: string, date?: Date): string { const dateStr = date ? date.toISOString().split('T')[0] : 'latest'; return `market:${symbol.toLowerCase()}:${timeframe}:${dateStr}`; } /** * Generate cache key for technical indicators */ static indicator(symbol: string, indicator: string, period: number, dataHash: string): string { return `indicator:${symbol.toLowerCase()}:${indicator}:${period}:${dataHash}`; } /** * Generate cache key for backtest results */ static backtest(strategyName: string, params: Record): string { const paramHash = this.hashObject(params); return `backtest:${strategyName}:${paramHash}`; } /** * Generate cache key for strategy results */ static strategy(strategyName: string, symbol: string, timeframe: string): string { return `strategy:${strategyName}:${symbol.toLowerCase()}:${timeframe}`; } /** * Generate cache key for user sessions */ static userSession(userId: string): string { return `session:${userId}`; } /** * Generate cache key for portfolio data */ static portfolio(userId: string, portfolioId: string): string { return `portfolio:${userId}:${portfolioId}`; } /** * Generate cache key for real-time prices */ static realtimePrice(symbol: string): string { return `price:realtime:${symbol.toLowerCase()}`; } /** * Generate cache key for order book data */ static orderBook(symbol: string, depth: number = 10): string { return `orderbook:${symbol.toLowerCase()}:${depth}`; } /** * Create a simple hash from object for cache keys */ private static hashObject(obj: Record): string { const str = JSON.stringify(obj, Object.keys(obj).sort()); let hash = 0; for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i); hash = (hash << 5) - hash + char; hash = hash & hash; // Convert to 32-bit integer } return Math.abs(hash).toString(36); } } /** * Simple key generator function */ export function generateKey(...parts: (string | number | boolean | undefined)[]): string { return parts .filter(part => part !== undefined) .map(part => String(part)) .join(':'); }