JustPaste.it

// --- UT BOT ALERTS [QuantNomad] - Kapanış Başyapıtı ---

// --- AYARLAR ---
float a = 2.5f; // Key Value (Duyarlılık Çarpanı - Pine'daki standart: 1)
int c = 10;     // ATR Periyodu (Pine'daki standart: 10)
// Not: Orijinaldeki "Heikin Ashi" filtresini es geçtik çünkü robot sistemlerinde
// standart kapanış (Close) fiyatları her zaman daha kesin ve kaymasız işlem üretir.

var V = Sistem.GrafikVerileri;
var C = Sistem.GrafikFiyatOku(V, "Kapanis");

// ATR (Ortalama Gerçek Aralık) Hesaplanması
var ATR = Sistem.AverageTrueRange(V, c);

// HESAPLAMA LİSTELERİ
var xATRTrailingStop = Sistem.Liste(0f);
var pos = Sistem.Liste(0f); // Trend Yönü: 1 (Boğa), -1 (Ayı)

int baslangic = c + 1;
// Başlangıç referanslarını atıyoruz (Sıfır hatası almamak için)
xATRTrailingStop[baslangic - 1] = C[baslangic - 1]; 
pos[baslangic - 1] = 1f;

string SonYon = "";

// ANA ALGORİTMA DÖNGÜSÜ
for (int i = baslangic; i < V.Count; i++)
{
    float src = C[i];
    float prevSrc = C[i - 1];
    float nLoss = a * ATR[i];
    float prevStop = xATRTrailingStop[i - 1];

    // 1. İZLEYEN STOP (TRAILING STOP) HESAPLAMASI
    if (src > prevStop && prevSrc > prevStop)
    {
        // Yükselişte stop çizgisi sadece yukarı taşınır (Max)
        xATRTrailingStop[i] = Math.Max(prevStop, src - nLoss);
    }
    else if (src < prevStop && prevSrc < prevStop)
    {
        // Düşüşte stop çizgisi sadece aşağı taşınır (Min)
        xATRTrailingStop[i] = Math.Min(prevStop, src + nLoss);
    }
    else if (src > prevStop)
    {
        // Fiyat stopu yukarı kırdığında yeni stopu aşağıya kur
        xATRTrailingStop[i] = src - nLoss;
    }
    else
    {
        // Fiyat stopu aşağı kırdığında yeni stopu yukarıya kur
        xATRTrailingStop[i] = src + nLoss;
    }

    // 2. TREND POZİSYONU (Boya/Yön Belirleme)
    if (prevSrc < prevStop && src > prevStop)
        pos[i] = 1f;
    else if (prevSrc > prevStop && src < prevStop)
        pos[i] = -1f;
    else
        pos[i] = pos[i - 1];

    // 3. KESİŞİM VE SİNYAL ONAYLARI
    bool above = src > xATRTrailingStop[i] && prevSrc <= xATRTrailingStop[i - 1];
    bool below = src < xATRTrailingStop[i] && prevSrc >= xATRTrailingStop[i - 1];

    bool buy = src > xATRTrailingStop[i] && above;
    bool sell = src < xATRTrailingStop[i] && below;

    // 4. OKLARI (SİNYALLERİ) GRAFİĞE BASMA
    if (buy && SonYon != "A")
    {
        Sistem.Yon[i] = "A";
        SonYon = "A";
    }
    else if (sell && SonYon != "S")
    {
        Sistem.Yon[i] = "S";
        SonYon = "S";
    }
    else
    {
        Sistem.Yon[i] = "";
    }
}

// --- GÖRSELLEŞTİRME AYARLARI ---
// İzleyen Stop çizgisini grafiğe basıyoruz (Fiyatın altına/üstüne kalkan görevi görür)
Sistem.Cizgiler[0].Deger = xATRTrailingStop;
Sistem.Cizgiler[0].Aciklama = "UT Bot Trailing Stop";
Sistem.Cizgiler[0].Kalinlik = 2; // Çizgi belirgin olsun
Sistem.Cizgiler[0].Panel = 1;    // Kesinlikle Panel 1 olmalı (Fiyatla beraber çizilmesi için)