Merhaba,
Python kaynak kodu olarak ücretsiz paylaşıyorum. İsteyen exe derleyebilir. Nasıl kullanırım diye PM atanlara cevap verilmeyecektir.
Sıradaki ücretsiz yazılım için takipte kalın

Python kaynak kodu olarak ücretsiz paylaşıyorum. İsteyen exe derleyebilir. Nasıl kullanırım diye PM atanlara cevap verilmeyecektir.
Sıradaki ücretsiz yazılım için takipte kalın

import customtkinter as ctk
import tkinter as tk
from yahooquery import Ticker
import pandas as pd
from ta.trend import EMAIndicator, ADXIndicator
from ta.momentum import RSIIndicator, ROCIndicator
from ta.volatility import AverageTrueRange
ctk.set_appearance_mode("dark")
ctk.set_default_color_theme("blue")
class GelişmişAnalizBotu:
def __init__(self, root):
self.root = root
self.root.title("BIST Analiz Botu")
self.root.geometry("800x800")
self.root.resizable(False, False)
self.font_emoji = ("Segoe UI Emoji", 13)
self.frame = ctk.CTkFrame(master=root)
self.frame.pack(padx=20, pady=20, fill="both", expand=True)
self.label = ctk.CTkLabel(master=self.frame, text="Hisse Kodu Giriniz:", font=self.font_emoji)
self.label.pack(pady=10)
self.input_hisse = ctk.CTkEntry(master=self.frame, placeholder_text="Örnek: AKBNK veya AKBNK.IS", font=self.font_emoji)
self.input_hisse.pack(pady=10)
self.analyze_btn = ctk.CTkButton(master=self.frame, text="Analiz Et", command=self.analyze_stock, font=self.font_emoji)
self.analyze_btn.pack(pady=10)
self.result_box = ctk.CTkTextbox(master=self.frame, height=280, font=self.font_emoji)
self.result_box.pack(pady=10, fill="both", expand=True)
def analyze_stock(self):
symbol = self.input_hisse.get().strip().upper()
if not symbol.endswith(".IS"):
symbol += ".IS"
self.result_box.delete("1.0", tk.END)
self.result_box.insert(tk.END, f"{symbol} verileri çekiliyor...n")
try:
tkdata = Ticker(symbol)
df = tkdata.history(period='6mo', interval='1d')
if df.empty:
self.result_box.insert(tk.END, "Veri alınamadı veya hisse kodu hatalı.n")
return
if isinstance(df.index, pd.MultiIndex):
df = df.reset_index(level=0, drop=True)
close = df['close']
high = df['high']
low = df['low']
ema9 = EMAIndicator(close=close, window=9).ema_indicator()
ema21 = EMAIndicator(close=close, window=21).ema_indicator()
rsi = RSIIndicator(close=close, window=14).rsi()
roc = ROCIndicator(close=close, window=12).roc()
adx = ADXIndicator(high=high, low=low, close=close, window=14).adx()
atr = AverageTrueRange(high=high, low=low, close=close, window=14).average_true_range()
last = df.iloc[-1]
last_close = float(last['close'])
ema9_val = float(ema9.iat[-1])
ema21_val = float(ema21.iat[-1])
rsi_val = float(rsi.iat[-1])
roc_val = float(roc.iat[-1])
adx_val = float(adx.iat[-1])
atr_val = float(atr.iat[-1])
mesaj = (f"📊 {symbol} 6 Aylık Günlük Veriler Analizinn"
f"Son Kapanış: {last_close:.2f} TRYn"
f"EMA9: {ema9_val:.2f} | EMA21: {ema21_val:.2f}n"
f"RSI(14): {rsi_val:.2f}n"
f"ROC(12): {roc_val:.2f}% (Momentum)n"
f"ADX(14): {adx_val:.2f} (Trend Gücü)n"
f"ATR(14): {atr_val:.2f} (Volatilite)nn")
if ema9_val > ema21_val and rsi_val > 50:
mesaj += "🔔 Temel Sinyal: 📈 ALn"
elif ema9_val < ema21_val and rsi_val < 50:
mesaj += "🔔 Temel Sinyal: 📉 SATn"
else:
mesaj += "🔔 Temel Sinyal: ⚠️ BEKLEn"
if roc_val > 0:
mesaj += "🚀 Momentum: Pozitifn"
else:
mesaj += "🐢 Momentum: Negatif veya Düşüşten"
if adx_val >= 25:
mesaj += "💪 Trend Gücü: Güçlün"
else:
mesaj += "⚠️ Trend Gücü: Zayıf veya Yan Dalgan"
stop_loss = last_close - (atr_val * 1.5)
take_profit = last_close + (atr_val * 2)
mesaj += (f"n🛑 Önerilen Stop Loss: {stop_loss:.2f} TRYn"
f"🎯 Önerilen Take Profit: {take_profit:.2f} TRYn")
self.result_box.insert(tk.END, mesaj)
except Exception as e:
self.result_box.insert(tk.END, f"Hata: {str(e)}n")
if __name__ == "__main__":
root = ctk.CTk()
app = GelişmişAnalizBotu(root)
root.mainloop()