PHP Code:
//@version=6
indicator("SİSTEM: 6'LI DÜĞÜM (Nükleer Sıkışma)", overlay=false)
// ==========================================
// 1. HAM VERİLER (6 ÇİZGİ)
// ==========================================
s1 = ta.sar(0.08, 0.05, 0.2)
s2 = ta.sar(0.01, 0.05, 0.2)
s3 = ta.sar(0.04, 0.04, 0.2)
f_mirror(_sar, _len) =>
float _delta = math.abs(close - _sar)
float _raw = close > _sar ? close + _delta : close - _delta
ta.linreg(_raw, _len, 0)
m1 = f_mirror(s1, 9)
m2 = f_mirror(s2, 21)
m3 = f_mirror(s3, 55)
// ==========================================
// 2. DÜĞÜM MATEMATİĞİ (SPREAD ANALİZİ)
// ==========================================
// 6 çizginin oluşturduğu kanalın genişliğini buluyoruz.
float en_tepe = math.max(s1, s2, s3, m1, m2, m3)
float en_dip = math.min(s1, s2, s3, m1, m2, m3)
float spread = en_tepe - en_dip // Kanal Genişliği (TL/Dolar cinsinden)
// Bu genişliği "normalize" etmemiz lazım.
// Yani: "Şu anki genişlik, son 100 barın en dar hali mi?"
int periyot = 100
float max_spread_hist = ta.highest(spread, periyot)
float min_spread_hist = ta.lowest(spread, periyot)
// ==========================================
// 3. NÜKLEER SKOR (0 - 100)
// ==========================================
// Skor 100 ise: Tarihin en dar sıkışması (Tam Düğüm)
// Skor 0 ise: Tarihin en geniş hali (Saçılma)
// Formülü ters çeviriyoruz ki 100 = SIKIŞMA olsun.
float knot_score = 0.0
float range_diff = max_spread_hist - min_spread_hist
if range_diff != 0
// (Mevcut - Min) / (Max - Min) bize 0-1 arası genişlik verir.
// Biz darlığı (sıkışmayı) aradığımız için "1 - ..." yapıyoruz.
knot_score := (1 - ((spread - min_spread_hist) / range_diff)) * 100
// Gürültüyü al (WMA)
float smooth_knot = ta.wma(knot_score, 5)
// ==========================================
// 4. SİNYAL MANTIĞI
// ==========================================
// Eşik Değerler
int limit_nukleer = 90 // %90 ve üzeri sıkışma (Kırmızı Alarm)
int limit_patlama = 85 // Sıkışmadan çıkış anı
// SIKIŞMA (Hazırlık Evresi)
bool is_squeezing = smooth_knot > limit_nukleer
// PATLAMA (Ateşleme Evresi)
// Skor daha önce 90'ı geçmişti, şimdi 85'in altına düşüyor (Bant açılıyor).
bool is_exploding = smooth_knot[1] > limit_nukleer and smooth_knot < limit_nukleer
// YÖN TAYİNİ (Patlama nereye?)
// Fiyat, Düğümün (Ortalamanın) üstünde mi altında mı?
float dugum_merkezi = (en_tepe + en_dip) / 2
bool yon_yukari = close > dugum_merkezi
bool yon_asagi = close < dugum_merkezi
// ==========================================
// 5. GÖRSELLEŞTİRME
// ==========================================
// Arka plan çizgileri
hline(90, "Nükleer Sınır", color=color.red, linestyle=hline.style_dashed)
hline(50, "Normal", color=color.gray, linestyle=hline.style_dotted)
// Skor Çizgisi
// 90 üstü (Nükleer) ise Kırmızı, Normal ise Gri
color col_line = smooth_knot > limit_nukleer ? color.red : (smooth_knot > 50 ? color.orange : color.gray)
plot(smooth_knot, "Düğüm Skoru", color=col_line, linewidth=2)
// Alan Boyama (Nükleer Bölge)
// Sadece 90 üstünü boya
plot(smooth_knot > limit_nukleer ? smooth_knot : na, "Nükleer Alan", color=color.new(color.red, 50), style=plot.style_area, offset=0)
// Sinyaller
// Patlama anında Yön Okları
plotshape(is_exploding and yon_yukari, "YUKARI PATLAMA", shape.triangleup, location.bottom, color=color.lime, size=size.small, text="PATLAMA\n(AL)")
plotshape(is_exploding and yon_asagi, "AŞAĞI PATLAMA", shape.triangledown, location.bottom, color=color.maroon, size=size.small, text="PATLAMA\n(SAT)")
// ==========================================
// 6. DASHBOARD (SABİT WIDGET)
// ==========================================
var table panel = table.new(position.middle_right, 2, 4, bgcolor=color.new(color.black, 40), frame_color=color.gray, border_width=1)
if barstate.islast
// Durum Analizi
string durum_txt = "NORMAL"
color durum_col = color.gray
if smooth_knot >= 95
durum_txt := "KRİTİK! (%95+)"
durum_col := color.red // Yanıp sönen kırmızı etkisi
else if smooth_knot >= 90
durum_txt := "NÜKLEER SIKIŞMA"
durum_col := color.orange
else if is_exploding
durum_txt := "PATLAMA BAŞLADI"
durum_col := yon_yukari ? color.lime : color.maroon
else if smooth_knot < 20
durum_txt := "DAĞINIK (Trend)"
durum_col := color.blue
// Başlık
table.cell(panel, 0, 0, "6'LI DÜĞÜM", text_color=color.white, bgcolor=color.new(color.gray, 20), text_size=size.small)
table.merge_cells(panel, 0, 0, 1, 0)
// Sıkışma Puanı
table.cell(panel, 0, 1, "SIKIŞMA PUANI", text_color=color.white, text_size=size.small, text_halign=text.align_left)
table.cell(panel, 1, 1, str.tostring(math.round(smooth_knot)) + " / 100", text_color=durum_col, text_size=size.small, text_halign=text.align_right)
// Düğüm Genişliği
table.cell(panel, 0, 2, "BANT ARALIĞI", text_color=color.gray, text_size=size.small, text_halign=text.align_left)
table.cell(panel, 1, 2, str.tostring(spread, format.mintick), text_color=color.white, text_size=size.small, text_halign=text.align_right)
// Tahmini Yön (Sadece Sıkışma Varsa Göster)
string yon_txt = "BELİRSİZ"
color yon_col = color.gray
if smooth_knot > 80
yon_txt := yon_yukari ? "YUKARI ?" : "AŞAĞI ?"
yon_col := yon_yukari ? color.green : color.red
table.cell(panel, 0, 3, "TAHMİNİ YÖN", text_color=color.white, text_size=size.small, text_halign=text.align_left)
table.cell(panel, 1, 3, yon_txt, text_color=yon_col, text_size=size.small, text_halign=text.align_right)
Yer İmleri