| import streamlit as st |
| import logging |
| import traceback |
| from datetime import datetime, timedelta |
| import pytz |
| import random |
| from data.announcements import get_all_announcements, add_announcement, get_session_announcements, delete_announcement, format_time_ago |
| from data.db_utils import ( |
| save_analysis_result as db_save_analysis_result, |
| get_analysis_results, |
| save_favorite_stock, |
| remove_favorite_stock, |
| is_favorite_stock, |
| get_favorite_stocks, |
| save_ml_prediction, |
| get_ml_predictions, |
| update_ml_prediction_result, |
| get_ml_prediction_stats, |
| save_announcement, |
| get_announcements, |
| delete_announcement as db_delete_announcement, |
| save_user_note, |
| get_user_notes, |
| create_database, |
| save_ml_model, |
| load_ml_model, |
| get_model_update_status |
| ) |
|
|
| |
| logger = logging.getLogger(__name__) |
|
|
| |
| try: |
| create_database() |
| except Exception as e: |
| logger.error(f"Veritabanı oluşturulurken hata: {str(e)}") |
|
|
| def save_analysis_result(stock_symbol, analysis_data, analysis_type=None, price=None, indicators=None, notes=None): |
| """ |
| Belirli bir hisse senedi için yapılan analiz sonucunu depolar. |
| |
| Args: |
| stock_symbol (str): Hisse senedi sembolü |
| analysis_data (dict): Analiz sonuç verisi |
| analysis_type (str, optional): Analiz tipi, belirtilmezse veri içinden alınır |
| price (float, optional): Hisse fiyatı, belirtilmezse veri içinden alınır |
| indicators (dict, optional): Teknik göstergeler |
| notes (str, optional): Notlar |
| """ |
| try: |
| |
| now = datetime.now() |
| analysis_data["analysis_time"] = now.strftime("%d.%m.%Y %H:%M") |
| |
| |
| if 'stock_analysis_results' not in st.session_state: |
| st.session_state.stock_analysis_results = {} |
| |
| |
| st.session_state.stock_analysis_results[stock_symbol] = analysis_data |
| |
| |
| if 'analysis_history' not in st.session_state: |
| st.session_state.analysis_history = [] |
| |
| |
| if stock_symbol in st.session_state.analysis_history: |
| st.session_state.analysis_history.remove(stock_symbol) |
| |
| |
| st.session_state.analysis_history.insert(0, stock_symbol) |
| |
| |
| if len(st.session_state.analysis_history) > 20: |
| st.session_state.analysis_history = st.session_state.analysis_history[:20] |
| |
| |
| if analysis_type is None: |
| analysis_type = analysis_data.get("analysis_type", "teknik") |
| |
| if price is None: |
| |
| price = analysis_data.get("last_price", None) |
| |
| |
| if price is None: |
| price = analysis_data.get("current_price", 0) |
| |
| if indicators is None: |
| indicators = analysis_data.get("indicators", {}) |
| |
| if notes is None: |
| notes = analysis_data.get("notes", "") |
| |
| |
| db_result = db_save_analysis_result( |
| stock_symbol, |
| analysis_type, |
| price, |
| analysis_data, |
| indicators, |
| notes |
| ) |
| |
| logger.info(f"{stock_symbol} için analiz sonucu başarıyla kaydedildi") |
| return db_result |
| except Exception as e: |
| logger.error(f"Analiz sonucu kaydedilirken hata: {str(e)}") |
| logger.error(traceback.format_exc()) |
| return False |
|
|
| def get_analysis_result(stock_symbol): |
| """ |
| Belirli bir hisse senedi için kaydedilmiş analiz sonucunu getirir. |
| |
| Args: |
| stock_symbol (str): Hisse senedi sembolü |
| |
| Returns: |
| dict: Analiz sonuç verisi, yoksa None |
| """ |
| try: |
| |
| results = get_analysis_results(stock_symbol, limit=1) |
| if results and len(results) > 0: |
| return results[0] |
| |
| |
| if 'stock_analysis_results' not in st.session_state: |
| return None |
| |
| return st.session_state.stock_analysis_results.get(stock_symbol) |
| except Exception as e: |
| logger.error(f"Analiz sonucu alınırken hata: {str(e)}") |
| logger.error(traceback.format_exc()) |
| return None |
|
|
| def load_analysis_results(analysis_type=None): |
| """ |
| Kaydedilmiş tüm analiz sonuçlarını getirir. |
| |
| Args: |
| analysis_type (str, optional): Analiz tipi (örn: "teknik", "ml") |
| |
| Returns: |
| list: Analiz sonuçlarının listesi |
| """ |
| try: |
| |
| return get_analysis_results(analysis_type=analysis_type) |
| except Exception as e: |
| logger.error(f"Analiz sonuçları yüklenirken hata: {str(e)}") |
| logger.error(traceback.format_exc()) |
| return [] |
|
|
| def add_to_favorites(stock_symbol): |
| """ |
| Bir hisse senedini favorilere ekler. |
| |
| Args: |
| stock_symbol (str): Eklenecek hisse senedi sembolü |
| |
| Returns: |
| bool: İşlem başarılıysa True, aksi halde False |
| """ |
| try: |
| |
| stock_symbol = stock_symbol.upper().strip() |
| |
| |
| if 'favorite_stocks' not in st.session_state: |
| st.session_state.favorite_stocks = [] |
| |
| if stock_symbol not in st.session_state.favorite_stocks: |
| st.session_state.favorite_stocks.append(stock_symbol) |
| |
| |
| result = save_favorite_stock(stock_symbol) |
| |
| logger.info(f"{stock_symbol} favorilere eklendi") |
| return result |
| except Exception as e: |
| logger.error(f"Favori eklenirken hata: {str(e)}") |
| logger.error(traceback.format_exc()) |
| return False |
|
|
| def remove_from_favorites(stock_symbol): |
| """ |
| Bir hisseyi favorilerden çıkarır. |
| |
| Args: |
| stock_symbol (str): Çıkarılacak hisse sembolü |
| """ |
| try: |
| |
| if 'favorite_stocks' in st.session_state and stock_symbol in st.session_state.favorite_stocks: |
| st.session_state.favorite_stocks.remove(stock_symbol) |
| |
| |
| result = remove_favorite_stock(stock_symbol) |
| |
| logger.info(f"{stock_symbol} favorilerden çıkarıldı") |
| return result |
| except Exception as e: |
| logger.error(f"Favori çıkarılırken hata: {str(e)}") |
| return False |
|
|
| def is_favorite(stock_symbol): |
| """ |
| Bir hisse senedinin favorilerde olup olmadığını kontrol eder. |
| |
| Args: |
| stock_symbol (str): Hisse senedi sembolü |
| |
| Returns: |
| bool: Favorilerde ise True, değilse False |
| """ |
| return is_favorite_stock(stock_symbol.upper().strip()) |
|
|
| def get_favorites(): |
| """ |
| Tüm favori hisse senetlerini getirir. |
| |
| Returns: |
| list: Favori hisse senetlerinin listesi |
| """ |
| try: |
| |
| favorites = get_favorite_stocks() |
| |
| |
| if 'favorite_stocks' not in st.session_state: |
| st.session_state.favorite_stocks = [] |
| |
| |
| for favorite in favorites: |
| if favorite not in st.session_state.favorite_stocks: |
| st.session_state.favorite_stocks.append(favorite) |
| |
| return favorites |
| except Exception as e: |
| logger.error(f"Favoriler getirilirken hata: {str(e)}") |
| logger.error(traceback.format_exc()) |
| |
| return st.session_state.get('favorite_stocks', []) |