Bu Python kodu, hisse senedi yatırımcıları için tasarlanmış, EMA (Üssel Hareketli Ortalama) tabanlı bir sinyal analiz sistemidir. Kod, her hisse için farklı vadelere özel sinyal üretir ve bu sinyallerin nasıl oluşup sonlandığını titizlikle takip eder.
Kodun kısa, orta ve uzun vadeli sinyal mantığına dair detaylar şu şekilde
Python Kodu, Daha önce oluşturduğumuz python StokData/Kapanis klasöründe bulunan hisselerin kapanış datalarını kullanır. Seans kapanışından sonra kodu çalıştırdığınızda Ema sinyallerini oluşturur, bu sinyallerin durumlarını analiz eder güncel durumu raporlar. Bu rapor, hisselerin son sinyalini, sinyalin kaç gündür aktif olduğunu ve bu süreçteki kar/zarar durumunu net bir şekilde gösterir. Bu sayede yatırımcılar, hangi hisselerin hangi trendde olduğunu kolayca anlayabilir ve buna göre pozisyonlarını yönetebilir.
Örnek Excel Çalışması
BorsaPin_EMA_Analizleri
X_06_BorsaPin_EmaSinyals.py olarak adlandırdım. Ver.1.02 Güncellndi
Kısa orta ve uzun vade de al sat bekle gibi sinyalleri Excel'e dökümünü yapacaktır.
Python Betiğimize ait kod
import pandas as pd import os import warnings from datetime import datetime from colorama import Fore, init import glob from typing import List, Dict, Any, Optional from openpyxl import load_workbook from openpyxl.utils.dataframe import dataframe_to_rows from openpyxl.styles import PatternFill, Font, Alignment, Border, Side from openpyxl.formatting.rule import ColorScaleRule """ Borsapin StokData/Kapanis klasöründeki hisse datalarından Kısa, orta,uzun vade al sat tut gibi sinyalleri excele aktarır. Pine Script™'e EMA Sinyal Tablosu indikatörümüze göre güncellenmiş kurallar ile Sinyal bozulma uyarıları eklendi Ver 1.02 www.kursatsenturk.com """ # Uyarıları kapat warnings.filterwarnings('ignore') init(autoreset=True) class BorsaPinEMAAnalyzer: def __init__(self): self.ema_periods = { 'kisa_vade': [5, 8, 13, 21], 'orta_vade': [34, 55], 'uzun_vade': [89, 144] } self.successful_files: List[str] = [] self.failed_files: List[str] = [] @staticmethod def calculate_ema(data: pd.Series, period: int) -> pd.Series: """EMA hesaplama fonksiyonu""" return data.ewm(span=period, adjust=False).mean() @staticmethod def load_stock_data(file_path: str) -> pd.DataFrame: """Hisse verilerini Excel dosyasından yükleme""" try: df = pd.read_excel(file_path) required_columns = ['Tarih', 'Kapanış'] missing_columns = [col for col in required_columns if col not in df.columns] if missing_columns: raise ValueError(f"Excel dosyasında eksik sütunlar: {missing_columns}") df['Tarih'] = pd.to_datetime(df['Tarih']) df = df.sort_values('Tarih').reset_index(drop=True) return df except (FileNotFoundError, ValueError, pd.errors.ParserError) as e: print(f"{Fore.RED}❌ Veri yükleme hatası: {e}") return pd.DataFrame() def calculate_all_emas(self, df: pd.DataFrame) -> pd.DataFrame: """Tüm EMA'ları hesapla""" close_prices = df['Kapanış'] all_periods = self.ema_periods['kisa_vade'] + self.ema_periods['orta_vade'] + self.ema_periods['uzun_vade'] for period in all_periods: if len(df) >= period: df[f'EMA{period}'] = self.calculate_ema(close_prices, period) else: df[f'EMA{period}'] = pd.NA return df @staticmethod def check_signal_deterioration(df: pd.DataFrame, i: int) -> Dict[str, str]: """Sinyal bozulma durumlarını kontrol et""" warnings = { 'kisa_uyari': '', 'orta_uyari': '', 'uzun_uyari': '' } if i < 1: # En az 1 önceki veri gerekli return warnings kapanis = df.loc[i, 'Kapanış'] # KISA VADE UYARILARI if all(pd.notna(df.loc[i, col]) for col in ['EMA5', 'EMA8', 'EMA13', 'EMA21']) and \ all(pd.notna(df.loc[i - 1, col]) for col in ['EMA5', 'EMA8', 'EMA13', 'EMA21']): ema5, ema8, ema13, ema21 = df.loc[i, 'EMA5'], df.loc[i, 'EMA8'], df.loc[i, 'EMA13'], df.loc[i, 'EMA21'] ema5_once, ema8_once, ema13_once = df.loc[i - 1, 'EMA5'], df.loc[i - 1, 'EMA8'], df.loc[i - 1, 'EMA13'] # Önce durum kontrolü yap kisa_durum = df.loc[i, 'Kisa_Durum'] if 'Kisa_Durum' in df.columns else 'BEKLE' kisa_durum_once = df.loc[i - 1, 'Kisa_Durum'] if i > 0 and 'Kisa_Durum' in df.columns else 'BEKLE' # AL sinyali varken 21 EMA altına sarktığında if kisa_durum == 'AL' and kapanis < ema21: warnings['kisa_uyari'] = "⚠️ 21 EMA Altına Sarkma" # AL sinyali varken 5, 8, 13 EMA'da aşağı eğim başladığında (sinyal bozulmaya başladı) elif kisa_durum == 'AL' and (ema5 < ema5_once and ema8 < ema8_once and ema13 < ema13_once): warnings['kisa_uyari'] = "⚠️ EMA Eğim Bozulması" # ORTA VADE UYARILARI if all(pd.notna(df.loc[i, col]) for col in ['EMA34', 'EMA55']) and i > 0 and \ all(pd.notna(df.loc[i - 1, col]) for col in ['EMA34', 'EMA55']): ema34 = df.loc[i, 'EMA34'] ema55 = df.loc[i, 'EMA55'] ema34_once = df.loc[i - 1, 'EMA34'] ema55_once = df.loc[i - 1, 'EMA55'] orta_durum = df.loc[i, 'Orta_Durum'] if 'Orta_Durum' in df.columns else 'BEKLE' orta_durum_once = df.loc[i - 1, 'Orta_Durum'] if i > 0 and 'Orta_Durum' in df.columns else 'BEKLE' # AL sinyali varken 34 EMA altında kapatmalarda if orta_durum == 'AL' and kapanis < ema34: warnings['orta_uyari'] = "⚠️ 34 EMA Altında Kapanış" # AL sinyali varken 34 ve 55 EMA'da aşağı eğim (sinyal bozulmaya başladı) elif orta_durum == 'AL' and (ema34 < ema34_once and ema55 < ema55_once): warnings['orta_uyari'] = "⚠️ EMA Eğim Bozulması" # UZUN VADE UYARILARI if all(pd.notna(df.loc[i, col]) for col in ['EMA89', 'EMA144']) and i > 0 and \ all(pd.notna(df.loc[i - 1, col]) for col in ['EMA89', 'EMA144']): ema89 = df.loc[i, 'EMA89'] ema144 = df.loc[i, 'EMA144'] ema89_once = df.loc[i - 1, 'EMA89'] ema144_once = df.loc[i - 1, 'EMA144'] uzun_durum = df.loc[i, 'Uzun_Durum'] if 'Uzun_Durum' in df.columns else 'BEKLE' uzun_durum_once = df.loc[i - 1, 'Uzun_Durum'] if i > 0 and 'Uzun_Durum' in df.columns else 'BEKLE' # AL sinyali varken 89 EMA altına sarkmada if uzun_durum == 'AL' and kapanis < ema89: warnings['uzun_uyari'] = "⚠️ 89 EMA Altına Sarkma" # AL sinyali varken 89 ve 144 EMA'da aşağı eğim (sinyal bozulmaya başladı) elif uzun_durum == 'AL' and (ema89 < ema89_once and ema144 < ema144_once): warnings['uzun_uyari'] = "⚠️ EMA Eğim Bozulması" return warnings def determine_signal_status(self, df: pd.DataFrame) -> pd.DataFrame: """Sinyal durumlarını belirle - Pine Script™'e kurallar güncellendi 16.08.25""" df['Kisa_Durum'] = 'BEKLE' df['Orta_Durum'] = 'BEKLE' df['Uzun_Durum'] = 'BEKLE' df['Kisa_Bar_Sayaci'] = 0 df['Orta_Bar_Sayaci'] = 0 df['Uzun_Bar_Sayaci'] = 0 df['Kisa_Sinyal_Tarihi'] = pd.NaT df['Orta_Sinyal_Tarihi'] = pd.NaT df['Uzun_Sinyal_Tarihi'] = pd.NaT df['Kisa_Sinyal_Fiyati'] = pd.NA df['Orta_Sinyal_Fiyati'] = pd.NA df['Uzun_Sinyal_Fiyati'] = pd.NA # Yeni uyarı sütunları df['Kisa_Uyari'] = '' df['Orta_Uyari'] = '' df['Uzun_Uyari'] = '' if len(df) < 2: return df for i in range(1, len(df)): kisa_durum_once = df.loc[i - 1, 'Kisa_Durum'] orta_durum_once = df.loc[i - 1, 'Orta_Durum'] uzun_durum_once = df.loc[i - 1, 'Uzun_Durum'] kapanis = df.loc[i, 'Kapanış'] # KISA VADE SİNYALLERİ - Pine Script™ indikatörümüzle uyumlu if all(pd.notna(df.loc[i, col]) for col in ['EMA5', 'EMA8', 'EMA13', 'EMA21']) and \ all(pd.notna(df.loc[i - 1, col]) for col in ['EMA5', 'EMA8', 'EMA13', 'EMA21']): ema5, ema8, ema13, ema21 = df.loc[i, 'EMA5'], df.loc[i, 'EMA8'], df.loc[i, 'EMA13'], df.loc[i, 'EMA21'] kisa_al_kosulu = (kapanis > ema5 and kapanis > ema8 and kapanis > ema13 and kapanis > ema21) kisa_egim_yukari = (ema5 > df.loc[i - 1, 'EMA5'] and ema8 > df.loc[i - 1, 'EMA8'] and ema13 > df.loc[i - 1, 'EMA13'] and ema21 > df.loc[i - 1, 'EMA21']) if kisa_al_kosulu and kisa_egim_yukari: df.loc[i, 'Kisa_Durum'] = "AL" if kisa_durum_once != "AL": df.loc[i, 'Kisa_Bar_Sayaci'] = 1 df.loc[i, 'Kisa_Sinyal_Tarihi'] = df.loc[i, 'Tarih'] df.loc[i, 'Kisa_Sinyal_Fiyati'] = df.loc[i, 'Kapanış'] else: df.loc[i, 'Kisa_Bar_Sayaci'] = df.loc[i - 1, 'Kisa_Bar_Sayaci'] + 1 df.loc[i, 'Kisa_Sinyal_Tarihi'] = df.loc[i - 1, 'Kisa_Sinyal_Tarihi'] df.loc[i, 'Kisa_Sinyal_Fiyati'] = df.loc[i - 1, 'Kisa_Sinyal_Fiyati'] else: kisa_egim_asagi = (ema21 < df.loc[i - 1, 'EMA21'] and ema13 < df.loc[i - 1, 'EMA13']) if kapanis < ema21 and kisa_egim_asagi: df.loc[i, 'Kisa_Durum'] = "SAT" if kisa_durum_once != "SAT": df.loc[i, 'Kisa_Bar_Sayaci'] = 1 df.loc[i, 'Kisa_Sinyal_Tarihi'] = df.loc[i, 'Tarih'] df.loc[i, 'Kisa_Sinyal_Fiyati'] = df.loc[i, 'Kapanış'] else: df.loc[i, 'Kisa_Bar_Sayaci'] = df.loc[i - 1, 'Kisa_Bar_Sayaci'] + 1 df.loc[i, 'Kisa_Sinyal_Tarihi'] = df.loc[i - 1, 'Kisa_Sinyal_Tarihi'] df.loc[i, 'Kisa_Sinyal_Fiyati'] = df.loc[i - 1, 'Kisa_Sinyal_Fiyati'] else: # AL sinyalini koruma mantığı if kisa_durum_once == 'AL' and df.loc[i, 'Kisa_Durum'] == 'BEKLE': df.loc[i, 'Kisa_Durum'] = "AL" df.loc[i, 'Kisa_Bar_Sayaci'] = df.loc[i - 1, 'Kisa_Bar_Sayaci'] + 1 df.loc[i, 'Kisa_Sinyal_Tarihi'] = df.loc[i - 1, 'Kisa_Sinyal_Tarihi'] df.loc[i, 'Kisa_Sinyal_Fiyati'] = df.loc[i - 1, 'Kisa_Sinyal_Fiyati'] else: df.loc[i, 'Kisa_Durum'] = "BEKLE" df.loc[i, 'Kisa_Bar_Sayaci'] = 0 df.loc[i, 'Kisa_Sinyal_Tarihi'] = pd.NaT df.loc[i, 'Kisa_Sinyal_Fiyati'] = pd.NA # ORTA VADE SİNYALLERİ if all(col in df.columns for col in ['EMA34', 'EMA55']) and all( pd.notna(df.loc[i, col]) for col in ['EMA34', 'EMA55']): ema34 = df.loc[i, 'EMA34'] ema55 = df.loc[i, 'EMA55'] if kapanis > ema34 and kapanis > ema55 and ema34 > ema55: df.loc[i, 'Orta_Durum'] = "AL" if orta_durum_once != "AL": df.loc[i, 'Orta_Bar_Sayaci'] = 1 df.loc[i, 'Orta_Sinyal_Tarihi'] = df.loc[i, 'Tarih'] df.loc[i, 'Orta_Sinyal_Fiyati'] = df.loc[i, 'Kapanış'] else: df.loc[i, 'Orta_Bar_Sayaci'] = df.loc[i - 1, 'Orta_Bar_Sayaci'] + 1 df.loc[i, 'Orta_Sinyal_Tarihi'] = df.loc[i - 1, 'Orta_Sinyal_Tarihi'] df.loc[i, 'Orta_Sinyal_Fiyati'] = df.loc[i - 1, 'Orta_Sinyal_Fiyati'] elif kapanis < ema55: df.loc[i, 'Orta_Durum'] = "SAT" if orta_durum_once != "SAT": df.loc[i, 'Orta_Bar_Sayaci'] = 1 df.loc[i, 'Orta_Sinyal_Tarihi'] = df.loc[i, 'Tarih'] df.loc[i, 'Orta_Sinyal_Fiyati'] = df.loc[i, 'Kapanış'] else: df.loc[i, 'Orta_Bar_Sayaci'] = df.loc[i - 1, 'Orta_Bar_Sayaci'] + 1 df.loc[i, 'Orta_Sinyal_Tarihi'] = df.loc[i - 1, 'Orta_Sinyal_Tarihi'] df.loc[i, 'Orta_Sinyal_Fiyati'] = df.loc[i - 1, 'Orta_Sinyal_Fiyati'] else: df.loc[i, 'Orta_Durum'] = "BEKLE" df.loc[i, 'Orta_Bar_Sayaci'] = 0 df.loc[i, 'Orta_Sinyal_Tarihi'] = pd.NaT df.loc[i, 'Orta_Sinyal_Fiyati'] = pd.NA # UZUN VADE SİNYALLERİ if all(col in df.columns for col in ['EMA89', 'EMA144']) and all( pd.notna(df.loc[i, col]) for col in ['EMA89', 'EMA144']): ema89 = df.loc[i, 'EMA89'] ema144 = df.loc[i, 'EMA144'] if kapanis > ema89 and kapanis > ema144: df.loc[i, 'Uzun_Durum'] = "AL" if uzun_durum_once != "AL": df.loc[i, 'Uzun_Bar_Sayaci'] = 1 df.loc[i, 'Uzun_Sinyal_Tarihi'] = df.loc[i, 'Tarih'] df.loc[i, 'Uzun_Sinyal_Fiyati'] = df.loc[i, 'Kapanış'] else: df.loc[i, 'Uzun_Bar_Sayaci'] = df.loc[i - 1, 'Uzun_Bar_Sayaci'] + 1 df.loc[i, 'Uzun_Sinyal_Tarihi'] = df.loc[i - 1, 'Uzun_Sinyal_Tarihi'] df.loc[i, 'Uzun_Sinyal_Fiyati'] = df.loc[i - 1, 'Uzun_Sinyal_Fiyati'] elif kapanis < ema144: df.loc[i, 'Uzun_Durum'] = "SAT" if uzun_durum_once != "SAT": df.loc[i, 'Uzun_Bar_Sayaci'] = 1 df.loc[i, 'Uzun_Sinyal_Tarihi'] = df.loc[i, 'Tarih'] df.loc[i, 'Uzun_Sinyal_Fiyati'] = df.loc[i, 'Kapanış'] else: df.loc[i, 'Uzun_Bar_Sayaci'] = df.loc[i - 1, 'Uzun_Bar_Sayaci'] + 1 df.loc[i, 'Uzun_Sinyal_Tarihi'] = df.loc[i - 1, 'Uzun_Sinyal_Tarihi'] df.loc[i, 'Uzun_Sinyal_Fiyati'] = df.loc[i - 1, 'Uzun_Sinyal_Fiyati'] else: df.loc[i, 'Uzun_Durum'] = "BEKLE" df.loc[i, 'Uzun_Bar_Sayaci'] = 0 df.loc[i, 'Uzun_Sinyal_Tarihi'] = pd.NaT df.loc[i, 'Uzun_Sinyal_Fiyati'] = pd.NA # SİNYAL BOZULMA UYARILARINI KONTROL ET warnings_dict = self.check_signal_deterioration(df, i) df.loc[i, 'Kisa_Uyari'] = warnings_dict['kisa_uyari'] df.loc[i, 'Orta_Uyari'] = warnings_dict['orta_uyari'] df.loc[i, 'Uzun_Uyari'] = warnings_dict['uzun_uyari'] return df @staticmethod def get_latest_signals(df: pd.DataFrame) -> Optional[Dict[str, Any]]: """En son sinyal durumlarını getir""" if len(df) == 0: return None latest = df.iloc[-1] # Sinyal gücü ataması kisa_guc = '⭐' if latest['Kisa_Durum'] != 'BEKLE' else '⏳' orta_guc = '⭐' if latest['Orta_Durum'] != 'BEKLE' else '⏳' uzun_guc = '⭐' if latest['Uzun_Durum'] != 'BEKLE' else '⏳' # Fiyat farkı hesaplamaları kisa_fark_tl = latest['Kapanış'] - latest['Kisa_Sinyal_Fiyati'] if pd.notna( latest['Kisa_Sinyal_Fiyati']) else pd.NA kisa_fark_yuzde = (kisa_fark_tl / latest['Kisa_Sinyal_Fiyati']) * 100 if pd.notna(kisa_fark_tl) else pd.NA orta_fark_tl = latest['Kapanış'] - latest['Orta_Sinyal_Fiyati'] if pd.notna( latest['Orta_Sinyal_Fiyati']) else pd.NA orta_fark_yuzde = (orta_fark_tl / latest['Orta_Sinyal_Fiyati']) * 100 if pd.notna(orta_fark_tl) else pd.NA uzun_fark_tl = latest['Kapanış'] - latest['Uzun_Sinyal_Fiyati'] if pd.notna( latest['Uzun_Sinyal_Fiyati']) else pd.NA uzun_fark_yuzde = (uzun_fark_tl / latest['Uzun_Sinyal_Fiyati']) * 100 if pd.notna(uzun_fark_tl) else pd.NA # NaN değerler yerine 'Yok' metnini kullanma def format_value(value, format_str, default='Yok'): if pd.notna(value): return format_str.format(value) return default return { 'tarih': latest['Tarih'].strftime('%Y-%m-%d'), 'kapanis': latest['Kapanış'], 'kisa': { 'durum': latest['Kisa_Durum'], 'bar_sayaci': latest['Kisa_Bar_Sayaci'], 'sinyal_tarihi': format_value(latest['Kisa_Sinyal_Tarihi'], '{:%d.%m.%Y}'), 'sinyal_fiyati': format_value(latest['Kisa_Sinyal_Fiyati'], '{:.2f}'), 'fark_tl': format_value(kisa_fark_tl, '{:.2f}'), 'fark_yuzde': format_value(kisa_fark_yuzde, '{:.2f}%'), 'guc': kisa_guc, 'uyari': latest['Kisa_Uyari'] if 'Kisa_Uyari' in df.columns else '' }, 'orta': { 'durum': latest['Orta_Durum'], 'bar_sayaci': latest['Orta_Bar_Sayaci'], 'sinyal_tarihi': format_value(latest['Orta_Sinyal_Tarihi'], '{:%d.%m.%Y}'), 'sinyal_fiyati': format_value(latest['Orta_Sinyal_Fiyati'], '{:.2f}'), 'fark_tl': format_value(orta_fark_tl, '{:.2f}'), 'fark_yuzde': format_value(orta_fark_yuzde, '{:.2f}%'), 'guc': orta_guc, 'uyari': latest['Orta_Uyari'] if 'Orta_Uyari' in df.columns else '' }, 'uzun': { 'durum': latest['Uzun_Durum'], 'bar_sayaci': latest['Uzun_Bar_Sayaci'], 'sinyal_tarihi': format_value(latest['Uzun_Sinyal_Tarihi'], '{:%d.%m.%Y}'), 'sinyal_fiyati': format_value(latest['Uzun_Sinyal_Fiyati'], '{:.2f}'), 'fark_tl': format_value(uzun_fark_tl, '{:.2f}'), 'fark_yuzde': format_value(uzun_fark_yuzde, '{:.2f}%'), 'guc': uzun_guc, 'uyari': latest['Uzun_Uyari'] if 'Uzun_Uyari' in df.columns else '' } } def process_single_stock(self, file_path: str) -> Optional[Dict[str, Any]]: """Tek bir hisse için EMA analizi yap ve sonuçları topla""" ticker_name = os.path.splitext(os.path.basename(file_path))[0] print(f"{Fore.YELLOW} EMA sinyalleri hesaplanıyor: {ticker_name}...") try: df = self.load_stock_data(file_path) # En az kısa vade EMA için yeterli veri yoksa hata ver if df.empty or len(df) < min(self.ema_periods['kisa_vade']): raise ValueError("Yeterli veri yok veya dosya geçersiz.") # Tüm EMA'ları ve sinyalleri hesapla df = self.calculate_all_emas(df) df = self.determine_signal_status(df) latest_signals = self.get_latest_signals(df) if latest_signals: self.successful_files.append(ticker_name) latest_signals['hisse'] = ticker_name print(f"{Fore.GREEN}✅ {ticker_name} için analiz başarılı.") else: self.failed_files.append(ticker_name) print(f"{Fore.RED}❌ {ticker_name} için sinyal oluşturulamadı.") return latest_signals except (ValueError, pd.errors.ParserError) as e: print(f"{Fore.RED}❌ {ticker_name} için hata: {e}") self.failed_files.append(ticker_name) return None def main(self): """Ana fonksiyon""" print(f"{Fore.CYAN} BorsaPin EMA Analiz Sistemi Başlatılıyor...") input_folder = "StokData/Kapanis/" input_files = glob.glob(os.path.join(input_folder, "*.xlsx")) if not input_files: print(f"{Fore.RED}❌ {input_folder} klasöründe Excel dosyası bulunamadı!") return all_latest_results: List[Dict[str, Any]] = [] for i, file_path in enumerate(input_files, 1): print(f"\n{Fore.MAGENTA}[{i}/{len(input_files)}] İşleniyor...") latest_signals = self.process_single_stock(file_path) if latest_signals: all_latest_results.append(latest_signals) if all_latest_results: self.save_all_signals_to_excel(all_latest_results) self.print_summary() self.save_failed_list() print(f"\n{Fore.GREEN} EMA analiz işlemi tamamlandı!") def save_all_signals_to_excel(self, results: List[Dict[str, Any]]): """Tüm sinyalleri tek bir Excel dosyasına farklı sayfalarda kaydet""" output_folder = "StokData/" os.makedirs(output_folder, exist_ok=True) filename = os.path.join(output_folder, "BorsaPin_EMA_Analizleri.xlsx") summary_df = self.create_summary_table(results) strong_signals_df = self.filter_strong_signals_df(summary_df) warning_signals_df = self.filter_warning_signals_df(summary_df) # Detaylı sinyal tabloları oluştur kisa_vade_df = self.create_detailed_signal_table(results, 'kisa') orta_vade_df = self.create_detailed_signal_table(results, 'orta') uzun_vade_df = self.create_detailed_signal_table(results, 'uzun') # İstatistik tabloları oluştur statistics_df = self.create_statistics_table(results) with pd.ExcelWriter(filename, engine='openpyxl') as writer: # Ana özet sayfası if not summary_df.empty: summary_df.to_excel(writer, sheet_name='Genel Özet', index=False) self.format_worksheet(writer.sheets['Genel Özet'], summary_df) # Güçlü sinyaller sayfası if not strong_signals_df.empty: strong_signals_df.to_excel(writer, sheet_name='Güçlü Sinyaller', index=False) self.format_worksheet(writer.sheets['Güçlü Sinyaller'], strong_signals_df) # Uyarı sinyalleri sayfası if not warning_signals_df.empty: warning_signals_df.to_excel(writer, sheet_name='Uyarı Sinyalleri', index=False) self.format_worksheet(writer.sheets['Uyarı Sinyalleri'], warning_signals_df) # Detaylı vade sayfaları if not kisa_vade_df.empty: kisa_vade_df.to_excel(writer, sheet_name='Kısa Vade Detay', index=False) self.format_worksheet(writer.sheets['Kısa Vade Detay'], kisa_vade_df) if not orta_vade_df.empty: orta_vade_df.to_excel(writer, sheet_name='Orta Vade Detay', index=False) self.format_worksheet(writer.sheets['Orta Vade Detay'], orta_vade_df) if not uzun_vade_df.empty: uzun_vade_df.to_excel(writer, sheet_name='Uzun Vade Detay', index=False) self.format_worksheet(writer.sheets['Uzun Vade Detay'], uzun_vade_df) # İstatistik sayfası if not statistics_df.empty: statistics_df.to_excel(writer, sheet_name='İstatistikler', index=False) self.format_worksheet(writer.sheets['İstatistikler'], statistics_df) print(f"{Fore.GREEN}✅ Tüm analiz sonuçları başarıyla kaydedildi: {filename}") @staticmethod def create_summary_table(results: List[Dict[str, Any]]) -> pd.DataFrame: """Özet Tablolar """ summary_data = [ { 'Hisse': res['hisse'], 'Kapanış': round(res['kapanis'], 2), 'Kısa Vade': res['kisa']['durum'], 'Kısa Uyarı': res['kisa']['uyari'], 'Sinyal Süresi': res['kisa']['bar_sayaci'], 'Kısa Vade Sinyal Tarihi': res['kisa']['sinyal_tarihi'], 'Kısa Vade Sinyal Fiyatı': res['kisa']['sinyal_fiyati'], 'Kısa Vade Kazanç TL': res['kisa']['fark_tl'], 'Kısa Vade Kazanç %': res['kisa']['fark_yuzde'], 'Orta Vade': res['orta']['durum'], 'Orta Uyarı': res['orta']['uyari'], 'Orta Sinyal Süresi': res['orta']['bar_sayaci'], 'Orta Vade Sinyal Tarihi': res['orta']['sinyal_tarihi'], 'Orta Vade Sinyal Fiyatı': res['orta']['sinyal_fiyati'], 'Orta Vade Kazanç TL': res['orta']['fark_tl'], 'Orta Vade Kazanç %': res['orta']['fark_yuzde'], 'Uzun Vade': res['uzun']['durum'], 'Uzun Uyarı': res['uzun']['uyari'], 'Uzun Sinyal Süresi': res['uzun']['bar_sayaci'], 'Uzun Vade Sinyal Tarihi': res['uzun']['sinyal_tarihi'], 'Uzun Vade Sinyal Fiyatı': res['uzun']['sinyal_fiyati'], 'Uzun Vade Kazanç TL': res['uzun']['fark_tl'], 'Uzun Vade Kazanç %': res['uzun']['fark_yuzde'] } for res in results ] return pd.DataFrame(summary_data) @staticmethod def create_detailed_signal_table(results: List[Dict[str, Any]], vade_type: str) -> pd.DataFrame: """Belirli vade için detaylı sinyal tablosu oluştur""" detailed_data = [] for res in results: vade_data = res[vade_type] if vade_data['durum'] != 'BEKLE': detailed_data.append({ 'Hisse': res['hisse'], 'Kapanış': round(res['kapanis'], 2), 'Sinyal Durumu': vade_data['durum'], 'Uyarı Durumu': vade_data['uyari'], 'Sinyal Süresi (Gün)': vade_data['bar_sayaci'], 'Sinyal Tarihi': vade_data['sinyal_tarihi'], 'Sinyal Fiyatı': vade_data['sinyal_fiyati'], 'Kazanç/Kayıp TL': vade_data['fark_tl'], 'Kazanç/Kayıp %': vade_data['fark_yuzde'] }) df = pd.DataFrame(detailed_data) if not df.empty: # Sinyal süresine göre sırala (en uzun süreli sinyaller önce) df = df.sort_values('Sinyal Süresi (Gün)', ascending=False).reset_index(drop=True) return df @staticmethod def filter_warning_signals_df(summary_df: pd.DataFrame) -> pd.DataFrame: """Uyarı sinyali olan hisseleri filtreleme""" if summary_df.empty: return pd.DataFrame() warning_signals_df = summary_df[ (summary_df['Kısa Uyarı'] != '') | (summary_df['Orta Uyarı'] != '') | (summary_df['Uzun Uyarı'] != '') ].reset_index(drop=True) return warning_signals_df @staticmethod def create_statistics_table(results: List[Dict[str, Any]]) -> pd.DataFrame: """İstatistik tablosu""" stats_data = [] # Genel istatistikler total_stocks = len(results) # Her vade için istatistikler for vade_key, vade_name in [('kisa', 'Kısa Vade'), ('orta', 'Orta Vade'), ('uzun', 'Uzun Vade')]: al_sinyali = sum(1 for res in results if res[vade_key]['durum'] == 'AL') sat_sinyali = sum(1 for res in results if res[vade_key]['durum'] == 'SAT') bekle_sinyali = sum(1 for res in results if res[vade_key]['durum'] == 'BEKLE') uyari_sinyali = sum(1 for res in results if res[vade_key]['uyari'] != '') # Ortalama sinyal süresi (sadece aktif sinyaller için) aktif_sinyaller = [res[vade_key]['bar_sayaci'] for res in results if res[vade_key]['durum'] != 'BEKLE' and res[vade_key]['bar_sayaci'] > 0] ortalama_sure = round(sum(aktif_sinyaller) / len(aktif_sinyaller), 1) if aktif_sinyaller else 0 # En uzun sinyal süresi max_sure = max(aktif_sinyaller) if aktif_sinyaller else 0 # Pozitif/negatif performans (sadece AL sinyalleri için) al_sinyalleri = [res for res in results if res[vade_key]['durum'] == 'AL'] pozitif_performans = 0 negatif_performans = 0 for res in al_sinyalleri: try: fark_str = res[vade_key]['fark_yuzde'] if fark_str != 'Yok' and '%' in fark_str: fark_value = float(fark_str.replace('%', '')) if fark_value > 0: pozitif_performans += 1 else: negatif_performans += 1 except ValueError: pass stats_data.extend([ { 'Vade Türü': vade_name, 'Metrik': 'Toplam Hisse Sayısı', 'Değer': total_stocks, 'Oran %': '100.0' }, { 'Vade Türü': vade_name, 'Metrik': 'AL Sinyali', 'Değer': al_sinyali, 'Oran %': f"{(al_sinyali / total_stocks * 100):.1f}" if total_stocks > 0 else "0.0" }, { 'Vade Türü': vade_name, 'Metrik': 'SAT Sinyali', 'Değer': sat_sinyali, 'Oran %': f"{(sat_sinyali / total_stocks * 100):.1f}" if total_stocks > 0 else "0.0" }, { 'Vade Türü': vade_name, 'Metrik': 'BEKLE Durumu', 'Değer': bekle_sinyali, 'Oran %': f"{(bekle_sinyali / total_stocks * 100):.1f}" if total_stocks > 0 else "0.0" }, { 'Vade Türü': vade_name, 'Metrik': 'Uyarı Sinyali', 'Değer': uyari_sinyali, 'Oran %': f"{(uyari_sinyali / total_stocks * 100):.1f}" if total_stocks > 0 else "0.0" }, { 'Vade Türü': vade_name, 'Metrik': 'Ortalama Sinyal Süresi (Gün)', 'Değer': ortalama_sure, 'Oran %': '-' }, { 'Vade Türü': vade_name, 'Metrik': 'En Uzun Sinyal Süresi (Gün)', 'Değer': max_sure, 'Oran %': '-' }, { 'Vade Türü': vade_name, 'Metrik': 'Pozitif Performans (AL)', 'Değer': pozitif_performans, 'Oran %': f"{(pozitif_performans / al_sinyali * 100):.1f}" if al_sinyali > 0 else "0.0" }, { 'Vade Türü': vade_name, 'Metrik': 'Negatif Performans (AL)', 'Değer': negatif_performans, 'Oran %': f"{(negatif_performans / al_sinyali * 100):.1f}" if al_sinyali > 0 else "0.0" } ]) # Güçlü sinyaller (tüm vadeler AL) guclu_sinyaller = sum(1 for res in results if res['kisa']['durum'] == 'AL' and res['orta']['durum'] == 'AL' and res['uzun']['durum'] == 'AL') # Toplam uyarı sinyalleri toplam_uyari = sum(1 for res in results if res['kisa']['uyari'] != '' or res['orta']['uyari'] != '' or res['uzun']['uyari'] != '') stats_data.extend([ { 'Vade Türü': 'Genel', 'Metrik': 'Güçlü Sinyal (Tüm Vadeler AL)', 'Değer': guclu_sinyaller, 'Oran %': f"{(guclu_sinyaller / total_stocks * 100):.1f}" if total_stocks > 0 else "0.0" }, { 'Vade Türü': 'Genel', 'Metrik': 'Toplam Uyarı Sinyali', 'Değer': toplam_uyari, 'Oran %': f"{(toplam_uyari / total_stocks * 100):.1f}" if total_stocks > 0 else "0.0" } ]) return pd.DataFrame(stats_data) @staticmethod def format_worksheet(worksheet, df): """Excel çalışma sayfası formatları """ try: # Başlık satırı formatı header_fill = PatternFill(start_color='366092', end_color='366092', fill_type='solid') header_font = Font(color='FFFFFF', bold=True) header_alignment = Alignment(horizontal='center', vertical='center') # Kenarlık stili thin_border = Border( left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin') ) # Başlık satırını formatla for col_num, column_title in enumerate(df.columns, 1): cell = worksheet.cell(row=1, column=col_num) cell.fill = header_fill cell.font = header_font cell.alignment = header_alignment cell.border = thin_border # Veri satırlarını formatla for row_num in range(2, len(df) + 2): for col_num in range(1, len(df.columns) + 1): cell = worksheet.cell(row=row_num, column=col_num) cell.border = thin_border cell.alignment = Alignment(horizontal='center', vertical='center') # Sütun genişliklerini ayarla for column in worksheet.columns: max_length = 0 column_letter = column[0].column_letter for cell in column: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except (TypeError, ValueError): pass adjusted_width = min(max_length + 2, 20) worksheet.column_dimensions[column_letter].width = adjusted_width # Freeze panes ve autofilter worksheet.freeze_panes = 'A2' worksheet.auto_filter.ref = worksheet.dimensions # Sinyal durumu sütunları için renk kodlaması for row_num in range(2, len(df) + 2): for col_num, column_name in enumerate(df.columns, 1): cell = worksheet.cell(row=row_num, column=col_num) # Ana özet sayfaları için vade sütunları if 'Vade' in column_name and column_name.endswith('Vade'): if cell.value == 'AL': cell.fill = PatternFill(start_color='90EE90', end_color='90EE90', fill_type='solid') cell.font = Font(bold=True, color='006400') elif cell.value == 'SAT': cell.fill = PatternFill(start_color='FFB6C1', end_color='FFB6C1', fill_type='solid') cell.font = Font(bold=True, color='8B0000') elif cell.value == 'BEKLE': cell.fill = PatternFill(start_color='FFFFE0', end_color='FFFFE0', fill_type='solid') cell.font = Font(bold=True, color='B8860B') # Detay sayfaları için "Sinyal Durumu" sütunu elif column_name == 'Sinyal Durumu': if cell.value == 'AL': cell.fill = PatternFill(start_color='90EE90', end_color='90EE90', fill_type='solid') cell.font = Font(bold=True, color='006400') elif cell.value == 'SAT': cell.fill = PatternFill(start_color='FFB6C1', end_color='FFB6C1', fill_type='solid') cell.font = Font(bold=True, color='8B0000') # Uyarı sütunları için renk kodlaması elif 'Uyarı' in column_name: if cell.value and cell.value != '': cell.fill = PatternFill(start_color='FFA500', end_color='FFA500', fill_type='solid') cell.font = Font(bold=True, color='FFFFFF') # Uyarı durumu sütunu için renk kodlaması elif column_name == 'Uyarı Durumu': if cell.value and cell.value != '': cell.fill = PatternFill(start_color='FFA500', end_color='FFA500', fill_type='solid') cell.font = Font(bold=True, color='FFFFFF') # Kazanç/Kayıp yüzde değerleri için renk kodlaması elif 'Kazanç' in column_name and '%' in column_name: try: if cell.value and cell.value != 'Yok' and '%' in str(cell.value): percentage_value = float(str(cell.value).replace('%', '')) if percentage_value > 0: cell.fill = PatternFill(start_color='E6FFE6', end_color='E6FFE6', fill_type='solid') cell.font = Font(color='006400', bold=True) elif percentage_value < 0: cell.fill = PatternFill(start_color='FFE6E6', end_color='FFE6E6', fill_type='solid') cell.font = Font(color='8B0000', bold=True) except (ValueError, TypeError): pass # Kazanç/Kayıp TL değerleri için renk kodlaması elif 'Kazanç' in column_name and 'TL' in column_name: try: if cell.value and cell.value != 'Yok': tl_value = float(str(cell.value)) if tl_value > 0: cell.fill = PatternFill(start_color='E6FFE6', end_color='E6FFE6', fill_type='solid') cell.font = Font(color='006400', bold=True) elif tl_value < 0: cell.fill = PatternFill(start_color='FFE6E6', end_color='FFE6E6', fill_type='solid') cell.font = Font(color='8B0000', bold=True) except (ValueError, TypeError): pass # Sinyal süresi için renk gradyanı (uzun süreli sinyaller daha koyu) elif 'Sinyal Süresi' in column_name or 'Sinyal Süresi (Gün)' in column_name: try: if cell.value and isinstance(cell.value, (int, float)) and cell.value > 0: days = int(cell.value) if days >= 30: cell.fill = PatternFill(start_color='4CAF50', end_color='4CAF50', fill_type='solid') cell.font = Font(color='FFFFFF', bold=True) elif days >= 14: cell.fill = PatternFill(start_color='8BC34A', end_color='8BC34A', fill_type='solid') cell.font = Font(color='FFFFFF', bold=True) elif days >= 7: cell.fill = PatternFill(start_color='CDDC39', end_color='CDDC39', fill_type='solid') cell.font = Font(color='333333', bold=True) elif days >= 3: cell.fill = PatternFill(start_color='FFF176', end_color='FFF176', fill_type='solid') cell.font = Font(color='333333', bold=True) except (ValueError, TypeError): pass except Exception as e: print(f"{Fore.RED}❌ Excel formatlama hatası: {e}") @staticmethod def filter_strong_signals_df(summary_df: pd.DataFrame) -> pd.DataFrame: """Tüm vadelerde 'AL' sinyali olan hisseleri filtrele""" if summary_df.empty: return pd.DataFrame() strong_signals_df = summary_df[ (summary_df['Kısa Vade'] == 'AL') & (summary_df['Orta Vade'] == 'AL') & (summary_df['Uzun Vade'] == 'AL') ].reset_index(drop=True) return strong_signals_df def print_summary(self): """İşlem özetini ekrana yazdır""" total_files = len(self.successful_files) + len(self.failed_files) print("\n" + "=" * 40) print(f"{Fore.CYAN}BorsaPin EMA Analizi Özeti") print("=" * 40) print(f"{Fore.GREEN}✅ Başarılı Analiz Edilen Hisse Sayısı: {len(self.successful_files)} / {total_files}") if self.successful_files: print(f"{Fore.GREEN} - Hisse Listesi: {', '.join(self.successful_files)}") print(f"{Fore.RED}❌ Hata Alan Hisse Sayısı: {len(self.failed_files)} / {total_files}") if self.failed_files: print(f"{Fore.RED} - Hisse Listesi: {', '.join(self.failed_files)}") print("=" * 40) def save_failed_list(self): """Hata veren hisseleri bir dosyaya kaydet""" if self.failed_files: with open("StokData/hata_veren_hisseler.txt", "w") as f: f.write("\n".join(self.failed_files)) print(f"{Fore.RED}❌ Hata veren hisse listesi 'StokData/hata_veren_hisseler.txt' dosyasına kaydedildi.") if __name__ == "__main__": analyzer = BorsaPinEMAAnalyzer() analyzer.main()
Teknik analizde hareketli ortalamalar, piyasanın genel trendini ve momentum değişimlerini anlamak için kullanılan en temel araçlardan biridir.
Borsapin EMA Sinyal Tablosu, Fibonacci sayı dizisine dayalı EMA (Üstel Hareketli Ortalama) sistemini kullanarak yatırımcılara üç farklı zaman diliminde (kısa, orta, uzun vade) sinyal üreten gelişmiş bir indikatördür.
Fibonacci EMA Serileri
Kısa Vade EMA’lar: 5, 8, 13, 21
En hızlı tepki veren ortalamalar, Günlük işlemler için ideal , Kısa vadeli trend değişimlerini yakalar
Orta Vade EMA’lar: 34, 55
Orta vadeli trendin yönünü belirler, Haftalık strateji geliştiriciler için uygun, Gürültüyü filtreler, daha güvenilir sinyaller üretir
Uzun Vade EMA’lar: 89, 144
Ana trendin yönünü gösterir, Uzun vadeli yatırım kararları için kritik, En az yanıltıcı sinyaller üretir
Kısa Vade Sinyal Sistemi Mantığı
AL Sinyali Başlangıcı: Fiyat tüm EMA’ların (5,8,13,21) üzerinde ve EMA’ların eğimi yukarı yönlü
Sinyal Devamı: EMA 21’in altına geçici sarkmalarda bile, EMA eğimi yukarı yönlü kaldığı sürece AL sinyali bozulmaz
SAT Sinyali: Fiyat EMA 21’in altında ve EMA eğimi aşağı yönlü ise
Orta ve Uzun Vade Sistemlerin Mantığı
AL Sinyali: Fiyat ilgili EMA’ların üzerinde
SAT Sinyali: Fiyat kritik EMA seviyesinin altında (55 ve 89)
Aynı anda üç farklı perspektiften piyasayı değerlendirebilirsiniz. Kısa vadeli gürültüyü uzun vadeli trendden ayırabilirsiniz. Sinyal çakışmalarında güçlü fırsatları belirleyebilirsiniz.
Bar sayacı ile sinyalin ne kadar süredir aktif olduğunu görebilir, Güç göstergesi (⭐) ile sinyalin kalitesini değerlendirme yapabilirsiniz,
Avantajları
Farklı zaman dilimlerinde çelişkili sinyallerde temkinli olmanızı sağlar. Kısa vade sinyaller ile giriş/çıkış noktalarını, Orta-uzun vade sinyalleri ile ana trend yönünün teyidi, Sinyal tarihlerini takip ederek performans analizi yapabilirsiniz. Farklı hisseler için aynı kriterlerde karşılaştırma yapabilir, ayrıca sektörel rotasyonda hangi hisselerin güçlü olduğunu belirleme şansına sahip olabilirsiniz. Varlıklara sistematik yaklaşıp, duygusal karar almanızı engeller. Size Objektif sinyal üretimlerini gösterir.
Dezavantajları ve Riskleri
EMA’lar geçmiş verilerle hesaplandığı için sinyaller gecikmeli gelir, Hızlı piyasa hareketlerinde geç kalabilir. Trend dönüş noktalarında yanıltıcı sinyaller verebilir. Yatay seyreden piyasalarda çok fazla sinyal üretebilir. Whipsaw (sahte sinyal) riski yüksek. Kısa vadede sık giriş-çıkış maliyetleri artabilir. Piyasa sadece teknik faktörlerden etkilenmez. Haberlere, makro ekonomik değişimlere tepki verebilir. Hacim, volatilite gibi faktörleri indikatör hesaplamıyor. Geçmiş verilerle mükemmel çalışan parametreler gelecekte başarısız olabilir. Mesala Fibonacci sayıları her piyasa için optimal olmayabilir. Farklı volatilite ortamlarında farklı sonuçlar verebilir
Uyarılar
Diğer teknik indikatörlerle teyit edin. Hacim analizini ihmal etmeyin, Para Giriş çıkışlarını kontrol edin, Temel analiz ile destekleyin. Yüksek Volatilite Dönemlerinde Özellikle dikkat etmeniz önerilir. Borsapin EMA Sinyal Tablosu, Fibonacci sayı dizisinin doğal uyumunu teknik analize taşıyan, çoklu zaman diliminde objektif sinyaller üreten güçlü bir araçtır. Doğru kullanıldığında yatırımcılara önemli avantajlar sağlarken, limitasyonlarının da farkında olunması gerekmektedir. En önemlisi, hiçbir teknik indikatör tek başına %100 başarılı değildir. Bu sistemi, kapsamlı bir analiz sürecinin bir parçası olarak kullanmak, risk yönetimi kurallarıyla desteklemek ve sürekli performansını takip etmek başarılı sonuçlar için kritik öneme sahiptir. Geçmiş performans gelecekteki sonuçları garanti etmez. Her yatırım kararında kendi risk toleransınızı göz önünde bulundurun ve gerektiğinde profesyonel destek alın.
Trading View Pine Script Kodu
// Bu, Pine Script™ kodu Mozilla Kamu Lisansı 2.0 (MPL-2.0) altında lisanslandı // © krstsntrk © BorsaPin codeispriority //@version=6 indicator("BorsaPin Ema Sinyal Tablosu", overlay=true) // Borsapin Ema Sinyal Tablosu // Kısa Vade Fibonacci EMA'ları (5, 8, 13, 21) ema5 = input.int(5, "EMA 5", minval=1, group="Kısa Vade") ema8 = input.int(8, "EMA 8", minval=1, group="Kısa Vade") ema13 = input.int(13, "EMA 13", minval=1, group="Kısa Vade") ema21a = input.int(21, "EMA 21", minval=1, group="Kısa Vade") // Orta Vade Fibonacci EMA'ları (34, 55) ema34 = input.int(34, "EMA 34", minval=1, group="Orta Vade") ema55a = input.int(55, "EMA 55", minval=1, group="Orta Vade") // Uzun Vade Fibonacci EMA'ları (89, 144) ema89 = input.int(89, "EMA 89", minval=1, group="Uzun Vade") ema144 = input.int(144, "EMA 144", minval=1, group="Uzun Vade") // Görsel ayarlar showTable = input.bool(true, "Tabloyu Göster") tablePos = input.string("Sağ Üst", "Tablo Konumu", options=["Sol Üst", "Sağ Üst", "Sol Alt", "Sağ Alt"]) showEMAs = input.bool(true, "EMA Çizgilerini Göster", group="Görsel") onlyDaily = input.bool(false, "Sadece Günlük Verileri Göster", group="Görsel") // Günlük Zaman Dilimi Verileri [dailyClose, dailyFib5, dailyFib8, dailyFib13, dailyFib21a, dailyFib34, dailyFib55a, dailyFib89, dailyFib144] = request.security(syminfo.tickerid, "1D", [close, ta.ema(close, ema5), ta.ema(close, ema8), ta.ema(close, ema13), ta.ema(close, ema21a), ta.ema(close, ema34), ta.ema(close, ema55a), ta.ema(close, ema89), ta.ema(close, ema144)]) // Günlük veriler için sinyal hesaplamaları dailyEgimYukari = dailyFib5 > dailyFib5[1] and dailyFib8 > dailyFib8[1] and dailyFib13 > dailyFib13[1] and dailyFib21a > dailyFib21a[1] dailyEgimAsagi = dailyFib21a < dailyFib21a[1] and dailyFib13 < dailyFib13[1] // Günlük sinyaller dailySinyalKisaAL = dailyClose > dailyFib5 and dailyClose > dailyFib8 and dailyClose > dailyFib13 and dailyClose > dailyFib21a and dailyEgimYukari dailySinyalKisaSAT = dailyClose < dailyFib21a and dailyEgimAsagi dailySinyalOrtaAL = dailyClose > dailyFib34 and dailyClose > dailyFib55a dailySinyalOrtaSAT = dailyClose < dailyFib55a dailySinyalUzunAL = dailyClose > dailyFib89 and dailyClose > dailyFib144 dailySinyalUzunSAT = dailyClose < dailyFib144 // Fibonacci EMA Hesapları fib5 = ta.ema(close, ema5) fib8 = ta.ema(close, ema8) fib13 = ta.ema(close, ema13) fib21a = ta.ema(close, ema21a) fib34 = ta.ema(close, ema34) fib55a = ta.ema(close, ema55a) fib89 = ta.ema(close, ema89) fib144 = ta.ema(close, ema144) // Günlük sinyal durumları var string dailyKisaSinyalDurumu = "BEKLİYOR" var string dailyOrtaSinyalDurumu = "BEKLİYOR" var string dailyUzunSinyalDurumu = "BEKLİYOR" var int dailyKisaBarSayaci = 0 var int dailyOrtaBarSayaci = 0 var int dailyUzunBarSayaci = 0 var string dailyTarihKisa = "Yok" var string dailyTarihOrta = "Yok" var string dailyTarihUzun = "Yok" // Günlük sinyal mantıkları if dailySinyalKisaAL and dailyKisaSinyalDurumu[1] != "AL" dailyKisaSinyalDurumu := "AL" dailyKisaBarSayaci := 1 dailyTarihKisa := str.format("{0,date,dd.MM.yyyy}", time) else if dailyKisaSinyalDurumu[1] == "AL" and dailyClose > dailyFib21a and dailyEgimYukari dailyKisaSinyalDurumu := "AL" dailyKisaBarSayaci += 1 else if dailySinyalKisaSAT dailyKisaSinyalDurumu := "SAT" if dailyKisaSinyalDurumu[1] != "SAT" dailyKisaBarSayaci := 1 dailyTarihKisa := str.format("{0,date,dd.MM.yyyy}", time) else dailyKisaBarSayaci += 1 else if dailyKisaSinyalDurumu[1] == "AL" dailyKisaSinyalDurumu := "AL" dailyKisaBarSayaci += 1 else dailyKisaSinyalDurumu := "BEKLİYOR" dailyKisaBarSayaci := 0 if dailySinyalOrtaAL dailyOrtaSinyalDurumu := "AL" if dailyOrtaSinyalDurumu[1] != "AL" dailyOrtaBarSayaci := 1 dailyTarihOrta := str.format("{0,date,dd.MM.yyyy}", time) else dailyOrtaBarSayaci += 1 else if dailySinyalOrtaSAT dailyOrtaSinyalDurumu := "SAT" if dailyOrtaSinyalDurumu[1] != "SAT" dailyOrtaBarSayaci := 1 dailyTarihOrta := str.format("{0,date,dd.MM.yyyy}", time) else dailyOrtaBarSayaci += 1 else dailyOrtaSinyalDurumu := "BEKLİYOR" dailyOrtaBarSayaci := 0 if dailySinyalUzunAL dailyUzunSinyalDurumu := "AL" if dailyUzunSinyalDurumu[1] != "AL" dailyUzunBarSayaci := 1 dailyTarihUzun := str.format("{0,date,dd.MM.yyyy}", time) else dailyUzunBarSayaci += 1 else if dailySinyalUzunSAT dailyUzunSinyalDurumu := "SAT" if dailyUzunSinyalDurumu[1] != "SAT" dailyUzunBarSayaci := 1 dailyTarihUzun := str.format("{0,date,dd.MM.yyyy}", time) else dailyUzunBarSayaci += 1 else dailyUzunSinyalDurumu := "BEKLİYOR" dailyUzunBarSayaci := 0 // EMA Çizgileri plot(showEMAs ? fib5 : na, "EMA 5", color=color.new(color.maroon, 50), linewidth=1) plot(showEMAs ? fib8 : na, "EMA 8", color=color.new(color.blue, 50), linewidth=1) plot(showEMAs ? fib13 : na, "EMA 13", color=color.new(color.green, 50), linewidth=1) plot(showEMAs ? fib21a : na, "EMA 21", color=color.new(color.orange, 30), linewidth=1) plot(showEMAs ? fib34 : na, "EMA 34", color=color.new(color.purple, 30), linewidth=1) plot(showEMAs ? fib55a : na, "EMA 55", color=color.new(color.red, 20), linewidth=2) plot(showEMAs ? fib89 : na, "EMA 89", color=color.new(color.fuchsia, 40), linewidth=2) plot(showEMAs ? fib144 : na, "EMA 144", color=color.new(color.aqua, 40), linewidth=2) // KISA VADE Sinyalleri Detaylı Sinyal Mantığı Her Vade İçin Ayrı // Eğim kontrolü kisaVadeEgimYukari = fib5 > fib5[1] and fib8 > fib8[1] and fib13 > fib13[1] and fib21a > fib21a[1] // AL sinyali: Tüm EMA'ların üzerinde ve eğim yukarı sinyalKisaAL = close > fib5 and close > fib8 and close > fib13 and close > fib21a and kisaVadeEgimYukari // SAT sinyali: EMA 21'in altına düşmesi ve eğim aşağı kisaVadeEgimAsagi = fib21a < fib21a[1] and fib13 < fib13[1] sinyalKisaSAT = close < fib21a and kisaVadeEgimAsagi // ORTA VADE Sinyalleri (Kısa vade mantığı uygulandı) sinyalOrtaAL = close > fib34 and close > fib55a and fib34 > fib55a sinyalOrtaSAT = close < fib55a // UZUN VADE Sinyalleri (Sadece fiyat kontrolü) sinyalUzunAL = close > fib89 and close > fib144 sinyalUzunSAT = close < fib144 // Sinyal Durumu Değişkenleri var string kisaSinyalDurumu = "BEKLİYOR" var string ortaSinyalDurumu = "BEKLİYOR" var string uzunSinyalDurumu = "BEKLİYOR" var int kisaBarSayaci = 0 var int ortaBarSayaci = 0 var int uzunBarSayaci = 0 var string tarihKisa = "Yok" var string tarihOrta = "Yok" var string tarihUzun = "Yok" // KISA VADE Sinyal Mantığı - Sürekli AL Mantığı if sinyalKisaAL and kisaSinyalDurumu[1] != "AL" // İlk AL sinyali - tarih ve bar sayacı sıfırla kisaSinyalDurumu := "AL" kisaBarSayaci := 1 tarihKisa := str.format("{0,date,dd.MM.yyyy}", time) else if kisaSinyalDurumu[1] == "AL" and close > fib21a and kisaVadeEgimYukari // AL sinyali devam ediyor - EMA 21 üzerinde ve eğim yukarı kisaSinyalDurumu := "AL" kisaBarSayaci += 1 else if sinyalKisaSAT // SAT sinyali kisaSinyalDurumu := "SAT" if kisaSinyalDurumu[1] != "SAT" kisaBarSayaci := 1 tarihKisa := str.format("{0,date,dd.MM.yyyy}", time) else kisaBarSayaci += 1 else // Belirsizlik durumu if kisaSinyalDurumu[1] == "AL" kisaSinyalDurumu := "AL" kisaBarSayaci += 1 else kisaSinyalDurumu := "BEKLİYOR" kisaBarSayaci := 0 // ORTA VADE Sinyal Mantığı if sinyalOrtaAL ortaSinyalDurumu := "AL" if ortaSinyalDurumu[1] != "AL" ortaBarSayaci := 0 tarihOrta := str.format("{0,date,dd.MM.yyyy} ", time) else ortaBarSayaci += 1 else if sinyalOrtaSAT ortaSinyalDurumu := "SAT" if ortaSinyalDurumu[1] != "SAT" ortaBarSayaci := 0 tarihOrta := str.format("{0,date,dd.MM.yyyy} ", time) else ortaBarSayaci += 1 else ortaSinyalDurumu := "BEKLİYOR" ortaBarSayaci := 0 // UZUN VADE Sinyal Mantığı if sinyalUzunAL uzunSinyalDurumu := "AL" if uzunSinyalDurumu[1] != "AL" uzunBarSayaci := 0 tarihUzun := str.format("{0,date,dd.MM.yyyy} ", time) else uzunBarSayaci += 1 else if sinyalUzunSAT uzunSinyalDurumu := "SAT" if uzunSinyalDurumu[1] != "SAT" uzunBarSayaci := 0 tarihUzun := str.format("{0,date,dd.MM.yyyy}", time) else uzunBarSayaci += 1 else uzunSinyalDurumu := "BEKLİYOR" uzunBarSayaci := 0 // Tablo konumu belirleme tablePosition = if tablePos == "Sol Üst" position.top_left else if tablePos == "Sağ Üst" position.top_right else if tablePos == "Sol Alt" position.bottom_left else if tablePos == "Sağ Alt" position.bottom_right else position.top_right // Tablo Oluşturma if showTable var table tablo = table.new(tablePosition, 5, 4, border_width=1, bgcolor=color.white, border_color=color.gray) // Başlık satırı table.cell(tablo, 0, 0, "Vade", bgcolor=color.new(color.blue, 80), text_color=color.black, text_size=size.small) table.cell(tablo, 1, 0, "Sinyal Tarihi", bgcolor=color.new(color.blue, 80), text_color=color.black, text_size=size.small) table.cell(tablo, 2, 0, "Bar", bgcolor=color.new(color.blue, 80), text_color=color.black, text_size=size.small) table.cell(tablo, 3, 0, "Durum", bgcolor=color.new(color.blue, 80), text_color=color.black, text_size=size.small) table.cell(tablo, 4, 0, "Güç", bgcolor=color.new(color.blue, 80), text_color=color.black, text_size=size.small) // KISA VADE SATIRI // Hangi veriler kullanılacak useKisaSinyalDurumu = onlyDaily ? dailyKisaSinyalDurumu : kisaSinyalDurumu useKisaBarSayaci = onlyDaily ? dailyKisaBarSayaci : kisaBarSayaci useTarihKisa = onlyDaily ? dailyTarihKisa : tarihKisa useKisaClose = onlyDaily ? dailyClose : close useKisaFib5 = onlyDaily ? dailyFib5 : fib5 useKisaFib8 = onlyDaily ? dailyFib8 : fib8 kisaRenk = if useKisaSinyalDurumu == "AL" if useKisaClose < useKisaFib8 and useKisaClose > useKisaFib5 color.new(color.green, 40) // Orta Güçlü AL else if useKisaClose < useKisaFib5 color.new(color.green, 60) // Zayıf AL else color.new(color.green, 20) // Güçlü AL else if useKisaSinyalDurumu == "SAT" color.new(color.red, 20) else color.new(color.gray, 40) kisaDurumText = if useKisaSinyalDurumu == "AL" and useKisaClose < useKisaFib8 "AL (Zayıf)" else if useKisaSinyalDurumu == "AL" and useKisaClose > useKisaFib8 "AL (Güçlü)" else useKisaSinyalDurumu kisaGuc = if useKisaSinyalDurumu == "AL" if useKisaBarSayaci <= 5 "⭐⭐⭐" else if useKisaBarSayaci <= 15 "⭐⭐" else if useKisaBarSayaci <= 30 "⭐" else "" else if useKisaSinyalDurumu == "SAT" if useKisaBarSayaci <= 5 "⭐⭐⭐" else if useKisaBarSayaci <= 15 "⭐⭐" else if useKisaBarSayaci <= 30 "⭐" else "" else "⏳" kisaBarText = useKisaSinyalDurumu == "BEKLİYOR" ? "" : str.tostring(useKisaBarSayaci) table.cell(tablo, 0, 1, "Kısa Vade", text_size=size.small) table.cell(tablo, 1, 1, useTarihKisa, text_size=size.tiny) table.cell(tablo, 2, 1, kisaBarText, text_size=size.small) table.cell(tablo, 3, 1, kisaDurumText, bgcolor=kisaRenk, text_color=color.white, text_size=size.small) table.cell(tablo, 4, 1, kisaGuc, text_size=size.small) // ORTA VADE SATIRI ortaRenk = if ortaSinyalDurumu == "AL" if close < fib34 and close > fib55a color.new(color.green, 60) // Zayıf AL else if close > fib34 color.new(color.green, 20) // Güçlü AL else color.new(color.green, 40) // Orta AL else if ortaSinyalDurumu == "SAT" color.new(color.red, 20) else color.new(color.gray, 40) ortaDurumText = if ortaSinyalDurumu == "AL" and close < fib34 "AL (Zayıf)" else if ortaSinyalDurumu == "AL" and close > fib34 "AL (Güçlü)" else ortaSinyalDurumu ortaGuc = if ortaSinyalDurumu == "AL" if ortaBarSayaci <= 5 "⭐⭐⭐" else if ortaBarSayaci <= 15 "⭐⭐" else if ortaBarSayaci <= 30 "⭐" else "" else if ortaSinyalDurumu == "SAT" if ortaBarSayaci <= 5 "⭐⭐⭐" else if ortaBarSayaci <= 15 "⭐⭐" else if ortaBarSayaci <= 30 "⭐" else "" else "⏳" ortaBarText = ortaSinyalDurumu == "BEKLİYOR" ? "" : str.tostring(ortaBarSayaci) table.cell(tablo, 0, 2, "Orta Vade", text_size=size.small) table.cell(tablo, 1, 2, tarihOrta, text_size=size.tiny) table.cell(tablo, 2, 2, ortaBarText, text_size=size.small) table.cell(tablo, 3, 2, ortaDurumText, bgcolor=ortaRenk, text_color=color.white, text_size=size.small) table.cell(tablo, 4, 2, ortaGuc, text_size=size.small) // UZUN VADE SATIRI uzunRenk = if uzunSinyalDurumu == "AL" if close < fib89 and close > fib144 color.new(color.green, 60) // Zayıf AL else if close > fib89 color.new(color.green, 20) // Güçlü AL else color.new(color.green, 40) // Orta AL else if uzunSinyalDurumu == "SAT" color.new(color.red, 20) else color.new(color.gray, 40) uzunDurumText = if uzunSinyalDurumu == "AL" and close < fib89 "AL (Zayıf)" else if uzunSinyalDurumu == "AL" and close > fib89 "AL (Güçlü)" else uzunSinyalDurumu uzunGuc = if uzunSinyalDurumu == "AL" if uzunBarSayaci <= 5 "⭐⭐⭐⭐" else if uzunBarSayaci <= 15 "⭐⭐⭐" else if uzunBarSayaci <= 30 "⭐⭐" else if uzunBarSayaci <= 50 "⭐" else "" else if uzunSinyalDurumu == "SAT" if uzunBarSayaci <= 5 "⭐⭐⭐⭐" else if uzunBarSayaci <= 15 "⭐⭐⭐" else if uzunBarSayaci <= 30 "⭐⭐" else if uzunBarSayaci <= 50 "⭐" else "" else "⏳" uzunBarText = uzunSinyalDurumu == "BEKLİYOR" ? "" : str.tostring(uzunBarSayaci) table.cell(tablo, 0, 3, "Uzun Vade", text_size=size.small) table.cell(tablo, 1, 3, tarihUzun, text_size=size.tiny) table.cell(tablo, 2, 3, uzunBarText, text_size=size.small) table.cell(tablo, 3, 3, uzunDurumText, bgcolor=uzunRenk, text_color=color.white, text_size=size.small) table.cell(tablo, 4, 3, uzunGuc, text_size=size.small)
Son Yorumlar