Alıntı Originally Posted by sonli Yazıyı Oku
Daha önce twitter veya burada kapalı-kod şeklinde paylaşılmıştı ama yazanı hatırlamıyorum..
Şu an çalışıyor mu onu da bilmiyorum ama indirip chartsistem e atarak deneyebilirsiniz..
https://drive.google.com/file/d/1Nr6...ew?usp=sharing
çok teşekkür ederim sn. sonli,
bu esnada yapay zekaların da yardımıyla -sanırım- 9 sayımlarını, destek dirençleri ve stopları çizdirebildim. ama neyi denesem de 9 kurulumları sonrası countdownları saydıramadım. açıkçası kod bilgim zayıf olduğu için yz ler yardımıyla bu kadar oluyor trend takip vs. bir sürü indikatör deniyoruz, bu yetenekli indikatörü de biraz kurcalayayım dedim, o yüzden uğraşıyorum açık hali olsun diye. algomarket sitesine de levent diye bir arkadaş kapalı halini yüklemiş, onunla kendi kodumu doğruladım.

yazdığımı da bırakayım buraya, belki vakti uygun olan bir el verir tamam ederiz kodu.algomarkete de yükleriz isteyen açık halini de kullanır.

var V = Sistem.GrafikVerileri;
var C = Sistem.GrafikFiyatSec("Kapanis");
var H = Sistem.GrafikFiyatSec("Yuksek");
var L = Sistem.GrafikFiyatSec("Dusuk");
int[] Al_Kurulum = new int[Sistem.BarSayisi];
int[] Sat_Kurulum = new int[Sistem.BarSayisi];
bool AK = false; // Bu değişkenler genel durumu takip etmek için, ikinci adımda kullanılacak.
bool SK = false;
var Destek = Sistem.Liste(0); // Bu diziler birinci adımda doldurulacak.
var Direnc = Sistem.Liste(0);
// Al_Stop_Fark ve Sat_Stop_Fark doğrudan çizimle ilgili değil, orijinaldeki gibi kalabilir.
// var Al_Stop_Fark = Sistem.Liste(0);
// var Sat_Stop_Fark = Sistem.Liste(0);


// Yeni bir hesaplama için dizilerin başında sıfır olduğunu varsayıyoruz.
for (int i_pass1 = 0; i_pass1 < Sistem.BarSayisi; i_pass1++)
{
if (i_pass1 < 4) // İlk 4 bar için (0, 1, 2, 3) özel durum veya başlangıç değerleri
{
Al_Kurulum[i_pass1] = 0;
Sat_Kurulum[i_pass1] = 0;
if (i_pass1 > 0)
{
// Destek ve Direnc için başlangıç değerlerini taşıma veya ayarlama

if (i_pass1 == 0) {
Direnc[i_pass1] = H[i_pass1]; Destek[i_pass1] = L[i_pass1];
} else {
Direnc[i_pass1] = Direnc[i_pass1 - 1]; Destek[i_pass1] = Destek[i_pass1 - 1];
}
} else { // i_pass1 == 0
// Direnc[0] ve Destek[0]'a ilk değerler.
// Bu, Sistem.Liste(0) ile zaten yapılmış olabilir.
}
continue; // Ana setup hesaplama mantığı i=4'ten sonra başlar.
}

// --- Alış Kurulumu Hesaplaması ---
if (C[i_pass1] < C[i_pass1 - 4])
{
Al_Kurulum[i_pass1] = Al_Kurulum[i_pass1 - 1] < 9 ? Al_Kurulum[i_pass1 - 1] + 1 : 1;
if (Al_Kurulum[i_pass1] == 1) {
Direnc[i_pass1] = H[i_pass1]; // Setup'ın ilk barında S/R seviyeleri o barın H/L'si olur.
Destek[i_pass1] = L[i_pass1];
} else { // Setup devam ediyor, S/R seviyelerini güncelle.
Direnc[i_pass1] = Math.Max(Direnc[i_pass1 - 1], H[i_pass1]);
Destek[i_pass1] = Math.Min(Destek[i_pass1 - 1], L[i_pass1]);
}
Sat_Kurulum[i_pass1] = 0; // Alış kurulumu aktifse, satış kurulumunu sıfırla.
}
else // C[i_pass1] >= C[i_pass1 - 4] (Alış kurulum koşulu bozuldu)
{
Al_Kurulum[i_pass1] = 0;
// Önceki S/R seviyelerini koru (orijinal kodunuzdaki gibi).
Direnc[i_pass1] = Direnc[i_pass1 - 1];
Destek[i_pass1] = Destek[i_pass1 - 1];
}

// --- Satış Kurulumu Hesaplaması ---
if (C[i_pass1] > C[i_pass1 - 4])
{
Sat_Kurulum[i_pass1] = Sat_Kurulum[i_pass1 - 1] < 9 ? Sat_Kurulum[i_pass1 - 1] + 1 : 1;
if (Sat_Kurulum[i_pass1] == 1) {
// Satış kurulumu başlıyorsa, S/R seviyelerini kendi barının H/L'si ile başlatır.
// Bu, yukarıdaki Alış Kurulumu tarafından aynı bar için ayarlanmış Direnc/Destek değerlerinin üzerine yazabilir.
Direnc[i_pass1] = H[i_pass1];
Destek[i_pass1] = L[i_pass1];
} else { // Setup devam ediyor, S/R seviyelerini güncelle.
Direnc[i_pass1] = Math.Max(Direnc[i_pass1 - 1], H[i_pass1]);
Destek[i_pass1] = Math.Min(Destek[i_pass1 - 1], L[i_pass1]);
}

Al_Kurulum[i_pass1] = 0;
}
else // C[i_pass1] <= C[i_pass1 - 4] (Satış kurulum koşulu bozuldu)
{
Sat_Kurulum[i_pass1] = 0;
// Eğer yukarıdaki Alış Kurulumu bloğu çalıştıysa, Direnc/Destek zaten ayarlanmıştır.

}
}

// --- İKİNCİ ADIM: İşleme ve Çizim (Birinci adımda hesaplanan diziler kullanılarak) ---
for (int i = 4; i < Sistem.BarSayisi; i++)
{
// --- BUY SETUP PROCESSING --- (Alış Kurulumu İşleme)
if (Al_Kurulum[i] > 0 && Al_Kurulum[i] <= 9) // Birinci adımdan gelen Al_Kurulum[i] değeri
{
string yazi = Al_Kurulum[i].ToString();
Color renk = Color.Red;
int fontBoyut = 10;

if (Al_Kurulum[i] == 9)
{
AK = true;
SK = false;

// TD Fiyat Flip Kontrolü (9. barın 6. ve 7. barların low'undan düşük olması)
if (i >= 3) // L[i-3] ve L[i-2] için güvenlik kontrolü
{
// 9 barlık bir setup i'de bitiyorsa:
// i -> 9. bar
// i-1 -> 8. bar
// i-2 -> 7. bar (low7)
// i-3 -> 6. bar (low6)
double low_bar_6_of_setup = L[i - 3];
double low_bar_7_of_setup = L[i - 2];
if (L[i] < low_bar_6_of_setup && L[i] < low_bar_7_of_setup)
{
renk = Color.Blue; // "Mükemmel" alış setup'ı için renk değişimi
fontBoyut = 11;
}
}

float direncSeviyesi = (float)Direnc[i]; // Birinci adımdan: 9 barlık alış setup'ının en yüksek değeri (TDST Direnç)
int basla = i; // Çizgi, 9. barın olduğu yerden başlar

int bitis = Sistem.BarSayisi - 1; // Varsayılan olarak grafiğin sonuna kadar uzat
for (int k = basla + 1; k < Sistem.BarSayisi; k++)
{
bool terminate = false;
// Koşul 1: Fiyat direncin üzerine kapanırsa
if (C[k] > direncSeviyesi)
{
terminate = true;
}
// Koşul 2: Yeni bir satış kurulumu 9 sayısını tamamlarsa (Sat_Kurulum[k] birinci adımdan)
if (!terminate && Sat_Kurulum[k] == 9)
{
terminate = true;
}

if (terminate)
{
bitis = k -1; // Çizgi, olayın olduğu barın bir öncesine kadar geçerli
break;
}
}
if (bitis < basla) bitis = basla; // Bitiş başlangıçtan önce olamaz

Sistem.CizgiCiz(1, basla, direncSeviyesi, bitis, direncSeviyesi, Color.Red, 2, 3);

// Stop seviyesi ve diğer çizimler (orijinaldeki gibi devam ediyor)
int setupStartBar = i - 8;
double enDusukFiyat = L[setupStartBar];
int enDusukBar = setupStartBar;
for (int j = setupStartBar; j <= i; j++) {
if (L[j] < enDusukFiyat) {
enDusukFiyat = L[j];
enDusukBar = j;
}
}
double fark = H[enDusukBar] - L[enDusukBar];
double StopSeviyesi = enDusukFiyat - fark;
Sistem.CizgiCiz(1, enDusukBar, (float)StopSeviyesi, enDusukBar + 30, (float)StopSeviyesi, Color.Blue, 2, 2); // Orijinal +30 bar uzatma
Sistem.Parametreler[0] = fark.ToString();
Sistem.BarRengi(enDusukBar, Color.Red, 3, 1);
}
Sistem.YaziEkle(yazi, 1, i, H[i] * 1.0001f, renk, "Tahoma", fontBoyut);
}

// --- SELL SETUP PROCESSING --- (Satış Kurulumu İşleme)
if (Sat_Kurulum[i] > 0 && Sat_Kurulum[i] <= 9) // Birinci adımdan gelen Sat_Kurulum[i] değeri
{
string yazi = Sat_Kurulum[i].ToString();
Color renk = Color.Green;
int fontBoyut = 10;

if (Sat_Kurulum[i] == 9)
{
SK = true;
AK = false;

// TD Fiyat Flip Kontrolü (9. barın 6. ve 7. barların high'ından yüksek olması)
if (i >= 3)
{
double high_bar_6_of_setup = H[i - 3];
double high_bar_7_of_setup = H[i - 2];
if (H[i] > high_bar_6_of_setup && H[i] > high_bar_7_of_setup)
{
renk = Color.Magenta; // "Mükemmel" satış setup'ı için renk değişimi
fontBoyut = 11;
}
}

float destekSeviyesi = (float)Destek[i]; // Birinci adımdan: 9 barlık satış setup'ının en düşük değeri (TDST Destek)
int basla = i;

int bitis = Sistem.BarSayisi - 1;
for (int k = basla + 1; k < Sistem.BarSayisi; k++)
{
bool terminate = false;
// Koşul 1: Fiyat desteğin altına kapanırsa
if (C[k] < destekSeviyesi)
{
terminate = true;
}
// Koşul 2: Yeni bir alış kurulumu 9 sayısını tamamlarsa (Al_Kurulum[k] birinci adımdan)
if (!terminate && Al_Kurulum[k] == 9)
{
terminate = true;
}

if (terminate)
{
bitis = k -1;
break;
}
}
if (bitis < basla) bitis = basla;

Sistem.CizgiCiz(1, basla, destekSeviyesi, bitis, destekSeviyesi, Color.Green, 2, 3);

// Stop seviyesi ve diğer çizimler (orijinaldeki gibi devam ediyor)
int setupStartBar = i - 8;
double enYuksekFiyat = H[setupStartBar];
int enYuksekBar = setupStartBar;
for (int j = setupStartBar; j <= i; j++) {
if (H[j] > enYuksekFiyat) {
enYuksekFiyat = H[j];
enYuksekBar = j;
}
}
double fark = H[enYuksekBar] - L[enYuksekBar];
double StopSeviyesi = enYuksekFiyat + fark;
Sistem.CizgiCiz(1, enYuksekBar, (float)StopSeviyesi, enYuksekBar + 30, (float)StopSeviyesi, Color.Magenta, 2, 2); // Orijinal +30 bar uzatma
Sistem.Parametreler[1] = fark.ToString();
Sistem.BarRengi(enYuksekBar, Color.Green, 3, 1);
}
Sistem.YaziEkle(yazi, 1, i, H[i] * 1.0001f, renk, "Tahoma", fontBoyut);
}
}