/** * Setup Personal Configuration Script * Initializes the trading platform with personal configuration from config.yaml * * Usage: npx ts-node scripts/setup-personal.ts */ import * as fs from 'fs'; import * as path from 'path'; import * as yaml from 'js-yaml'; interface AdminConfig { email: string; first_name: string; last_name: string; display_name: string; role: string; status: string; profile: { timezone: string; language: string; preferred_currency: string; }; settings: { theme: string; email_notifications: boolean; signal_alerts: boolean; portfolio_alerts: boolean; }; } interface RiskProfile { profile: string; max_risk_percent: number; max_positions: number; max_daily_trades: number; max_drawdown_tolerance: number; experience_level: number; } interface PriorityAsset { symbol: string; name: string; asset_class: string; base_currency: string; quote_currency: string; pip_value: number; lot_size: number; min_lot: number; max_lot: number; is_active: boolean; data_provider: string; priority: number; } interface TradingAgent { name: string; slug: string; description: string; risk_profile: string; target_monthly_return: number; max_drawdown: number; max_position_size: number; supported_symbols: string[]; default_timeframe: string; min_confidence: number; strategy_type: string; risk_reward_ratio: number; uses_amd: boolean; favorable_phases: string[]; status: string; is_public: boolean; } interface PaperTrading { enabled: boolean; initial_balance: number; currency: string; name: string; } interface PersonalConfig { admin: AdminConfig; risk_profile: RiskProfile; priority_assets: PriorityAsset[]; trading_agents: TradingAgent[]; default_watchlist: { name: string; is_default: boolean; symbols: { symbol: string; notes: string }[]; }; paper_trading: PaperTrading; ml_models: { auto_retrain: boolean; retrain_interval_days: number; preferred_models: Record; thresholds: { min_confidence: number; min_tp_probability: number; }; }; system: { auto_trade_enabled: boolean; auto_trade_require_confirmation: boolean; max_concurrent_analysis: number; log_level: string; cache_predictions: boolean; cache_ttl_minutes: number; }; } const CONFIG_PATH = path.join(__dirname, '..', 'config.yaml'); const API_URL = process.env.API_URL || 'http://localhost:3081'; async function loadConfig(): Promise { const configFile = fs.readFileSync(CONFIG_PATH, 'utf8'); return yaml.load(configFile) as PersonalConfig; } async function apiCall(endpoint: string, method: string = 'GET', body?: unknown): Promise { const response = await fetch(`${API_URL}${endpoint}`, { method, headers: { 'Content-Type': 'application/json', }, body: body ? JSON.stringify(body) : undefined, }); if (!response.ok) { const error = await response.text(); throw new Error(`API Error ${response.status}: ${error}`); } return response.json(); } async function setupAdmin(config: AdminConfig): Promise { console.log('Setting up admin account...'); try { await apiCall('/api/v1/admin/setup', 'POST', { email: config.email, first_name: config.first_name, last_name: config.last_name, display_name: config.display_name, role: config.role, profile: config.profile, settings: config.settings, }); console.log(` Admin account created: ${config.email}`); } catch (error) { console.log(` Admin setup skipped (may already exist): ${(error as Error).message}`); } } async function setupAssets(assets: PriorityAsset[]): Promise { console.log('\nSetting up priority assets...'); for (const asset of assets) { try { await apiCall('/api/v1/trading/symbols', 'POST', asset); console.log(` Added: ${asset.symbol} (${asset.name})`); } catch (error) { console.log(` Skipped ${asset.symbol}: ${(error as Error).message}`); } } } async function setupAgents(agents: TradingAgent[]): Promise { console.log('\nSetting up trading agents...'); for (const agent of agents) { try { await apiCall('/api/v1/agents', 'POST', { name: agent.name, slug: agent.slug, description: agent.description, risk_profile: agent.risk_profile, config: { target_monthly_return: agent.target_monthly_return, max_drawdown: agent.max_drawdown, max_position_size: agent.max_position_size, supported_symbols: agent.supported_symbols, default_timeframe: agent.default_timeframe, min_confidence: agent.min_confidence, strategy_type: agent.strategy_type, risk_reward_ratio: agent.risk_reward_ratio, uses_amd: agent.uses_amd, favorable_phases: agent.favorable_phases, }, status: agent.status, is_public: agent.is_public, }); console.log(` Created agent: ${agent.name} (${agent.risk_profile})`); } catch (error) { console.log(` Skipped ${agent.name}: ${(error as Error).message}`); } } } async function setupPaperTrading(config: PaperTrading): Promise { console.log('\nSetting up paper trading account...'); if (!config.enabled) { console.log(' Paper trading disabled in config'); return; } try { await apiCall('/api/v1/investment/accounts', 'POST', { name: config.name, type: 'paper', initial_balance: config.initial_balance, currency: config.currency, }); console.log(` Paper account created: ${config.name} (${config.currency} ${config.initial_balance})`); } catch (error) { console.log(` Skipped paper account: ${(error as Error).message}`); } } async function setupWatchlist(config: PersonalConfig['default_watchlist']): Promise { console.log('\nSetting up default watchlist...'); try { await apiCall('/api/v1/trading/watchlists', 'POST', { name: config.name, is_default: config.is_default, symbols: config.symbols.map(s => s.symbol), }); console.log(` Watchlist created: ${config.name}`); } catch (error) { console.log(` Skipped watchlist: ${(error as Error).message}`); } } async function printSummary(config: PersonalConfig): Promise { console.log('\n' + '='.repeat(60)); console.log('SETUP SUMMARY'); console.log('='.repeat(60)); console.log(`\nAdmin Account: ${config.admin.email}`); console.log(`Role: ${config.admin.role}`); console.log(`\nPriority Assets (${config.priority_assets.length}):`); config.priority_assets.forEach(a => { console.log(` ${a.priority}. ${a.symbol} - ${a.name} (${a.data_provider})`); }); console.log(`\nTrading Agents (${config.trading_agents.length}):`); config.trading_agents.forEach(a => { console.log(` - ${a.name} [${a.status}] - ${a.risk_profile} (${a.strategy_type})`); }); console.log(`\nPaper Trading: ${config.paper_trading.enabled ? 'Enabled' : 'Disabled'}`); if (config.paper_trading.enabled) { console.log(` Balance: ${config.paper_trading.currency} ${config.paper_trading.initial_balance}`); } console.log(`\nSystem Settings:`); console.log(` Auto Trade: ${config.system.auto_trade_enabled ? 'Enabled' : 'Disabled'}`); console.log(` Require Confirmation: ${config.system.auto_trade_require_confirmation}`); console.log(` Cache Predictions: ${config.system.cache_predictions}`); console.log('\n' + '='.repeat(60)); } async function main(): Promise { console.log('='.repeat(60)); console.log('OrbiQuant IA - Personal Setup'); console.log('='.repeat(60)); console.log(`\nLoading config from: ${CONFIG_PATH}`); try { const config = await loadConfig(); console.log('Config loaded successfully!\n'); // Check API availability try { await apiCall('/health'); console.log('API is available.\n'); } catch { console.log('\nWARNING: API is not available. Running in dry-run mode.'); console.log('Start the backend server to apply configuration.\n'); await printSummary(config); return; } // Run setup steps await setupAdmin(config.admin); await setupAssets(config.priority_assets); await setupAgents(config.trading_agents); await setupPaperTrading(config.paper_trading); await setupWatchlist(config.default_watchlist); await printSummary(config); console.log('\nSetup completed successfully!'); console.log('\nNext steps:'); console.log(' 1. Start the frontend: cd ../frontend && npm run dev'); console.log(' 2. Access admin dashboard: http://localhost:3080/admin'); console.log(' 3. Login with: ' + config.admin.email); } catch (error) { console.error('\nSetup failed:', (error as Error).message); process.exit(1); } } main();