PHP Code:
//@version=6
indicator(":]", overlay=true, max_lines_count=50, max_labels_count=500)
// ==========================================
// 1. AYARLAR
// ==========================================
float ayar_genislik = input.float(1.0, "Ana Atmosfer Çarpanı", minval=0.1, maxval=2.0, step=0.1)
// ==========================================
// 2. MOTOR BLOKLARI (PARAMETRELER)
// ==========================================
float s_slow_1 = ta.sar(0.02, 0.02, 0.2)
float s_slow_2 = ta.sar(0.015, 0.015, 0.15)
float s_slow_3 = ta.sar(0.01, 0.01, 0.1)
float s_fast_1 = ta.sar(0.08, 0.05, 0.2)
float s_fast_2 = ta.sar(0.01, 0.05, 0.2)
float s_fast_3 = ta.sar(0.04, 0.04, 0.2)
float avg_fast = (s_fast_1 + s_fast_2 + s_fast_3) / 3
// ==========================================
// 3. YAPAY ZEKA (DL) MODÜLÜ (ATMOSFER ESNEKLİĞİ)
// ==========================================
tanh_fn(v) => (1 - math.exp(-2 * v)) / (1 + math.exp(-2 * v))
td_fn(s) => nz((s - nz(s[1])) / nz(s[1]))
var w_c = array.from(22.4271, -26.6917, 4.9371, 9.0349, -10.6929, -38.2880, 10.0500, -44.7063, -17.8163, 30.5662, -33.9954, 14.5017, -43.2865, -13.3874, 24.7080, -14.3929, 28.4830, -22.9793, -7.6582, -5.6505, 28.8379, -26.3544, 0.5206, 25.0049, -17.8832, -4.8113, -4.0364, -8.3327, -1.1571, 0.4667, -22.0533, 3.6525, -4.3904, 2.1030, 20.0272, 11.5101, -0.4150)
n_in = array.from(tanh_fn(td_fn(open)), tanh_fn(td_fn(high)), tanh_fn(td_fn(low)), tanh_fn(td_fn(close)))
f_calc_dl(n_arr, w_arr) =>
float out = 0.0
for i = 0 to 5
float s = 0.0
for j = 0 to 3
s += array.get(n_arr, j) * array.get(w_arr, (i * 5) + j)
out += tanh_fn(s + array.get(w_arr, (i * 5) + 4)) * array.get(w_arr, 30 + i)
tanh_fn(out + array.get(w_arr, 36))
float dl_val = f_calc_dl(n_in, w_c)
// Temel AI katsayısı
float ai_factor = (0.2 + (math.abs(dl_val) * 0.5)) * ayar_genislik
// ==========================================
// 4. DİNAMİK RENKLİ ATMOSFER (3 KADEMELİ NİŞANGAH)
// ==========================================
bool all_fast_below = (close > s_fast_1) and (close > s_fast_2) and (close > s_fast_3)
bool all_fast_above = (close < s_fast_1) and (close < s_fast_2) and (close < s_fast_3)
// Ana Renk
color base_color = all_fast_below ? color.green : all_fast_above ? color.maroon : color.yellow
// Sadece s_fast_1'i kullanarak temel mesafeyi (dist_base) buluyoruz
float dist_base = math.abs(close - s_fast_1) * ai_factor
// Senin Oranların: 0.5 (Vurkaç), 1.0 (Trend), 2.0 (Swing)
float dist_vurkac = dist_base * 0.5
float dist_trend = dist_base * 1.0
float dist_swing = dist_base * 2.0
// Çizgilerin Hazırlanması
p_swing_top = plot(close + dist_swing, display=display.none)
p_swing_bot = plot(close - dist_swing, display=display.none)
p_trend_top = plot(close + dist_trend, display=display.none)
p_trend_bot = plot(close - dist_trend, display=display.none)
p_vurkac_top = plot(close + dist_vurkac, display=display.none)
p_vurkac_bot = plot(close - dist_vurkac, display=display.none)
// En dıştan (şeffaf) en içe (koyu) doğru boyama yapıyoruz ki renkler ezilmesin
fill(p_swing_top, p_swing_bot, color=color.new(base_color, 75), title="Swing Alanı (2.0x)")
fill(p_trend_top, p_trend_bot, color=color.new(base_color, 55), title="Trend Alanı (1.0x)")
fill(p_vurkac_top, p_vurkac_bot, color=color.new(base_color, 35), title="Vurkaç Alanı (0.5x)")
// ==========================================
// İMZA
var table ytd_table = table.new(position.bottom_center, 1, 1)
if barstate.islast
table.cell(ytd_table, 0, 0, "(Aİ) eğitim çalışmasıdır. Yatırım tavsiyesi KULLANILAMAZ.", text_color=color.new(color.white, 00), text_size=size.normal)
///
sarext(simple float start_value=0.0, simple float offset_on_reverse=0.0,
simple float af_init_long=0.02, simple float af_long=0.02, simple float af_max_long=0.20,
simple float af_init_short=0.02, simple float af_short=0.02, simple float af_max_short=0.20) =>
if af_init_long < 0
runtime.error("AF init long must be >= 0")
if af_long < 0
runtime.error("AF long must be >= 0")
if af_max_long < af_init_long
runtime.error("AF max long must be >= AF init long")
if af_init_short < 0
runtime.error("AF init short must be >= 0")
if af_short < 0
runtime.error("AF short must be >= 0")
if af_max_short < af_init_short
runtime.error("AF max short must be >= AF init short")
var bool is_long = true
var float sar = na
var float ep = na
var float af = af_init_long
var float result = na
if bar_index == 0
// Bar 0: store first bar, no output yet (need 2 bars for DM)
result := na
else if bar_index == 1
// Bar 1: determine initial direction
if start_value > 0
// Forced long
is_long := true
sar := math.abs(start_value)
else if start_value < 0
// Forced short
is_long := false
sar := math.abs(start_value)
else
// Auto-detect from directional movement
float plus_dm = high - high[1]
float minus_dm = low[1] - low
if plus_dm < 0
plus_dm := 0
if minus_dm < 0
minus_dm := 0
is_long := plus_dm > minus_dm
// Initial SAR from prior bar extreme
sar := is_long ? low[1] : high[1]
// Set initial EP and AF
ep := is_long ? high : low
af := is_long ? af_init_long : af_init_short
// Clamp SAR
if is_long
if sar > low[1]
sar := low[1]
if sar > low
sar := low
else
if sar < high[1]
sar := high[1]
if sar < high
sar := high
// Sign-encode
result := is_long ? sar : -sar
else
// Bar 2+: standard SAR with asymmetric AF
float new_sar = sar + af * (ep - sar)
if is_long
// Clamp to prior lows
new_sar := math.min(new_sar, low[1])
new_sar := math.min(new_sar, low[2])
// Reversal check
if low < new_sar
// Reverse to short
is_long := false
new_sar := ep
if offset_on_reverse != 0
new_sar := new_sar + offset_on_reverse
ep := low
af := af_init_short
else
// New extreme point?
if high > ep
ep := high
af := math.min(af + af_long, af_max_long)
else
// Short mode: clamp to prior highs
new_sar := math.max(new_sar, high[1])
new_sar := math.max(new_sar, high[2])
// Reversal check
if high > new_sar
// Reverse to long
is_long := true
new_sar := ep
if offset_on_reverse != 0
new_sar := new_sar - offset_on_reverse
ep := high
af := af_init_long
else
// New extreme point?
if low < ep
ep := low
af := math.min(af + af_short, af_max_short)
sar := new_sar
result := is_long ? new_sar : -new_sar
result
// ---------- Main loop ----------
// Inputs
i_start_value = input.float(0.0, "Start Value", step=0.1, tooltip="0=auto-detect, >0=force long, <0=force short")
i_offset_reverse = input.float(0.0, "Offset on Reverse", minval=0.0, step=0.1, tooltip="Buffer added to SAR on reversal")
i_af_init_long = input.float(0.002, "AF Init Long", minval=0.0, maxval=1.0, step=0.001)
i_af_long = input.float(0.02, "AF Long", minval=0.0, maxval=1.0, step=0.001)
i_af_max_long = input.float(0.20, "AF Max Long", minval=0.0, maxval=1.0, step=0.01)
i_af_init_short = input.float(0.002, "AF Init Short", minval=0.0, maxval=1.0, step=0.001)
i_af_short = input.float(0.02, "AF Short", minval=0.0, maxval=1.0, step=0.001)
i_af_max_short = input.float(0.20, "AF Max Short", minval=0.0, maxval=1.0, step=0.01)
// Calculation
sarext_val = sarext(i_start_value, i_offset_reverse,
i_af_init_long, i_af_long, i_af_max_long,
i_af_init_short, i_af_short, i_af_max_short)
// Decode sign: absolute value = SAR level, sign = direction
sar_abs = math.abs(sarext_val)
sar_long = sarext_val > 0 ? sar_abs : na
sar_short = sarext_val < 0 ? sar_abs : na
// Plot
plot(sar_long, "+1", color=color.white, style=plot.style_linebr, linewidth=4)
plot(sar_short, "-1", color=color.fuchsia, style=plot.style_linebr, linewidth=4)
///////////
Yer İmleri