File size: 8,286 Bytes
32f16c2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | 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
)
# Loglama yapılandırması
logger = logging.getLogger(__name__)
# Veritabanını başlangıçta oluştur
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:
# Tarihi ekle
now = datetime.now()
analysis_data["analysis_time"] = now.strftime("%d.%m.%Y %H:%M")
# Backward compatibility - session state'e de kaydet
if 'stock_analysis_results' not in st.session_state:
st.session_state.stock_analysis_results = {}
# Session state'e kaydet
st.session_state.stock_analysis_results[stock_symbol] = analysis_data
# Analiz geçmişine ekle (eğer yoksa)
if 'analysis_history' not in st.session_state:
st.session_state.analysis_history = []
# Zaten varsa önce kaldır (hisse senedi sembolü aynı olduğunda)
if stock_symbol in st.session_state.analysis_history:
st.session_state.analysis_history.remove(stock_symbol)
# Listeye en başa ekle
st.session_state.analysis_history.insert(0, stock_symbol)
# Maksimum 20 kayıt tut
if len(st.session_state.analysis_history) > 20:
st.session_state.analysis_history = st.session_state.analysis_history[:20]
# Veritabanına kaydet - parametreleri kontrol et
if analysis_type is None:
analysis_type = analysis_data.get("analysis_type", "teknik")
if price is None:
# Önce last_price'ı kontrol et (ML için)
price = analysis_data.get("last_price", None)
# Eğer yoksa current_price'ı dene
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", "")
# Veritabanına kaydet (kalıcı depolama)
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:
# Önce veritabanından getir
results = get_analysis_results(stock_symbol, limit=1)
if results and len(results) > 0:
return results[0]
# Eğer veritabanında yoksa session state'ten kontrol et (eski veriler için)
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:
# Doğrudan veritabanından getir
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:
# Sembolü düzenle
stock_symbol = stock_symbol.upper().strip()
# Backward compatibility - session state'e de kaydet
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)
# Veritabanına kaydet
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:
# Backward compatibility - session state'ten de çıkar
if 'favorite_stocks' in st.session_state and stock_symbol in st.session_state.favorite_stocks:
st.session_state.favorite_stocks.remove(stock_symbol)
# Veritabanından çıkar
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:
# Önce veritabanından getir
favorites = get_favorite_stocks()
# Backward compatibility - session state'i de güncelle
if 'favorite_stocks' not in st.session_state:
st.session_state.favorite_stocks = []
# Session state'teki favorilerle senkronize et
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())
# Hata durumunda session state'ten döndür
return st.session_state.get('favorite_stocks', []) |