| | 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', []) |