initializeDatabase(); } private function initializeDatabase() { try { $this->db = new PDO('sqlite:stocks.db'); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Criar tabelas se não existirem $this->db->exec(" CREATE TABLE IF NOT EXISTS stocks ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL, name TEXT NOT NULL, price REAL NOT NULL, change REAL NOT NULL, volume INTEGER NOT NULL, sector TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) "); $this->db->exec(" CREATE TABLE IF NOT EXISTS stock_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, stock_id INTEGER, price REAL NOT NULL, volume INTEGER NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (stock_id) REFERENCES stocks (id) ) "); $this->db->exec(" CREATE TABLE IF NOT EXISTS predictions ( id INTEGER PRIMARY KEY AUTOINCREMENT, stock_code TEXT NOT NULL, probability REAL NOT NULL, confidence TEXT NOT NULL, recommendation TEXT NOT NULL, analysis TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) "); } catch(PDOException $e) { die("Erro no banco de dados: " . $e->getMessage()); } } public function fetchRealTimeData() { // Simulação de dados - em produção, integrar com API real $sectors = ["Tecnologia", "Financeiro", "Energia", "Varejo", "Saúde", "Industrial", "Consumo", "Utilities"]; $companies = [ ["PETR4", "Petróleo Brasileiro S.A.", "Energia"], ["VALE3", "Vale S.A.", "Industrial"], ["ITUB4", "Itaú Unibanco Holding S.A.", "Financeiro"], ["BBDC4", "Banco Bradesco S.A.", "Financeiro"], ["WEGE3", "WEG S.A.", "Industrial"], ["MGLU3", "Magazine Luiza S.A.", "Varejo"], ["B3SA3", "B3 S.A. - Brasil Bolsa Balcão", "Financeiro"], ["RENT3", "Localiza Rent a Car S.A.", "Varejo"], ["BBAS3", "Banco do Brasil S.A.", "Financeiro"], ["ABEV3", "Ambev S.A.", "Consumo"], ["JBSS3", "JBS S.A.", "Consumo"], ["RADL3", "Raia Drogasil S.A.", "Saúde"], ["CSAN3", "Cosan S.A.", "Energia"], ["LREN3", "Lojas Renner S.A.", "Varejo"], ["SBSP3", "Sabesp", "Utilities"] ]; $stocks = []; foreach ($companies as $company) { $basePrice = rand(500, 10000) / 10; $change = (rand(-100, 100) / 10); $price = $basePrice * (1 + $change/100); $stocks[] = [ 'code' => $company[0], 'name' => $company[1], 'price' => round($price, 2), 'change' => $change, 'volume' => rand(100000, 5000000), 'sector' => $company[2] ]; // Salvar no banco de dados $this->saveStockData($company[0], $company[1], $price, $change, rand(100000, 5000000), $company[2]); } return $stocks; } private function saveStockData($code, $name, $price, $change, $volume, $sector) { try { // Verificar se a ação já existe $stmt = $this->db->prepare("SELECT id FROM stocks WHERE code = ?"); $stmt->execute([$code]); $stock = $stmt->fetch(PDO::FETCH_ASSOC); if ($stock) { // Atualizar dados existentes $stmt = $this->db->prepare(" UPDATE stocks SET price = ?, change = ?, volume = ?, timestamp = CURRENT_TIMESTAMP WHERE code = ? "); $stmt->execute([$price, $change, $volume, $code]); // Registrar no histórico $stmt = $this->db->prepare(" INSERT INTO stock_history (stock_id, price, volume) VALUES (?, ?, ?) "); $stmt->execute([$stock['id'], $price, $volume]); } else { // Inserir nova ação $stmt = $this->db->prepare(" INSERT INTO stocks (code, name, price, change, volume, sector) VALUES (?, ?, ?, ?, ?, ?) "); $stmt->execute([$code, $name, $price, $change, $volume, $sector]); $stockId = $this->db->lastInsertId(); // Registrar no histórico $stmt = $this->db->prepare(" INSERT INTO stock_history (stock_id, price, volume) VALUES (?, ?, ?) "); $stmt->execute([$stockId, $price, $volume]); } return true; } catch(PDOException $e) { error_log("Erro ao salvar dados: " . $e->getMessage()); return false; } } public function getStockPrediction($code) { // Simulação de análise preditiva - em produção, usar modelos reais de ML $probabilities = [ "PETR4" => 0.75, "VALE3" => 0.82, "ITUB4" => 0.68, "BBDC4" => 0.63, "WEGE3" => 0.89, "MGLU3" => 0.42, "B3SA3" => 0.71, "RENT3" => 0.78, "BBAS3" => 0.65, "ABEV3" => 0.59, "JBSS3" => 0.53, "RADL3" => 0.81, "CSAN3" => 0.67, "LREN3" => 0.74, "SBSP3" => 0.86 ]; $confidenceLevels = ["Baixa", "Média", "Alta"]; $recommendations = [ "Compra Forte", "Compra", "Compra Moderada", "Neutra", "Venda Moderada", "Venda", "Venda Forte" ]; $analyses = [ "A empresa demonstra crescimento consistente e fundamentos sólidos.", "Setor em expansão com potencial de valorização no médio prazo.", "Resultados trimestrais acima das expectativas do mercado.", "Risco moderado com potencial de retorno interessante.", "Fundamentos fracos e perspectivas de mercado desfavoráveis.", "Setor em retração com perspectivas negativas para os próximos trimestres.", "Volatilidade alta com oportunidades de ganho no curto prazo." ]; $probability = $probabilities[$code] ?? rand(40, 90) / 100; $confidence = $confidenceLevels[rand(0, 2)]; $recommendation = $recommendations[rand(0, 6)]; $analysis = $analyses[rand(0, 6)]; // Buscar nome da empresa $stmt = $this->db->prepare("SELECT name FROM stocks WHERE code = ?"); $stmt->execute([$code]); $stock = $stmt->fetch(PDO::FETCH_ASSOC); $name = $stock ? $stock['name'] : "Empresa não encontrada"; // Salvar previsão no banco $stmt = $this->db->prepare(" INSERT INTO predictions (stock_code, probability, confidence, recommendation, analysis) VALUES (?, ?, ?, ?, ?) "); $stmt->execute([$code, $probability, $confidence, $recommendation, $analysis]); return [ 'code' => $code, 'name' => $name, 'probability' => $probability, 'confidence' => $confidence, 'recommendation' => $recommendation, 'analysis' => $analysis ]; } public function searchStocks($query) { try { $stmt = $this->db->prepare(" SELECT * FROM stocks WHERE code LIKE ? OR name LIKE ? OR sector LIKE ? ORDER BY volume DESC "); $searchTerm = "%$query%"; $stmt->execute([$searchTerm, $searchTerm, $searchTerm]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } catch(PDOException $e) { error_log("Erro na busca: " . $e->getMessage()); return []; } } public function generateHTML() { // Processar ações $action = $_GET['action'] ?? ''; if ($action === 'get_stocks') { header('Content-Type: application/json'); echo json_encode($this->fetchRealTimeData()); exit; } elseif ($action === 'get_prediction') { header('Content-Type: application/json'); $code = $_GET['code'] ?? ''; echo json_encode($this->getStockPrediction($code)); exit; } elseif ($action === 'search') { header('Content-Type: application/json'); $query = $_GET['query'] ?? ''; echo json_encode($this->searchStocks($query)); exit; } elseif ($action === 'init_db') { echo "Banco de dados inicializado"; exit; } // Retornar o HTML completo return $this->getPageHTML(); } private function getPageHTML() { ob_start(); ?>