//@version=5
indicator('COMPOSITE RSI + NORMAL RSI', overlay=false)
// User inputs
rsi_len = input.int(14, 'RSI Period', minval=1)
rsi_source = input(close, 'RSI Source')
// RSI seviyeleri için input
rsi_overbought = input.int(70, 'RSI Overbought Level', minval=1, maxval=100)
rsi_oversold = input.int(30, 'RSI Oversold Level', minval=1, maxval=100)
// Show/hide RSI lines
show_composite_rsi = input.bool(true, "Show Composite RSI", group="RSI Lines")
show_normal_rsi = input.bool(true, "Show Normal RSI", group="RSI Lines")
// Composite RSI hesaplama
// Get the daily close of the symbol and the XU100 index
current_close = request.security(syminfo.tickerid, 'D', rsi_source, lookahead=barmerge.lookahead_on)
xu100 = request.security('BIST:XU100', 'D', close, lookahead=barmerge.lookahead_on)
// Calculate the ratio (symbol close / XU100 close)
ratio = current_close / xu100
// Calculate Composite RSI of the ratio
composite_rsi = ta.rsi(ratio, rsi_len)
// Calculate Normal RSI
normal_rsi = ta.rsi(rsi_source, rsi_len)
// RSI sinyal koşulları - Composite RSI
composite_oversold = composite_rsi < rsi_oversold
composite_overbought = composite_rsi > rsi_overbought
composite_mid = composite_rsi >= 50
// RSI sinyal koşulları - Normal RSI
normal_oversold = normal_rsi < rsi_oversold
normal_overbought = normal_rsi > rsi_overbought
normal_mid = normal_rsi >= 50
// *** COMPOSITE RSI ALARM KONTROLLERİ ***
composite_cross_above_oversold = ta.crossover(composite_rsi, rsi_oversold)
alertcondition(composite_cross_above_oversold, "Composite RSI Oversold Üzerine Çıktı", "Composite RSI oversold seviyesi üzerine çıktı")
composite_cross_above_overbought = ta.crossover(composite_rsi, rsi_overbought)
alertcondition(composite_cross_above_overbought, "Composite RSI Overbought Üzerinde", "Composite RSI overbought seviyesini aştı")
composite_cross_below_oversold = ta.crossunder(composite_rsi, rsi_oversold)
alertcondition(composite_cross_below_oversold, "Composite RSI Oversold Altına Düştü", "Composite RSI oversold seviyesi altına düştü")
composite_cross_below_overbought = ta.crossunder(composite_rsi, rsi_overbought)
alertcondition(composite_cross_below_overbought, "Composite RSI Overbought Altına Düştü", "Composite RSI overbought seviyesi altına düştü")
composite_cross_above_50 = ta.crossover(composite_rsi, 50)
alertcondition(composite_cross_above_50, "Composite RSI 50 Üzerine Çıktı", "Composite RSI 50 seviyesi üzerine çıktı")
composite_cross_below_50 = ta.crossunder(composite_rsi, 50)
alertcondition(composite_cross_below_50, "Composite RSI 50 Altına Düştü", "Composite RSI 50 seviyesi altına düştü")
// *** NORMAL RSI ALARM KONTROLLERİ ***
normal_cross_above_oversold = ta.crossover(normal_rsi, rsi_oversold)
alertcondition(normal_cross_above_oversold, "Normal RSI Oversold Üzerine Çıktı", "Normal RSI oversold seviyesi üzerine çıktı")
normal_cross_above_overbought = ta.crossover(normal_rsi, rsi_overbought)
alertcondition(normal_cross_above_overbought, "Normal RSI Overbought Üzerinde", "Normal RSI overbought seviyesini aştı")
normal_cross_below_oversold = ta.crossunder(normal_rsi, rsi_oversold)
alertcondition(normal_cross_below_oversold, "Normal RSI Oversold Altına Düştü", "Normal RSI oversold seviyesi altına düştü")
normal_cross_below_overbought = ta.crossunder(normal_rsi, rsi_overbought)
alertcondition(normal_cross_below_overbought, "Normal RSI Overbought Altına Düştü", "Normal RSI overbought seviyesi altına düştü")
normal_cross_above_50 = ta.crossover(normal_rsi, 50)
alertcondition(normal_cross_above_50, "Normal RSI 50 Üzerine Çıktı", "Normal RSI 50 seviyesi üzerine çıktı")
normal_cross_below_50 = ta.crossunder(normal_rsi, 50)
alertcondition(normal_cross_below_50, "Normal RSI 50 Altına Düştü", "Normal RSI 50 seviyesi altına düştü")
// *** RSI GÖRSELLEŞTİRME ***
// Composite RSI çizgisi
plot(show_composite_rsi ? composite_rsi : na, "Composite RSI", color=color.new(color.blue, 0), linewidth=2)
// Normal RSI çizgisi
plot(show_normal_rsi ? normal_rsi : na, "Normal RSI", color=color.new(color.black, 0), linewidth=2)
// RSI seviyelerini çiz
hline(rsi_overbought, "Overbought", color=color.new(color.red, 30), linestyle=hline.style_dashed,linewidth=2)
hline(rsi_oversold, "Oversold", color=color.new(color.green, 30), linestyle=hline.style_dashed,linewidth=2)
hline(50, "Mid Line", color=color.new(color.gray, 30), linestyle=hline.style_dotted,linewidth=2)
// RSI seviye etiketleri için label'lar oluştur
var label overbought_label = label.new(
x=na, y=na,
text="Overbought (" + str.tostring(rsi_overbought) + ")",
xloc=xloc.bar_index,
yloc=yloc.price,
style=label.style_label_center,
color=color.new(color.red, 70),
textcolor=color.white,
size=size.small)
var label oversold_label = label.new(
x=na, y=na,
text="Oversold (" + str.tostring(rsi_oversold) + ")",
xloc=xloc.bar_index,
yloc=yloc.price,
style=label.style_label_center,
color=color.new(color.green, 70),
textcolor=color.white,
size=size.small)
var label mid_label = label.new(
x=na, y=na,
text="50",
xloc=xloc.bar_index,
yloc=yloc.price,
style=label.style_label_center,
color=color.new(color.gray, 70),
textcolor=color.white,
size=size.small)
// Seviye label'larını güncelle
if barstate.islast
// Overbought label
label.set_xy(overbought_label, bar_index, rsi_overbought)
// Oversold label
label.set_xy(oversold_label, bar_index, rsi_oversold)
// 50 label
label.set_xy(mid_label, bar_index, 50)
// RSI değerlerini gösteren label'lar
var label composite_rsi_label = label.new(
x=na, y=na,
text="",
xloc=xloc.bar_index,
yloc=yloc.price,
style=label.style_label_left,
color=color.new(color.blue, 60),
textcolor=color.white,
size=size.small)
var label normal_rsi_label = label.new(
x=na, y=na,
text="",
xloc=xloc.bar_index,
yloc=yloc.price,
style=label.style_label_left,
color=color.new(color.black, 60),
textcolor=color.white,
size=size.small)
// Update RSI label'ları on each bar
if barstate.islast
// Composite RSI label
if show_composite_rsi
label.set_xy(composite_rsi_label, bar_index, composite_rsi)
composite_status = ""
if composite_overbought
composite_status := " - AŞIRI ALIM"
else if composite_oversold
composite_status := " - AŞIRI SATIM"
else if composite_mid
composite_status := " - YÜKSELİŞ"
else
composite_status := " - DÜŞÜŞ"
label.set_text(composite_rsi_label, 'Comp RSI: ' + str.tostring(composite_rsi, "#.##") + composite_status)
else
label.delete(composite_rsi_label)
// Normal RSI label
if show_normal_rsi
label.set_xy(normal_rsi_label, bar_index, normal_rsi)
normal_status = ""
if normal_overbought
normal_status := " - AŞIRI ALIM"
else if normal_oversold
normal_status := " - AŞIRI SATIM"
else if normal_mid
normal_status := " - YÜKSELİŞ"
else
normal_status := " - DÜŞÜŞ"
label.set_text(normal_rsi_label, 'Normal RSI: ' + str.tostring(normal_rsi, "#.##") + normal_status)
else
label.delete(normal_rsi_label)
// Fark hesaplama (Composite - Normal)
rsi_diff = composite_rsi - normal_rsi
var label diff_label = label.new(
x=na, y=na,
text="",
xloc=xloc.bar_index,
yloc=yloc.price,
style=label.style_label_left,
color=color.new(color.purple, 60),
textcolor=color.white,
size=size.small)
if barstate.islast and show_composite_rsi and show_normal_rsi
// math.min fonksiyonunu kullan
min_rsi_value = math.min(composite_rsi, normal_rsi)
label.set_xy(diff_label, bar_index, min_rsi_value - 5)
diff_text = "Fark: " + str.tostring(rsi_diff, "#.##")
if rsi_diff > 0
diff_text := diff_text + " (Comp > Normal)"
else if rsi_diff < 0
diff_text := diff_text + " (Normal > Comp)"
else
diff_text := diff_text + " (Eşit)"
label.set_text(diff_label, diff_text)
else
label.delete(diff_label)
// Oversold ve overbought bölgelerini vurgula
bgcolor(composite_oversold and show_composite_rsi ? color.new(color.green, 80) : normal_oversold and show_normal_rsi ? color.new(color.green, 50) : na)
bgcolor(composite_overbought and show_composite_rsi ? color.new(color.red, 80) : normal_overbought and show_normal_rsi ? color.new(color.red, 50) : na)
Bu kod TradingView için yazılmış COMPOSITE RSI + NORMAL RSI adlı bir Pine Script indikatörüdür. İşlevleri şunlardır:
Normal RSI'ye ek olarak, "Composite RSI" adında özel bir RSI hesaplar. Bu Composite RSI, hisse senedinin BIST 100 endeksi (XU100) ile göreceli performansını ölçer.
Normal RSI: Klasik RSI göstergesi (hissenin kendi fiyat hareketlerine dayalı)
Composite RSI: Hisse fiyatının BIST 100 endeksine oranının RSI'sı
Composite RSI = RSI(Hisse Fiyatı / XU100 Endeksi)
Her iki RSI çizgisini aynı grafikte gösterme
Overbought (70), oversold (30) ve 50 seviyeleri
Renkli arka plan vurgulamaları
Composite RSI için:
Oversold/Overbought seviyelerinden çıkış/dalış
50 seviyesini geçişler
Normal RSI için:
Aynı alarm seti
Anlık RSI değerlerini gösteren etiketler
"Aşırı Alım", "Aşırı Satım", "Yükseliş", "Düşüş" durum belirteçleri
İki RSI arasındaki farkı gösteren etiket
Composite RSI, hissenin endekse göre göreceli performansını gösterir:
Composite RSI > 50: Hisse endeksten daha güçlü
Composite RSI < 50: Hisse endeksten daha zayıf
Normal ve Composite RSI arasındaki farktan:
Normal RSI yüksek ama Composite RSI düşükse: Hisse kendi içinde güçlü ama endekse göre zayıf
Tersiyse: Endekse göre güçlü ama kendi içinde zayıf
Aşırı satım bölgesi + Composite RSI > 50: Güçlü alım sinyali
Aşırı alım bölgesi + Composite RSI < 50: Güçlü satım sinyali
Sektör rotasyonu: Hangi sektörlerin endeksten daha güçlü olduğunu tespit
Market timing: Piyasa koşullarına uygun hisse seçimi
Diverjans analizi: Fiyat ve göreceli güç arasındaki uyumsuzlukları tespit
Risk yönetimi: Endekse göre zayıf hisseleri belirleme
Özetle: Bu indikatör, hisseleri sadece kendi fiyat hareketlerine göre değil, aynı zamanda piyasa performansına göre de değerlendirmenizi sağlayan gelişmiş bir RSI analiz aracıdır.