Paylaştığım kodlarda sıkıntı yaşarsanız Google Drive Alanından indirmeniz daha iyi olur. Sitedeki kod gösterici eklentide ufak bir problem vardı. Bu sorunu başka bir plugingle çözdüm ve yazıların bir çoğunu güncelledim ama gözden kaçan düzenlenmemiş Python betiği yada Trading View Pine Script kodlarında sıkıntı olabilir.
Eğer sorun yaşarsanız yazının altına yorum yazarsanız tekrar gözden geçiririm.
Borsapin Python Bist Tarama ve Trading View Pine Script İndikatörleri için Google Drive alanı için buraya tıklayabilirsiniz.
Borsa analizinde teknik göstergeler, yatırım kararlarının vazgeçilmez araçlarıdır. Bu yazımızda, Python kullanarak borsa hisselerinin kapanış verilerinden Wave Trend Osilatörü (WT) hesaplayan ve bu verilerden al-sat sinyalleri üreten gelişmiş bir sistem paylaşacağım.
Bu sistem, pandas, numpy, openpyxl, colorama ve glob gibi popüler Python kütüphanelerini kullanır. Önceki çalışamalarımızda ki Excel dosyalarından kapanış verilerini okur, WT1 ve WT2 eğrilerini hesaplar, Dip ve tepe bölgelerinde al-sat sinyalleri üretir, Sonuçları Excel’e kaydeder ve Başarılı/başarısız hisse senetleri için rapor oluşturur.
Wave Trend İndikatörü Nedir?
Wave Trend (WT) osilatörü, fiyatın momentumu hakkında bilgi sağlayan ve özellikle dip/tepe bölgelerinde verdiği sinyallerle ön plana çıkan bir teknik göstergedir. İki bileşenden oluşur:
WT1: Ana sinyal çizgisi
WT2: WT1’in kısa vadeli hareketli ortalaması (sinyal çizgisi)
Alım/satım sinyalleri bu iki çizginin kesişimleriyle belirlenir. Ek olarak, aşırı alım (OB) ve aşırı satım (OS) seviyeleri ile sinyallerin güvenilirliği artırılır.
1. Wave Trend Hesaplama
Kodun kalbinde, calculate_wave_trend fonksiyonu yer alıyor. Burada;
ESA (Exponential Smoothed Average) hesaplanır.
ESA’den sapmalar üzerinden CI (Composite Index) elde edilir.
CI’nın üstel ortalaması WT1, onun da 4 dönemlik ortalaması WT2 olarak alınır.
WT1 ve WT2 arasındaki kesişimlere göre sinyaller üretilir:
Buy (AL): WT1, WT2’nin üzerine çıkar
Sell(SAT): WT1, WT2’nin altına iner
BuyAtBottom(DIPTE AL): Aşırı satım bölgesinde al sinyali
SellAtTop(TEPEDE SAT): Aşırı alım bölgesinde sat sinyali
2. Dosya Taraması ve İşleme
Tüm hisse senedi kapanış verileri “StokData/Kapanis/” klasöründen otomatik olarak taranır. Her bir dosya için:
Tarih sıralaması yapılır. WT hesaplanır. Son sinyal (AL, SAT, DIPTE_AL, TEPEDE_SAT) analiz edilir.
Sonuçlar “StokData/WaveTrend/” klasörüne kaydedilir.
3. Sinyal Özeti ve Raporlama
Tüm hisseler için elde edilen sinyaller, Tarih ve WT1/WT2 değerleriyle birlikte özetlenir.
“StokData/wave_trend_signals_YYYYMMDD_HHMM.xlsx” adıyla kaydedilir.
Başarılı ve başarısız işlenen hisselerin listesi oluşturulur.
Aşağıda paylaşıcağım Python Çalışmasını X_04_BorsaPin_WaveTrend.py olarak kayıt edebilirsiniz.
Python Kodu
import pandas as pd import numpy as np import os from datetime import datetime from colorama import Fore, init import glob """ Borsapin StokData/Kapanis/ klasöründeki hisse kapanış datalarından Wave Trend Sinyallerini hesaplar. www.kursatsenturk.com """ init(autoreset=True) class WaveTrendCalculator: def __init__(self, n1=10, n2=21, ob2=53, os2=-53): self.n1 = n1 # ESA periyodu self.n2 = n2 # CI periyodu self.ob2 = ob2 # Overbought seviyesi self.os2 = os2 # Oversold seviyesi self.successful_files = [] self.failed_files = [] self.signal_results = [] def calculate_wave_trend(self, df): """Wave Trend hesaplama fonksiyonu""" try: close = df['Kapanış'] # ESA (Exponential Smoothed Average) esa = close.ewm(span=self.n1, adjust=False).mean() # D (Deviation) d = (close - esa).abs().ewm(span=self.n1, adjust=False).mean() # CI (Currency Index) ci = (close - esa) / (0.015 * d) # WT1 ve WT2 hesaplama wt1 = ci.ewm(span=self.n2, adjust=False).mean() wt2 = wt1.rolling(window=4).mean() # Sinyaller buy = (wt1 > wt2) & (wt1.shift(1) <= wt2.shift(1)) buy_at_bottom = buy & (wt2 < self.os2) sell = (wt2 > wt1) & (wt2.shift(1) <= wt1.shift(1)) sell_at_top = sell & (wt2 > self.ob2) return wt1, wt2, buy, buy_at_bottom, sell, sell_at_top except Exception as e: print(f"{Fore.RED}❌ Wave Trend hesaplama hatası: {e}") return None, None, None, None, None, None @staticmethod def get_last_signal(df, ticker_name): """Son sinyali bulma fonksiyonu""" try: # NaN değerleri temizle clean_df = df.dropna(subset=['WT1', 'WT2']) if clean_df.empty: return None, None, None, None # Son tarihten geriye doğru sinyal ara for i in reversed(clean_df.index): row = clean_df.loc[i] date = row['Tarih'] wt1 = row['WT1'] wt2 = row['WT2'] if row['BuyAtBottom']: return 'DIPTE_AL', date, wt1, wt2 elif row['SellAtTop']: return 'TEPEDE_SAT', date, wt1, wt2 elif row['Buy']: return 'AL', date, wt1, wt2 elif row['Sell']: return 'SAT', date, wt1, wt2 return None, None, None, None except Exception as e: print(f"{Fore.RED}❌ {ticker_name} sinyal arama hatası: {e}") return None, None, None, None def process_single_file(self, file_path): """Tek dosya için Wave Trend hesaplama""" # ticker_name'i en başta tanımla ticker_name = "BILINMEYEN" try: # Dosya adından hisse adını alma file_name = os.path.basename(file_path) ticker_name = os.path.splitext(file_name)[0] print(f"{Fore.YELLOW} Wave Trend hesaplanıyor: {ticker_name}...") # Excel dosyasını okuma df = pd.read_excel(file_path) # Gerekli sütunların varlığını kontrol etme required_columns = ['Tarih', 'Kapanış'] missing_columns = [col for col in required_columns if col not in df.columns] if missing_columns: raise ValueError(f"Eksik sütunlar: {missing_columns}") # Veri kontrolü if df.empty or df['Kapanış'].isna().all(): raise ValueError("Kapanış verisi boş veya geçersiz") # Tarihe göre sıralama df = df.sort_values('Tarih').reset_index(drop=True) # Wave Trend hesaplamaları print(f"{Fore.CYAN} ⚡ Wave Trend parametreleri: n1={self.n1}, n2={self.n2}, ob={self.ob2}, os={self.os2}") wt1, wt2, buy, buy_at_bottom, sell, sell_at_top = self.calculate_wave_trend(df) if wt1 is None: raise ValueError("Wave Trend hesaplama başarısız") # Yeni DataFrame oluşturma result_df = pd.DataFrame() result_df['Hisse_Adi'] = [ticker_name] * len(df) result_df['Tarih'] = df['Tarih'] result_df['Kapanış'] = df['Kapanış'] result_df['WT1'] = wt1.round(4) result_df['WT2'] = wt2.round(4) result_df['Buy'] = buy result_df['BuyAtBottom'] = buy_at_bottom result_df['Sell'] = sell result_df['SellAtTop'] = sell_at_top # Son sinyali bulma signal_type, signal_date, last_wt1, last_wt2 = self.get_last_signal(result_df, ticker_name) # Sinyal sonucunu kaydetme if signal_type: self.signal_results.append({ 'Hisse_Adi': ticker_name, 'Sinyal': signal_type, 'Sinyal_Tarihi': pd.to_datetime(signal_date).date() if signal_date else None, 'WT1': round(last_wt1, 2) if last_wt1 else None, 'WT2': round(last_wt2, 2) if last_wt2 else None }) # Renkli sinyal yazdırma renk = Fore.GREEN if "AL" in signal_type else Fore.RED print(renk + f" Son Sinyal: {signal_type} @ {signal_date}") else: print(f"{Fore.WHITE} ▫️ Aktif sinyal yok") # Çıktı klasörünü oluşturma output_folder = "StokData/WaveTrend/" os.makedirs(output_folder, exist_ok=True) # Dosya yolu output_file = os.path.join(output_folder, f"{ticker_name}.xlsx") # Excel'e kaydetme result_df.to_excel(output_file, index=False) print(f"{Fore.GREEN}✅ {ticker_name} Wave Trend verileri başarıyla kaydedildi.") print(f"{Fore.BLUE} Konum: {output_file}") print(f"{Fore.BLUE} Toplam satır: {len(result_df)}") self.successful_files.append(ticker_name) return True except Exception as e: print(f"{Fore.RED}❌ {ticker_name} için hata: {e}") self.failed_files.append(ticker_name) return False @staticmethod def find_input_files(input_folder="StokData/Kapanis/"): """Giriş dosyalarını bulma""" try: # Excel dosyalarını arama pattern = os.path.join(input_folder, "*.xlsx") files = glob.glob(pattern) if not files: print(f"{Fore.RED}❌ {input_folder} klasöründe Excel dosyası bulunamadı!") return [] print(f"{Fore.BLUE} {len(files)} adet Excel dosyası bulundu.") return files except Exception as e: print(f"{Fore.RED}❌ Dosya arama hatası: {e}") return [] def save_signals_summary(self, filename=None): """Sinyal özetini kaydetme""" if not self.signal_results: print(f"{Fore.YELLOW}⚠️ Kaydedilecek sinyal yok.") return if filename is None: timestamp = datetime.now().strftime('%Y%m%d_%H%M') filename = f"StokData/wave_trend_signals_{timestamp}.xlsx" try: # Klasör oluşturma os.makedirs(os.path.dirname(filename), exist_ok=True) # Sinyal DataFrame'i oluşturma signals_df = pd.DataFrame(self.signal_results) # Sinyal türüne göre sıralama signal_order = ['DIPTE_AL', 'AL', 'SAT', 'TEPEDE_SAT'] signals_df['sinyal_order'] = signals_df['Sinyal'].map({s: i for i, s in enumerate(signal_order)}) signals_df = signals_df.sort_values(['sinyal_order', 'Sinyal_Tarihi'], ascending=[True, False]) signals_df = signals_df.drop('sinyal_order', axis=1) # Excel'e kaydetme signals_df.to_excel(filename, index=False) print(f"{Fore.GREEN} Sinyal özeti kaydedildi: {filename}") print(f"{Fore.BLUE} Toplam sinyal: {len(signals_df)}") # Sinyal türü dağılımı signal_counts = signals_df['Sinyal'].value_counts() for signal, count in signal_counts.items(): color = Fore.GREEN if "AL" in signal else Fore.RED print(f"{color} {signal}: {count} adet") except Exception as e: print(f"{Fore.RED}❌ Sinyal özeti kaydetme hatası: {e}") def print_summary(self): """Özet rapor""" total = len(self.successful_files) + len(self.failed_files) success_rate = (len(self.successful_files) / total * 100) if total > 0 else 0 print(f"\n{Fore.CYAN} ===== WAVE TREND HESAPLAMA RAPORU =====") print(f"{Fore.BLUE} Parametreler: n1={self.n1}, n2={self.n2}, OB={self.ob2}, OS={self.os2}") print(f"{Fore.GREEN}✅ Başarılı: {len(self.successful_files)}") print(f"{Fore.RED}❌ Başarısız: {len(self.failed_files)}") print(f"{Fore.BLUE} Başarı oranı: {success_rate:.1f}%") print(f"{Fore.MAGENTA} Toplam sinyal: {len(self.signal_results)}") if self.successful_files: print(f"{Fore.GREEN} Başarılı dosyalar: {', '.join(self.successful_files[:10])}") if len(self.successful_files) > 10: print(f"{Fore.GREEN} ... ve {len(self.successful_files) - 10} dosya daha") if self.failed_files: print(f"{Fore.RED} Başarısız dosyalar: {', '.join(self.failed_files)}") def save_failed_list(self, filename="basarisiz_wavetrend_dosyalari.txt"): """Başarısız dosyaları kaydetme""" if self.failed_files: try: with open(filename, 'w', encoding='utf-8') as f: f.write("# Başarısız Wave Trend hesaplama dosyaları\n") f.write(f"# Tarih: {datetime.now().strftime('%Y-%m-%d')}\n") f.write(f"# Parametreler: n1={self.n1}, n2={self.n2}, OB={self.ob2}, OS={self.os2}\n\n") for file_name in self.failed_files: f.write(f"{file_name}\n") print(f"{Fore.YELLOW} Başarısız dosyalar {filename} dosyasına kaydedildi.") except Exception as e: print(f"{Fore.RED}❌ Başarısız dosya listesi kaydetme hatası: {e}") def main(self): """Ana fonksiyon""" print(f"{Fore.CYAN} Wave Trend Hesaplama Sistemi Başlatılıyor...") print(f"{Fore.BLUE} Parametreler: n1={self.n1}, n2={self.n2}, OB={self.ob2}, OS={self.os2}") # Giriş dosyalarını bulma input_files = self.find_input_files() if not input_files: return print(f"{Fore.BLUE} Toplam işlenecek dosya: {len(input_files)}\n") # Dosyaları işleme for i, file_path in enumerate(input_files, 1): print(f"\n{Fore.MAGENTA}[{i}/{len(input_files)}] İşleniyor...") self.process_single_file(file_path) # Sonuçları kaydetme ve raporlama self.save_signals_summary() self.save_failed_list() self.print_summary() print(f"\n{Fore.GREEN} Wave Trend hesaplama işlemi tamamlandı!") print(f"{Fore.BLUE} Detay dosyaları: StokData/WaveTrend/") print(f"{Fore.BLUE} Sinyal özeti: StokData/Wave_Trend_Sinyal_*.xlsx") # Kullanım if __name__ == "__main__": # Özelleştirilebilir parametreler calculator = WaveTrendCalculator( n1=10, # ESA periyodu n2=21, # CI periyodu ob2=53, # Overbought seviyesi os2=-53 # Oversold seviyesi ) calculator.main()
Bu Bist Tarama projesininin 6. makalesi oldu sanırım. Bir sonraki çalışmamızda yukarıda paylaştığım python betiğinin (wavetrend osilatör) TradingView üzerinde çalışan indikatör kodlarını paylaşacağım, sonrasında Python Bist Tarama çalışmaları için Osilatör değerleri yada Linear Regresyon kanalları ile ilgili betikler paylaşabilirim.
Trend takibi, finansal piyasalarda başarılı işlem stratejilerinin temelini oluşturur. Bu kapsamda, hareketli ortalamalar (MA) özellikle Exponential Moving Average (EMA), piyasa yönünü ve momentumunu belirlemede sıklıkla tercih edilen araçlardır. “Ideal EMA Dizilim” adlı bu özel gösterge, çoklu EMA’ların sıralanışını analiz ederek trendin gücünü ve netliğini ölçmeyi amaçlıyor. Önceki Makalelerde Python ile kapanış verilerini çektik, o verilerle Ema periyodlarını belirledik sonrasında ise Python ile İdeal Ema sinyallerini oluşturan betiklede bu sinyalleri Excele dökmüştük.
Gösterge, aşağıdaki 10 adet üstel hareketli ortalamayı (EMA) hesaplar:
Bu periyotlar kısa, orta ve uzun vadeli eğilimleri birlikte analiz etmeye olanak tanır.
EMA dizilimleri büyükten küçüğe (azalan) veya küçükten büyüğe (artan) doğru sıralanabilir.
Grafiklerde Gösterim
Bir Önceki Makaledeki Python idealEmaDizilim tarama çalışması dosyasıyla uyumlu çalışır.
Trading View Pine Script İdeal Ema Dizilim İndikatör Kodu
// Bu, Pine Script™ kodu Mozilla Kamu Lisansı 2.0 (MPL-2.0) altında lisanslandı // © krstsntrk © BorsaPin codeispriority // Saraylarda süremem, Dağlarda sürdüğümü. Bin cihana değişmem Şu öksüz Türk'lüğümü... Atsız // @version=6 indicator("BorsaPin IdealEMA Dizilim (EMA ALIGNMENT) ", shorttitle="BorsaPin IdealEMA Dizilim (EMA ALIGNMENT)", overlay=true) // Ayarlar show_table = input.bool(true, "Tabloyu Göster", group="Görünüm") table_position = input.string("Sağ Alt", "Tablo Konumu", options=["Sol Üst", "Orta Üst", "Sağ Üst", "Sol Orta", "Tam Orta", "Sağ Orta", "Sol Alt", "Orta Alt", "Sağ Alt"], group="Görünüm") table_size = input.string("Küçük", "Tablo Boyutu", options=["Çok Küçük", "Küçük", "Normal", "Büyük"], group="Görünüm") show_ema_lines = input.bool(true, "EMA Cizgilerini Goster", group="EMA Ayarlari") show_background = input.bool(true, "Arka Plan Renklerini Goster", group="EMA Ayarlari") // EMA gorunurluk ayarlari show_ema5 = input.bool(true, "EMA 5", inline="ema1", group="EMA Cizgileri") show_ema8 = input.bool(true, "EMA 8", inline="ema1", group="EMA Cizgileri") show_ema13 = input.bool(true, "EMA 13", inline="ema2", group="EMA Cizgileri") show_ema21 = input.bool(true, "EMA 21", inline="ema2", group="EMA Cizgileri") show_ema34 = input.bool(true, "EMA 34", inline="ema3", group="EMA Cizgileri") show_ema55 = input.bool(true, "EMA 55", inline="ema3", group="EMA Cizgileri") show_ema89 = input.bool(true, "EMA 89", inline="ema4", group="EMA Cizgileri") show_ema144 = input.bool(true, "EMA 144", inline="ema4", group="EMA Cizgileri") show_ema233 = input.bool(true, "EMA 233", inline="ema5", group="EMA Cizgileri") show_ema370 = input.bool(true, "EMA 370", inline="ema5", group="EMA Cizgileri") // EMA Periyodları (Python kodundaki ile aynı) ema5 = ta.ema(close, 5) ema8 = ta.ema(close, 8) ema13 = ta.ema(close, 13) ema21 = ta.ema(close, 21) ema34 = ta.ema(close, 34) ema55 = ta.ema(close, 55) ema89 = ta.ema(close, 89) ema144 = ta.ema(close, 144) ema233 = ta.ema(close, 233) ema370 = ta.ema(close, 370) // EMA'ları dizi olarak tanımlama ema_values = array.new<float>() array.push(ema_values, ema5) array.push(ema_values, ema8) array.push(ema_values, ema13) array.push(ema_values, ema21) array.push(ema_values, ema34) array.push(ema_values, ema55) array.push(ema_values, ema89) array.push(ema_values, ema144) array.push(ema_values, ema233) array.push(ema_values, ema370) ema_periods = array.new<int>() array.push(ema_periods, 5) array.push(ema_periods, 8) array.push(ema_periods, 13) array.push(ema_periods, 21) array.push(ema_periods, 34) array.push(ema_periods, 55) array.push(ema_periods, 89) array.push(ema_periods, 144) array.push(ema_periods, 233) array.push(ema_periods, 370) // İdeal Ema Dizilim hesaplama // Dizilimin sirali olup olmadigini kontrol etme fonksiyonu is_descending_order(ema_array) => size = array.size(ema_array) is_desc = true for i = 0 to size - 2 if array.get(ema_array, i) < array.get(ema_array, i + 1) is_desc := false break is_desc is_ascending_order(ema_array) => size = array.size(ema_array) is_asc = true for i = 0 to size - 2 if array.get(ema_array, i) > array.get(ema_array, i + 1) is_asc := false break is_asc // Maximum ve minimum EMA değerlerini bulma max_ema = math.max(ema5, math.max(ema8, math.max(ema13, math.max(ema21, math.max(ema34, math.max(ema55, math.max(ema89, math.max(ema144, math.max(ema233, ema370))))))))) min_ema = math.min(ema5, math.min(ema8, math.min(ema13, math.min(ema21, math.min(ema34, math.min(ema55, math.min(ema89, math.min(ema144, math.min(ema233, ema370))))))))) // Ideal EMA dizilim kontrolu (Python kodumuzdaki mantik) ideal_ema_status = "" if close > max_ema and is_descending_order(ema_values) ideal_ema_status := "Ideal EMA Yukselis" else if close < min_ema and is_ascending_order(ema_values) ideal_ema_status := "Ideal EMA Dusus" else ideal_ema_status := "Ideal EMA Notr" // Potansiyel olusum kontrolu is_potential = close > min_ema and close < max_ema // Sinyal degisimi tespiti var string prev_status = "" var int signal_bar = 0 var string signal_date = "" if ideal_ema_status != prev_status prev_status := ideal_ema_status signal_bar := bar_index signal_date := str.tostring(year) + "-" + str.tostring(month, "00") + "-" + str.tostring(dayofmonth, "00") // Görseller // EMA cizgileri - sadece secilenleri goster plot(show_ema_lines and show_ema5 ? ema5 : na, "EMA 5", color=color.new(color.red, 0), linewidth=1) plot(show_ema_lines and show_ema8 ? ema8 : na, "EMA 8", color=color.new(color.orange, 0), linewidth=1) plot(show_ema_lines and show_ema13 ? ema13 : na, "EMA 13", color=color.new(color.yellow, 0), linewidth=1) plot(show_ema_lines and show_ema21 ? ema21 : na, "EMA 21", color=color.new(color.green, 0), linewidth=1) plot(show_ema_lines and show_ema34 ? ema34 : na, "EMA 34", color=color.new(color.blue, 0), linewidth=1) plot(show_ema_lines and show_ema55 ? ema55 : na, "EMA 55", color=color.new(color.purple, 0), linewidth=1) plot(show_ema_lines and show_ema89 ? ema89 : na, "EMA 89", color=color.new(color.gray, 0), linewidth=1) plot(show_ema_lines and show_ema144 ? ema144 : na, "EMA 144", color=color.new(color.maroon, 0), linewidth=1) plot(show_ema_lines and show_ema233 ? ema233 : na, "EMA 233", color=color.new(color.navy, 0), linewidth=1) plot(show_ema_lines and show_ema370 ? ema370 : na, "EMA 370", color=color.new(color.black, 0), linewidth=2) // Sinyal noktalarini isaretleme - sadece secildiginde goster signal_color = show_background ? (ideal_ema_status == "Ideal EMA Yukselis" ? color.new(color.green, 90) : ideal_ema_status == "Ideal EMA Dusus" ? color.new(color.red, 90) : is_potential ? color.new(color.yellow, 95) : na) : na bgcolor(signal_color) // Tablo if show_table and barstate.islast // Tablo pozisyonunu dinamik olarak ayarlama table_pos = table_position == "Sol Üst" ? position.top_left : table_position == "Orta Üst" ? position.top_center : table_position == "Sağ Üst" ? position.top_right : table_position == "Sol Orta" ? position.middle_left : table_position == "Tam Orta" ? position.middle_center : table_position == "Sağ Orta" ? position.middle_right : table_position == "Sol Alt" ? position.bottom_left : table_position == "Orta Alt" ? position.bottom_center : position.bottom_right t_size = table_size == "Çok Küçük" ? size.tiny : table_size == "Küçük" ? size.small : table_size == "Büyük" ? size.large : size.normal // Ana tablo olusturma info_table = table.new(table_pos, 3, 15, bgcolor=color.new(color.white, 0), border_width=2, border_color=color.new(color.gray, 0)) // Baslik satiri table.cell(info_table, 0, 0, "EMA DIZILIM ANALIZI", text_color=color.white, bgcolor=color.new(color.blue, 0), text_size=t_size) table.merge_cells(info_table, 0, 0, 2, 0) // Mevcut durum status_color = ideal_ema_status == "Ideal EMA Yukselis" ? color.new(color.green, 70) : ideal_ema_status == "Ideal EMA Dusus" ? color.new(color.red, 70) : color.new(color.gray, 70) table.cell(info_table, 0, 1, "Mevcut Durum:", text_color=color.black, bgcolor=color.new(color.silver, 70), text_size=t_size) table.cell(info_table, 1, 1, ideal_ema_status, text_color=color.black, bgcolor=status_color, text_size=t_size) table.cell(info_table, 2, 1, is_potential ? "Potansiyel ✓" : "", text_color=color.black, bgcolor=color.new(color.yellow, 80), text_size=t_size) // Son sinyal bilgisi table.cell(info_table, 0, 2, "Son Sinyal:", text_color=color.black, bgcolor=color.new(color.silver, 70), text_size=t_size) table.cell(info_table, 1, 2, signal_date, text_color=color.black, bgcolor=color.new(color.white, 50), text_size=t_size) table.cell(info_table, 2, 2, str.tostring(bar_index - signal_bar) + " bar once", text_color=color.black, bgcolor=color.new(color.white, 50), text_size=t_size) // EMA bilgileri baslik table.cell(info_table, 0, 3, "EMA", text_color=color.white, bgcolor=color.new(color.navy, 0), text_size=t_size) table.cell(info_table, 1, 3, "Deger", text_color=color.white, bgcolor=color.new(color.navy, 0), text_size=t_size) table.cell(info_table, 2, 3, "Kapanis Orani", text_color=color.white, bgcolor=color.new(color.navy, 0), text_size=t_size) // EMA degerleri ve oranlari ema_list = array.from(ema5, ema8, ema13, ema21, ema34, ema55, ema89, ema144, ema233, ema370) ema_names = array.from("EMA 5", "EMA 8", "EMA 13", "EMA 21", "EMA 34", "EMA 55", "EMA 89", "EMA 144", "EMA 233", "EMA 370") for i = 0 to 9 row = i + 4 ema_val = array.get(ema_list, i) ema_name = array.get(ema_names, i) ratio = (close / ema_val - 1) * 100 // Renk belirleme (kapanis fiyatina gore) - pastel renkler cell_color = close > ema_val ? color.new(color.green, 80) : color.new(color.red, 80) table.cell(info_table, 0, row, ema_name, text_color=color.black, bgcolor=color.new(color.white, 70), text_size=t_size) table.cell(info_table, 1, row, str.tostring(math.round(ema_val, 2)), text_color=color.black, bgcolor=cell_color, text_size=t_size) table.cell(info_table, 2, row, str.tostring(math.round(ratio, 2)) + "%", text_color=color.black, bgcolor=cell_color, text_size=t_size) // Sinyal degisimi icin alarm alertcondition(ideal_ema_status != prev_status[1], "Ideal EMA Sinyal Degisimi", "Ideal EMA durumu degisti") // Spesifik sinyaller icin alarm alertcondition(ideal_ema_status == "Ideal EMA Yukselis" and prev_status[1] != "Ideal EMA Yukselis", "Ideal EMA Yukselis", "Ideal EMA Yukselis sinyali olustu!") alertcondition(ideal_ema_status == "Ideal EMA Dusus" and prev_status[1] != "Ideal EMA Dusus", "Ideal EMA Dusus", "Ideal EMA Dusus sinyali olustu!") // Potansiyel olusum alarmı alertcondition(is_potential and not is_potential[1], "Potansiyel Olusim", "Ideal EMA potansiyel olusum tespit edildi!")
Pivot noktaları, teknik analizde sıklıkla kullanılan ve bir varlığın olası destek ve direnç seviyelerini belirlemek için kullanılan matematiksel seviyelerdir. Bu seviyeler, yatırımcılara alım-satım kararlarında yardımcı olan önemli araçlardan biridir.
TradingView platformu üzerinde Pine Script ile geliştirilen ve grafik üzerinde çizim yapmadan sadece tablo formatında çalışan gelişmiş bir pivot analiz aracını tanıtacağız. Ayrıca kullanıcıların tercihlerine göre Klasik, Fibonacci veya Woodie pivot yöntemlerinden birini seçerek analiz yapabilmesi mümkün olacak. Youtubeda ki bir çok yayıncının yaptığı gibi bilgiyi para karşılığı satan bir zihniyette olmadığım için ücretsiz bir şekilde yararlanabilirsiniz.
Zaman Dilimi Seçimi: Günlük, Haftalık, Aylık ve Yıllık pivot seviyeleri hesaplanır.
Yöntem Seçimi: Kullanıcı, Klasik, Fibonacci veya Woodie hesaplama yöntemlerinden birini tercih edebilir.
Tablo Üzerinden Görselleştirme: Pivot, 3 destek ve 3 direnç seviyesi; ilgili zaman dilimi ve yönteme göre tablo halinde görüntülenir.
Kapanış Bekleme Opsiyonu: Haftalık, aylık ve yıllık mum kapanışları henüz gerçekleşmediyse, bir önceki dönemin verileri kullanılır. Ancak kullanıcı, ayarlardan Güncel veriyi kullanmak isterse bu seçeneği pasifleştirerek o anki mum verileriyle hesaplama yapabilir.
P = (High + Low + Close) / 3
R1 = (2 * P) – Low
S1 = (2 * P) – High
R2 = P + (High – Low)
S2 = P – (High – Low)
R3 = High + 2*(P – Low)
S3 = Low – 2*(High – P)
P = (High + Low + Close) / 3
R1 = P + 0.382 * (High – Low)
R2 = P + 0.618 * (High – Low)
R3 = P + 1.000 * (High – Low)
S1 = P – 0.382 * (High – Low)
S2 = P – 0.618 * (High – Low)
S3 = P – 1.000 * (High – Low)
P = (High + Low + 2 * Close) / 4
R1 = (2 * P) – Low
S1 = (2 * P) – High
R2 = P + (High – Low)
S2 = P – (High – Low)
R3 = High + 2*(P – Low)
S3 = Low – 2*(High – P)
TradingView’de yeni bir Pine Script oluşturun.
Kodunuzu yapıştırarak çalıştırın.
İndikatör, grafikte herhangi bir çizim yapmaz. Ancak ekranın sağ üst köşesinde pivot değerlerini detaylı bir şekilde gösteren bir tablo oluşturur.
Ayarlar kısmından:
Pivot türünü (Classic, Fibonacci, Woodie)
Zaman dilimini (Günlük, Haftalık , Aylık, Yıllık)
Text uzantılı dosya olarak indirmek isterseniz buraya tıklayın.
Trading View Günlük haftalık Aylık Yıllık PivotTablo Pine Script Kodu
// Bu, Pine Script™ kodu Mozilla Kamu Lisansı 2.0 (MPL-2.0) altında lisanslandı // © krstsntrk © BorsaPin code is priority //@version=5 indicator(title = 'BorsaPin Pivot Sistem', shorttitle = 'BorsaPin Pivot Sistem', overlay = true) // === Kullanıcı Ayarları === pivotType = input.string("Woodie", title="Pivot Tipi", options=["Classic", "Fibonacci", "Woodie"]) useCurrentBar = input.bool(true, title="Kapanış Bekleme Opsiyonu (Açık mum yerine önceki kapanışı kullanır.)") showDaily = input.bool(true, title="Günlük Pivot Göster") showWeekly = input.bool(true, title="Haftalık Pivot Göster") showMonthly = input.bool(true, title="Aylık Pivot Göster") showYearly = input.bool(true, title="Yıllık Pivot Göster") // === Zaman Aralığına Göre High/Low/Close === getHigh(_tf) => useCurrentBar ? request.security(syminfo.tickerid, _tf, high) : request.security(syminfo.tickerid, _tf, high[1]) getLow(_tf) => useCurrentBar ? request.security(syminfo.tickerid, _tf, low) : request.security(syminfo.tickerid, _tf, low[1]) getClose(_tf) => useCurrentBar ? request.security(syminfo.tickerid, _tf, close) : request.security(syminfo.tickerid, _tf, close[1]) // === Pivot Hesaplayıcı Fonksiyon === calcPivots(high_, low_, close_, _type) => pivot = 0.0 r1 = 0.0 r2 = 0.0 r3 = 0.0 s1 = 0.0 s2 = 0.0 s3 = 0.0 if _type == "Classic" pivot := (high_ + low_ + close_) / 3 r1 := 2 * pivot - low_ s1 := 2 * pivot - high_ r2 := pivot + (high_ - low_) s2 := pivot - (high_ - low_) r3 := high_ + 2 * (pivot - low_) s3 := low_ - 2 * (high_ - pivot) else if _type == "Fibonacci" pivot := (high_ + low_ + close_) / 3 r1 := pivot + 0.382 * (high_ - low_) r2 := pivot + 0.618 * (high_ - low_) r3 := pivot + 1.000 * (high_ - low_) s1 := pivot - 0.382 * (high_ - low_) s2 := pivot - 0.618 * (high_ - low_) s3 := pivot - 1.000 * (high_ - low_) else if _type == "Woodie" pivot := (high_ + low_ + 2 * close_) / 4 r1 := (2 * pivot) - low_ s1 := (2 * pivot) - high_ r2 := pivot + (high_ - low_) s2 := pivot - (high_ - low_) r3 := high_ + 2 * (pivot - low_) s3 := low_ - 2 * (high_ - pivot) [pivot, r1, r2, r3, s1, s2, s3] // === Her Zaman Dilimi İçin High / Low / Close Al === dH = getHigh("D") dL = getLow("D") dC = getClose("D") wH = getHigh("W") wL = getLow("W") wC = getClose("W") mH = getHigh("M") mL = getLow("M") mC = getClose("M") yH = getHigh("12M") yL = getLow("12M") yC = getClose("12M") // === Pivotları Hesapla === [dP, dR1, dR2, dR3, dS1, dS2, dS3] = calcPivots(dH, dL, dC, pivotType) [wP, wR1, wR2, wR3, wS1, wS2, wS3] = calcPivots(wH, wL, wC, pivotType) [mP, mR1, mR2, mR3, mS1, mS2, mS3] = calcPivots(mH, mL, mC, pivotType) [yP, yR1, yR2, yR3, yS1, yS2, yS3] = calcPivots(yH, yL, yC, pivotType) // === Tablo Oluştur === var table pivotTable = table.new(position.top_right, 8, 20, border_width=1) // === Başlıklar === if bar_index % 10 == 0 table.cell(pivotTable, 0, 0, "Zaman", text_color=color.black, bgcolor=color.gray) table.cell(pivotTable, 1, 0, "P", text_color=color.navy) table.cell(pivotTable, 2, 0, "R1", text_color=color.lime) table.cell(pivotTable, 3, 0, "R2", text_color=color.lime) table.cell(pivotTable, 4, 0, "R3", text_color=color.lime) table.cell(pivotTable, 5, 0, "S1", text_color=color.red) table.cell(pivotTable, 6, 0, "S2", text_color=color.red) table.cell(pivotTable, 7, 0, "S3", text_color=color.red) // === Veri Satırı Ekleme Fonksiyonu === addRow(idx, label, p, r1, r2, r3, s1, s2, s3) => table.cell(pivotTable, 0, idx, label, text_color=color.black) table.cell(pivotTable, 1, idx, str.tostring(p, format.mintick)) table.cell(pivotTable, 2, idx, str.tostring(r1, format.mintick)) table.cell(pivotTable, 3, idx, str.tostring(r2, format.mintick)) table.cell(pivotTable, 4, idx, str.tostring(r3, format.mintick)) table.cell(pivotTable, 5, idx, str.tostring(s1, format.mintick)) table.cell(pivotTable, 6, idx, str.tostring(s2, format.mintick)) table.cell(pivotTable, 7, idx, str.tostring(s3, format.mintick)) // === Tabloda Göster === row = 1 if showDaily addRow(row, "Günlük", dP, dR1, dR2, dR3, dS1, dS2, dS3) row += 1 if showWeekly addRow(row, "Haftalık", wP, wR1, wR2, wR3, wS1, wS2, wS3) row += 1 if showMonthly addRow(row, "Aylık", mP, mR1, mR2, mR3, mS1, mS2, mS3) row += 1 if showYearly addRow(row, "Yıllık", yP, yR1, yR2, yR3, yS1, yS2, yS3)
Finansal piyasalarda birçok yatırımcı, hazır gelen birkaç basit indikatöre bel bağlayarak alım-satım yapar. RSI, MACD, Bollinger gibi klasik araçlar
— ne kadar temel analiz gücü taşısalar da — tek başına sürdürülebilir başarı sağlamakta yetersiz kalırlar.
Çünkü bu araçlar herkesin ekranında aynıdır. Aynı seviyede alım, aynı noktada satış yapmaya çalışan binlerce yatırımcının olduğu bir ortamda fark yaratmak, sıradan olanı kullanarak mümkün değildir.
Elliott Dalga Prensibi (Elliott Wave Principle)
5 dalga itici (motive) yapı: Ana trend yönünde beş aşamalı hareket (1, 2, 3, 4, 5).
3 dalga düzeltici yapı: Ana trendle çelişen üç aşamada geri çekilme (A, B, C)
Bu döngüler bir araya gelerek yineleyici, fraktal yapılar oluşturur; küçük dalgalar daha büyük dalgaların içinde yer alabilir
Elliott dalga sayımı yapılırken göz önünde bulundurulan 3 temel kural vardır
Wave 2, Wave 1’in %100’ünden fazla geri çekilemez.
Wave 3, en kısa impuls dalga olamaz.
Wave 4, Wave 1’in fiyat bölgesine giremez.
Ayrıca, dalga 2 ve 4 arasında alternation denilen karşıt form farklılıkları görülür biri keskinse diğeri yumuşak yapıda olur.
Fibonacci ile Bağlantısı
Dalga boyları Fibonacci sayı dizisiyle ilişkili olarak analiz edilir (örneğin, geri çekilmeler %38, %61.8 gibi oranlara yaklaşabilir)
“İdeal EMA Up” listesi, genellikle bir hissenin fiyatının belirli EMA’ların (Üssel Hareketli Ortalamalar) üzerine çıktığını ve teknik olarak yükseliş trendine girdiğini gösteren bir sinyaldir. Ancak hisse fiyatı bu ortalamaların altına düştüğünde listeden çıkar ve yeniden yukarı kırarsa tekrar listeye girer.
Bu tür listeye çok kez girip çıkan hisseler, kısa vadeli düzeltmelerin ardından trendin devam ettiğini gösterir. Bu da, hissede daha karmaşık ama güçlü bir yükseliş dalgası yapısına işaret eder.
Dalga Yapısı (Wave Structure) Açısından Anlamı
Hissenin bu listeye tekrar tekrar girmesi: Elliott Dalga Teorisi’ne göre, bu tür hareketler genellikle bir trendin içinde birden fazla küçük düzeltme dalgası ve ardından devam dalgaları olduğunu gösterir.
Yani:
EMA kırılımı = Yükseliş impuls dalgası
EMA altına sarkma = Düzeltme dalgası
Tekrar EMA yukarı kırılımı = Yeni bir yükseliş dalgası başlangıcı
Bu yapı hisseye zamanla: Polinomsal (üstel hızlanarak) yükseliş modeli kazandırabilir.
Polinomsal Yükseliş Nedir?
Polinomsal yükseliş, fiyat grafiğinde:
Zamanla giderek dikleşen bir yükseliş eğrisi oluşmasıdır. Bu genellikle alttan destekli bir trendin ivmelenmesiyle oluşur.
Bunu teknik olarak şöyle tespit edebilirsiniz:
Fiyat hareketine polinomsal regresyon eğrisi (örneğin 2. veya 3. dereceden) fit ettiğinizde, eğri yukarı kıvrılıyorsa, bu yükselişin lineer değil, ivmeli olduğunu gösterir.
Yüksek Risklidir. Bir Ayda % 80 kazandırıyorsa Taban serisi ile 6 işlem gününde geri çekilir.
İşte tam bu noktada polinomsal regresyon (Polynomial Regression) devreye girer. Bu yöntem, fiyat serisini eğri formunda modelleyerek daha esnek ve gerçekçi trend yorumları sunar.
Bu yazıda polinomsal regresyonun ne olduğu, nasıl hesaplandığı, finansal grafikte nasıl kullanıldığı ve hangi durumlarda işe yaradığı detaylı şekilde anlatılacaktır.
Polinomsal regresyon, bağımlı bir değişkeni (örneğin kapanış fiyatı) zamana karşı bir polinom fonksiyonu ile modellemeye çalışan istatistiksel bir tekniktir.
y
: Tahmin edilen fiyatx
: Zaman (örneğin bar numarası)n
: Polinomun derecesi (2: parabol, 3+: eğri)Amaç | Açıklama |
---|---|
Trend eğrisini çizmek | Fiyat serisinin eğilim yönünü eğrisel şekilde modellemek |
Dönüş noktalarını saptamak | Eğrinin lokal maksimum/minimum noktaları potansiyel dönüş alanlarını verir |
Trendin hızını ve yönünü analiz etmek | Eğrinin eğimi ve derecesi bu konuda ipuçları verir |
Fiyat sapmalarını analiz etmek | Gerçek fiyat ile regresyon eğrisi arasındaki farklar aşırılık göstergesi olabilir |
Polinom Derecesi | Teknik Anlamı | Kullanım Senaryosu |
---|---|---|
1 (Lineer) | Basit yükselen/düşen trend | Doğrusal regresyon kanalı |
2 (Parabolik) | Dip/tepe oluşumları, dönüş eğilimleri | Orta vadeli dönüşler |
3–4 (Kübik / 4. derece) | Trend içinde minör dalgalar, Elliott analizi | Dalga yapısı çıkarımı |
5+ | Çok kısa vadeli dönüşler ve gürültü filtreleme | Algoritmik stratejiler (dikkatli kullanılmalı) |
Uyarı: Polinom derecesi yükseldikçe overfitting riski artar. Dengeli seçim yapılmalıdır.
Dipten dönen bir hisse senedinde, fiyatlar ikinci derece eğriyle modellenirse yukarı kıvrılan bir parabol çizilir → trend dönüşü teyit edilmiş olabilir.
Fiyatın düşük-dalga-yüksek-dalga yapısı, 3. veya 4. derece bir eğriyle oldukça yakın şekilde yakalanabilir.
Eğri ile gerçek kapanış fiyatı arasındaki farkın standardize edilmiş hali (Z-score gibi) aşırılık göstergesi olabilir.
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression # --- Veriyi Yükle --- df = pd.read_excel("your_stock_data.xlsx") # "DATE" sütunu tarih formatına çevrilsin df["DATE"] = pd.to_datetime(df["DATE"]) # --- Bağımlı ve bağımsız değişkenler --- y = df["CLOSING_TL"].values # Kapanış fiyatları x = np.arange(len(y)).reshape(-1, 1) # 0,1,2,... şeklinde indeks # --- Polinom regresyon (3. dereceden) --- poly = PolynomialFeatures(degree=3) X_poly = poly.fit_transform(x) model = LinearRegression().fit(X_poly, y) # --- Tahmin --- y_pred = model.predict(X_poly) # --- Grafik --- plt.figure(figsize=(10, 5)) plt.plot(df["DATE"], y, label="Gerçek Fiyat", color="blue") plt.plot(df["DATE"], y_pred, label="Polinomsal Regresyon (d=3)", linestyle="--", color="red") plt.legend() plt.title("Polinomsal Regresyon ile Trend Analizi") plt.xlabel("Tarih") plt.ylabel("Fiyat (TL)") plt.grid(True) plt.show()
Durum | Kullanım |
---|---|
Belirsiz trend yönü | 2. veya 3. derece regresyon eğrisi |
Dalgalı piyasa | 3–4 derece trend eğrisi analizi |
Tepe/dip analizi | 2. derece regresyon yeterlidir |
Otomatik trade | 3+ dereceler + filtrelerle |
Polinomsal regresyon, klasik teknik analiz araçlarının ötesine geçerek piyasa davranışını eğrisel ve daha doğal biçimde modellemek için etkili bir araçtır. Özellikle trendin yönü ve dönüş ihtimali hakkında daha rafine bir bakış sunar.
Ancak her güçlü araç gibi, dikkatli kullanılmalıdır. Gereksiz derecede yüksek polinomlar, yanıltıcı olabilir. Bu nedenle regresyon eğrisi, diğer teknik sinyallerle (RSI, MACD, Bollinger, hacim) birlikte kullanılmalıdır.
ALFA TREND Kıvanç Özbilgiç hocanın, kripto paralar için yazdığı al-sat sinyalleri üreten ALFA TREND isimli indikatörünü, BIST 30 endeksinde yer alan hisse senetlerini gösterecek şekilde düzenledim ve Türkçeye çevirdim. Grafikte sağ tarafta, bu hisse senetlerine ait al-sat durumları da gösterilmektedir. TradingView’de Pine Editörü’ne ekleyerek kullanmak isteyenler için uygun hale getirilmiştir.
Trading View Alfa Trend Tarayıcı Pine Script Kodu
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // Kıvanç Özbilgiç hocanın alpha trend indikatörü üzerinde türkçeleştirme ve BIST20 hisselerini gösterecek şekilde editlenmiştir. //@version=6 indicator('Alfa Trend Tarayıcı', overlay = true, format = format.price, precision = 2) // --- ALPHATREND Ayarları --- src = input.source(title = 'Kaynak', defval = close, group = 'ALPHATREND') AP = input.int(title = 'Uzunluk', defval = 14, group = 'ALPHATREND') coeff = input.float(title = 'Çarpan', defval = 1.0, step = 0.1, group = 'ALPHATREND') novolumedata = input.bool(title = 'Değişim Hesaplaması (Hacim Verisi Yok)', defval = false, group = 'ALPHATREND') showsignalsk = input.bool(title = 'Sinyalleri göster', defval = true, group = 'ALPHATREND') // ATR ve alt/üst çizgiler ATR = ta.sma(ta.tr, AP) upT = low - ATR * coeff downT = high + ATR * coeff // AlphaTrend hesaplama (düzgün karşılaştırmalarla) var float AlphaTrend = na use_up = novolumedata ? ta.rsi(src, AP) >= 50 : ta.mfi(hlc3, AP) >= 50 AlphaTrend := use_up ? upT < nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : upT : downT > nz(AlphaTrend[1]) ? nz(AlphaTrend[1]) : downT // Renk, tetikleyici ve sinyaller color1 = AlphaTrend > AlphaTrend[2] ? #00E60F : AlphaTrend < AlphaTrend[2] ? #80000B : AlphaTrend[1] > AlphaTrend[3] ? #00E60F : #80000B buySignalk = ta.crossover(AlphaTrend, AlphaTrend[2]) sellSignalk = ta.crossunder(AlphaTrend, AlphaTrend[2]) K1 = ta.barssince(buySignalk) K2 = ta.barssince(sellSignalk) O1 = ta.barssince(buySignalk[1]) O2 = ta.barssince(sellSignalk[1]) // Yön değişkeni (1 = al, -1 = sat, 0 = nötr) var int direction = 0 direction := buySignalk and O1 > K2 ? 1 : sellSignalk and O2 > K1 ? -1 : direction[1] // Plotlar k1 = plot(AlphaTrend, title = 'AlfaTrend', color = color.green, linewidth = 3) k2 = plot(AlphaTrend[2], title = 'Tetikleyici', color = color.red, linewidth = 3) fill(k1, k2, title = 'Doldurma Rengi', color = color1) // Sinyal şekilleri plotshape(showsignalsk and buySignalk and O1 > K2 ? AlphaTrend[2] * 0.9999 : na, title = 'AL', text = 'AL', location = location.absolute, style = shape.labelup, size = size.tiny, color = color.green, textcolor = color.white) plotshape(showsignalsk and sellSignalk and O2 > K1 ? AlphaTrend[2] * 1.0001 : na, title = 'SAT', text = 'SAT', location = location.absolute, style = shape.labeldown, size = size.tiny, color = color.red, textcolor = color.white) // --- Tarayıcı ve Etiket Ayarları --- string gr_sc = 'Tarayıcı' string gr_sy = 'Sembol' string t00 = 'Alfa Trend Tarayıcı' color c00 = #686868 lb_sh = input.bool(title = 'Etiketleri Göster', defval = true, group = gr_sc) lb_xa = input.int(title = 'Yatay Eksen', defval = 20, group = gr_sc, tooltip = 'Etiket Pozisyonu X Ekseninde') lb_ya = input.int(title = 'Dikey Eksen', defval = 1, group = gr_sc, tooltip = 'Etiket Pozisyonu Y Ekseninde') lb_sz = input.string(title = 'Etiketlerin Boyutu', options = ['Otomatik', 'Small', 'Normal', 'Large'], defval = 'Normal', group = gr_sc) lb_cl = input.color(title = 'Renkler', defval = #00bb00, group = gr_sc, inline = '0') lb_cs = input.color(title = '', defval = #ff0000, group = gr_sc, inline = '0') // Hisseler (20 adet, varsayılan BIST örnekleri) sh01 = input.bool(title = '01', defval = true, group = gr_sy, inline = '01') sh02 = input.bool(title = '02', defval = true, group = gr_sy, inline = '02') sh03 = input.bool(title = '03', defval = true, group = gr_sy, inline = '03') sh04 = input.bool(title = '04', defval = true, group = gr_sy, inline = '04') sh05 = input.bool(title = '05', defval = true, group = gr_sy, inline = '05') sh06 = input.bool(title = '06', defval = true, group = gr_sy, inline = '06') sh07 = input.bool(title = '07', defval = true, group = gr_sy, inline = '07') sh08 = input.bool(title = '08', defval = true, group = gr_sy, inline = '08') sh09 = input.bool(title = '09', defval = true, group = gr_sy, inline = '09') sh10 = input.bool(title = '10', defval = true, group = gr_sy, inline = '10') sh11 = input.bool(title = '11', defval = false, group = gr_sy, inline = '11') sh12 = input.bool(title = '12', defval = false, group = gr_sy, inline = '12') sh13 = input.bool(title = '13', defval = false, group = gr_sy, inline = '13') sh14 = input.bool(title = '14', defval = false, group = gr_sy, inline = '14') sh15 = input.bool(title = '15', defval = false, group = gr_sy, inline = '15') sh16 = input.bool(title = '16', defval = false, group = gr_sy, inline = '16') sh17 = input.bool(title = '17', defval = false, group = gr_sy, inline = '17') sh18 = input.bool(title = '18', defval = false, group = gr_sy, inline = '18') sh19 = input.bool(title = '19', defval = false, group = gr_sy, inline = '19') sh20 = input.bool(title = '20', defval = false, group = gr_sy, inline = '20') tf01 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '01') tf02 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '02') tf03 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '03') tf04 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '04') tf05 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '05') tf06 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '06') tf07 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '07') tf08 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '08') tf09 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '09') tf10 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '10') tf11 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '11') tf12 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '12') tf13 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '13') tf14 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '14') tf15 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '15') tf16 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '16') tf17 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '17') tf18 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '18') tf19 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '19') tf20 = input.timeframe(title = '', defval = '', group = gr_sy, inline = '20') s01 = input.symbol(title = '', group = gr_sy, inline = '01', defval = 'BIST:THYAO') s02 = input.symbol(title = '', group = gr_sy, inline = '02', defval = 'BIST:ISCTR') s03 = input.symbol(title = '', group = gr_sy, inline = '03', defval = 'BIST:EREGL') s04 = input.symbol(title = '', group = gr_sy, inline = '04', defval = 'BIST:YKBNK') s05 = input.symbol(title = '', group = gr_sy, inline = '05', defval = 'BIST:AKBNK') s06 = input.symbol(title = '', group = gr_sy, inline = '06', defval = 'BIST:TUPRS') s07 = input.symbol(title = '', group = gr_sy, inline = '07', defval = 'BIST:KCHOL') s08 = input.symbol(title = '', group = gr_sy, inline = '08', defval = 'BIST:GARAN') s09 = input.symbol(title = '', group = gr_sy, inline = '09', defval = 'BIST:EKGYO') s10 = input.symbol(title = '', group = gr_sy, inline = '10', defval = 'BIST:ASELS') s11 = input.symbol(title = '', group = gr_sy, inline = '11', defval = 'BIST:SASA') s12 = input.symbol(title = '', group = gr_sy, inline = '12', defval = 'BIST:TCELL') s13 = input.symbol(title = '', group = gr_sy, inline = '13', defval = 'BIST:PGSUS') s14 = input.symbol(title = '', group = gr_sy, inline = '14', defval = 'BIST:BIMAS') s15 = input.symbol(title = '', group = gr_sy, inline = '15', defval = 'BIST:SISE') s16 = input.symbol(title = '', group = gr_sy, inline = '16', defval = 'BIST:PETKM') s17 = input.symbol(title = '', group = gr_sy, inline = '17', defval = 'BIST:ASTOR') s18 = input.symbol(title = '', group = gr_sy, inline = '18', defval = 'BIST:GUBRF') s19 = input.symbol(title = '', group = gr_sy, inline = '19', defval = 'BIST:KRDMD') s20 = input.symbol(title = '', group = gr_sy, inline = '20', defval = 'BIST:TOASO') // --- Fonksiyonlar --- f_screener(s) => int x = na int y = na color z = na if s x := direction y := ta.barssince(x != x[1]) z := x == 1 ? lb_cl : x == -1 ? lb_cs : c00 z [x, y, z] f_bars(x) => ' [' + str.tostring(x) + '] ' f_size(x) => x == 'Otomatik' ? size.auto : x == 'Small' ? size.small : x == 'Normal' ? size.normal : x == 'Large' ? size.large : size.auto // Label yönetimi için array kullanarak var label_array = array.new<label>(21, na) f_label(index, t, c) => var bool result = false if lb_sh // Eski label'ı sil current_label = array.get(label_array, index) if not na(current_label) label.delete(current_label) // Y pozisyonu hesaplama fix_allign = ta.highest(high, 200) y_pos = bar_index > 200 ? fix_allign * (1 + lb_ya / 1000) : hl2 * (1 + lb_ya / 1000) // Yeni label oluştur new_label = label.new(x = bar_index + lb_xa, y = y_pos + index * y_pos * 0.03, text = t, textcolor = c, textalign = text.align_right, style = label.style_label_left, size = f_size(lb_sz), color = color.new(color.white, 100)) // Her label için farklı Y pozisyonu text=t, textcolor=c, textalign=text.align_right, style=label.style_label_left, size=f_size(lb_sz), color=color.new(color.white, 100)) // Yeni label'ı array'e kaydet array.set(label_array, index, new_label) result := true result else result := false result result // --- Security ile tarama (her sembol için) --- [a01, b01, c01] = request.security(s01, tf01 == '' ? timeframe.period : tf01, f_screener(sh01)) [a02, b02, c02] = request.security(s02, tf02 == '' ? timeframe.period : tf02, f_screener(sh02)) [a03, b03, c03] = request.security(s03, tf03 == '' ? timeframe.period : tf03, f_screener(sh03)) [a04, b04, c04] = request.security(s04, tf04 == '' ? timeframe.period : tf04, f_screener(sh04)) [a05, b05, c05] = request.security(s05, tf05 == '' ? timeframe.period : tf05, f_screener(sh05)) [a06, b06, c06] = request.security(s06, tf06 == '' ? timeframe.period : tf06, f_screener(sh06)) [a07, b07, c07] = request.security(s07, tf07 == '' ? timeframe.period : tf07, f_screener(sh07)) [a08, b08, c08] = request.security(s08, tf08 == '' ? timeframe.period : tf08, f_screener(sh08)) [a09, b09, c09] = request.security(s09, tf09 == '' ? timeframe.period : tf09, f_screener(sh09)) [a10, b10, c10] = request.security(s10, tf10 == '' ? timeframe.period : tf10, f_screener(sh10)) [a11, b11, c11] = request.security(s11, tf11 == '' ? timeframe.period : tf11, f_screener(sh11)) [a12, b12, c12] = request.security(s12, tf12 == '' ? timeframe.period : tf12, f_screener(sh12)) [a13, b13, c13] = request.security(s13, tf13 == '' ? timeframe.period : tf13, f_screener(sh13)) [a14, b14, c14] = request.security(s14, tf14 == '' ? timeframe.period : tf14, f_screener(sh14)) [a15, b15, c15] = request.security(s15, tf15 == '' ? timeframe.period : tf15, f_screener(sh15)) [a16, b16, c16] = request.security(s16, tf16 == '' ? timeframe.period : tf16, f_screener(sh16)) [a17, b17, c17] = request.security(s17, tf17 == '' ? timeframe.period : tf17, f_screener(sh17)) [a18, b18, c18] = request.security(s18, tf18 == '' ? timeframe.period : tf18, f_screener(sh18)) [a19, b19, c19] = request.security(s19, tf19 == '' ? timeframe.period : tf19, f_screener(sh19)) [a20, b20, c20] = request.security(s20, tf20 == '' ? timeframe.period : tf20, f_screener(sh20)) // Metin oluşturmalar (sadece aktif hisseler için) t01 = sh01 ? a01 == 1 ? '▲' + f_bars(b01) + s01 : a01 == -1 ? '▼' + f_bars(b01) + s01 : '■' + f_bars(b01) + s01 : '' t02 = sh02 ? a02 == 1 ? '▲' + f_bars(b02) + s02 : a02 == -1 ? '▼' + f_bars(b02) + s02 : '■' + f_bars(b02) + s02 : '' t03 = sh03 ? a03 == 1 ? '▲' + f_bars(b03) + s03 : a03 == -1 ? '▼' + f_bars(b03) + s03 : '■' + f_bars(b03) + s03 : '' t04 = sh04 ? a04 == 1 ? '▲' + f_bars(b04) + s04 : a04 == -1 ? '▼' + f_bars(b04) + s04 : '■' + f_bars(b04) + s04 : '' t05 = sh05 ? a05 == 1 ? '▲' + f_bars(b05) + s05 : a05 == -1 ? '▼' + f_bars(b05) + s05 : '■' + f_bars(b05) + s05 : '' t06 = sh06 ? a06 == 1 ? '▲' + f_bars(b06) + s06 : a06 == -1 ? '▼' + f_bars(b06) + s06 : '■' + f_bars(b06) + s06 : '' t07 = sh07 ? a07 == 1 ? '▲' + f_bars(b07) + s07 : a07 == -1 ? '▼' + f_bars(b07) + s07 : '■' + f_bars(b07) + s07 : '' t08 = sh08 ? a08 == 1 ? '▲' + f_bars(b08) + s08 : a08 == -1 ? '▼' + f_bars(b08) + s08 : '■' + f_bars(b08) + s08 : '' t09 = sh09 ? a09 == 1 ? '▲' + f_bars(b09) + s09 : a09 == -1 ? '▼' + f_bars(b09) + s09 : '■' + f_bars(b09) + s09 : '' t10 = sh10 ? a10 == 1 ? '▲' + f_bars(b10) + s10 : a10 == -1 ? '▼' + f_bars(b10) + s10 : '■' + f_bars(b10) + s10 : '' t11 = sh11 ? a11 == 1 ? '▲' + f_bars(b11) + s11 : a11 == -1 ? '▼' + f_bars(b11) + s11 : '■' + f_bars(b11) + s11 : '' t12 = sh12 ? a12 == 1 ? '▲' + f_bars(b12) + s12 : a12 == -1 ? '▼' + f_bars(b12) + s12 : '■' + f_bars(b12) + s12 : '' t13 = sh13 ? a13 == 1 ? '▲' + f_bars(b13) + s13 : a13 == -1 ? '▼' + f_bars(b13) + s13 : '■' + f_bars(b13) + s13 : '' t14 = sh14 ? a14 == 1 ? '▲' + f_bars(b14) + s14 : a14 == -1 ? '▼' + f_bars(b14) + s14 : '■' + f_bars(b14) + s14 : '' t15 = sh15 ? a15 == 1 ? '▲' + f_bars(b15) + s15 : a15 == -1 ? '▼' + f_bars(b15) + s15 : '■' + f_bars(b15) + s15 : '' t16 = sh16 ? a16 == 1 ? '▲' + f_bars(b16) + s16 : a16 == -1 ? '▼' + f_bars(b16) + s16 : '■' + f_bars(b16) + s16 : '' t17 = sh17 ? a17 == 1 ? '▲' + f_bars(b17) + s17 : a17 == -1 ? '▼' + f_bars(b17) + s17 : '■' + f_bars(b17) + s17 : '' t18 = sh18 ? a18 == 1 ? '▲' + f_bars(b18) + s18 : a18 == -1 ? '▼' + f_bars(b18) + s18 : '■' + f_bars(b18) + s18 : '' t19 = sh19 ? a19 == 1 ? '▲' + f_bars(b19) + s19 : a19 == -1 ? '▼' + f_bars(b19) + s19 : '■' + f_bars(b19) + s19 : '' t20 = sh20 ? a20 == 1 ? '▲' + f_bars(b20) + s20 : a20 == -1 ? '▼' + f_bars(b20) + s20 : '■' + f_bars(b20) + s20 : '' // Etiketleri ekle if lb_sh f_label(0, t00, c00) if t01 != '' f_label(1, t01, c01) if t02 != '' f_label(2, t02, c02) if t03 != '' f_label(3, t03, c03) if t04 != '' f_label(4, t04, c04) if t05 != '' f_label(5, t05, c05) if t06 != '' f_label(6, t06, c06) if t07 != '' f_label(7, t07, c07) if t08 != '' f_label(8, t08, c08) if t09 != '' f_label(9, t09, c09) if t10 != '' f_label(10, t10, c10) if t11 != '' f_label(11, t11, c11) if t12 != '' f_label(12, t12, c12) if t13 != '' f_label(13, t13, c13) if t14 != '' f_label(14, t14, c14) if t15 != '' f_label(15, t15, c15) if t16 != '' f_label(16, t16, c16) if t17 != '' f_label(17, t17, c17) if t18 != '' f_label(18, t18, c18) if t19 != '' f_label(19, t19, c19) if t20 != '' f_label(20, t20, c20)
Son Yorumlar