Merhaba,kodun icinde grafigin calistigi para birimini alabilecegim bir method var midir?
Printable View
Merhaba,kodun icinde grafigin calistigi para birimini alabilecegim bir method var midir?
Erhan hocam,
//1 deki gibi yeni bir liste tanimlayip, //2 deki satiri dongu icersine ekleyip dener misiniz?
Bu yeni liste Sistem.Yon'deki A/S/F degisimlerini 1/-1/0 degerleri olarak tutuyor. Sistem.Yon listesi sadece yon degisimleri sirasinda deger aliyor yani yon degisimi disindaki herhangi baska bir anda ici bos gibi. Yeni liste ise tum barlar boyunca ekranda gordugumuz yone paralel 1/-1/0 degerleri atiyor.PHP Code:
//1
var SonYon_Liste = Sistem.Liste(0);
//2
SonYon_Liste[i]=Sistem.Yon[i]=="A"?1:Sistem.Yon[i]=="S"?-1:Sistem.Yon[i]=="F"?0:SonYon_Liste[i-1];
Not:Bu satirlari eski forumdan "anonim" arkadasimizin sistem birlestirme kodu icerisinde uyarladim.
Merhaba,
Benim gorebildigim kadariyla strateji kismindaki kodunuz gelecege bakip sinyal uretmek istiyor. Geriye donuk testlerde bir sekilde calistirabilseniz bile seans sirasinda bir sonraki bar (i+1) hicbir zaman olusmayacagi icin tutarli bir sinyal de uretmeyecektir diye dusunuyorum. Muhtemelen yeni bar olustuktan sonra sanki onceki barda sinyal vermis gibi yapacaktir.
performans açısından döngüye sokmadan bu işi yapayım demiştim.
Bir arayüz tasarlıyorum timer ile Sistem Getiri çalıştırıp sistemin yönlerini sürekli olarak çekiyorum. Yön çekildiği veya değiştiği andaki grafik fiyat verilerindeki son değer neyse onu form uygulamama yazdırmak istiyorum amacım bu.
-Sistem YÖnünü çekiyorum ve forma yazdırabiliyorum PROBLEM YOK!
-Alış veya Satış fiyatınıda çekiyorum forma yazdırıyorum YÖN DEĞİŞMESE BİLE FİYAT DEĞİŞİYOR. PROBLEM VAR!
BUradaki problem ana sebebi timer sürekli olarak okuma yapıyor haliyle koşul gerçekleştiği içinde okumayı sürdürüyor. Buaya bir if bloğuyla son yön değişmişse git fiyatları oku veya yansıt gibi birşey demem lazım ki sadece o anda fiyatı okusun. Bir önceki son yön değişmiş ise git son fiyatı oku demek lazım fakat son yon bir liste değil anladıgım kadarıyla.
Yonumuz diye bir değişken oluşturdum global alanda timer dışında burayı kontrol ettireyim diyordum. Yanlız Yonumuz adlı değişkeni tetikleyemiyorum. yine timer veya for gibi birşeylere girişmek gerekiyormuş gibi.
Aklıma gelen şey şu Yonumuz adlı global alandaki değişkeni bir listeye çeviremezmiyiz. Bunu bir liste halinde tutup bir önceki yonumuz şöyle şimdiki yönümüz böyle ise fiyatı o zaman oku gibi bir kurgu problemı cozermı yoksa liste sürekli olarak dolup şişirirmi programı kafamda deli sorular :) KIT C# bilgisiyle :D
Kod:int Yonumuz;
public void timer1_Tick(object sender, EventArgs e) //timer1 acılınca okunacak verıler
{
SistemAdi = textBoxsistemadi.Text;
SembolAdi = textBoxsembol.Text;
Periyot = textBoxperiyot.Text;
var Sistemim = User.Sistem.SistemGetir(SistemAdi, SembolAdi, Periyot);
if (Sistemim.SonYon == "A")
{
lblsistemyonu.Text = "LONG";
Yonumuz = 1;
var S1 = User.Sistem.YuzeyselVeriOku(SembolAdi);//yüzeysel verileri oku
float P1 = S1.LastPrice; //son fiyatı
lblislemfiyat.Text = P1.ToString("0.0000"); //yazdır
}
if (Sistemim.SonYon == "S")
{
lblsistemyonu.Text = "SHORT";
Yonumuz = -1;
var S1 = User.Sistem.YuzeyselVeriOku(SembolAdi);//yüzeysel verileri oku
float P1 = S1.LastPrice; //son fiyatı
lblislemfiyat.Text = P1.ToString("0.0000"); //yazdır
}
if (Sistemim.SonYon == "F")
{
lblsistemyonu.Text = "FLAT";
Yonumuz = 0;
var S1 = User.Sistem.YuzeyselVeriOku(SembolAdi);//yüzeysel verileri oku
float P1 = S1.LastPrice; //son fiyatı
lblislemfiyat.Text = P1.ToString("0.0000"); //yazdır
}
else if (Sistemim.SonYon == null)
{
MessageBox.Show("Sistem Bulunamadı!");
}
}
// hesapla
var DEMA1 = Sistem.DEMA(5);
var DEMA2 = Sistem.DEMA(21);
// hesaplanan verileri çizgilere aktar
Sistem.Cizgiler[0].Deger = DEMA1;
Sistem.Cizgiler[1].Deger = DEMA2;
// sistem strateji
Sistem.KesismeTara(DEMA1, DEMA2);
// algo strateji
if (Sistem.YukariKestiyse(DEMA1, DEMA2)) // alış
Sistem.AlgoIslem = "A";
if (Sistem.AsagiKestiyse(DEMA1, DEMA2)) // satış
Sistem.AlgoIslem = "S";
// algo açıklama
Sistem.AlgoAciklama = "DEMA1=" + DEMA1[Sistem.BarSayisi-1].ToString("0.00") + " " +
"DEMA2=" + DEMA2[Sistem.BarSayisi-1].ToString("0.00");
************************************************** ********
// parametreleri al
var Periyot = Sistem.Parametreler[0];
var Yuzde = Sistem.Parametreler[1];
// TOMA hesapla
var TOMA = Sistem.TOMA(Periyot, Yuzde);
// EMA hesapla
var Veriler = Sistem.GrafikFiyatSec("Kapanis");
var EMA = Sistem.MA(Veriler, "Exp", Periyot);
// hesaplanan verileri çizgilere aktar ve açıklama ekle
Sistem.Cizgiler[0].Deger = TOMA;
Sistem.Cizgiler[1].Deger = EMA;
// strateji
Sistem.KesismeTara(EMA, TOMA);
**************************************
İdealin demo verisyonunda üsteki dema5-dema21 formülünde siyah olarak belirttiğim yerde sistem strateji ve algo stratejisi varken Toma formül örneginde sadece strateji bölümü eklenmiş, algo strateji eklenmemiş.
dema örnegi algo örnegi iken, toma indikatör örnegimi oluyor. Fark bumdanmı kaynaklanıyor.
Orhan Akdoğan ın Lib dosyasında buna benzer bir şey gördüm ama bahsettiğiniz olay mı bilmiyorum.
https://i.hizliresim.com/7Bymrl.jpg
Problemi muhtemelen çözdüm Pazartesi deneyeceğim Ancak kurgulanan algorıtma doğru diye düşünüyorum.
Bilgi ve öğretme amaçlı buraya da yayınlamış olayım.
a,s,f diye 0 değerinde değişkenler oluşturdum global alanda.
Timerin tick olayına yani her saniyede bir diyelim Sistemgetiri çalıştırıp sistemi çekiyor.
eğer sistemin son yonu A ise;
eğer a nın değeri de 0 a eşit ise;
Son fiyatı oku ve a nın değerini 1 arttır s ve f yide 0 yap.
Böylece timer tekrar okuma yaptıgında a'nın değeri artık 1 olacağı için LONG yazmasına veya son fiyatı okumasına gerek kalmayacak bir kere long olmuşsa birdaha long olmuş gibi davranmayacak.
Normalde her tickte yani her saniyede son yon kontrolunu saglayan if bloklarını okuyup duruyordu bu sayede o bloklarıda atlayacak max performansla calıstırmış olacagım :shh::yahoo:
Ancak sistem getir acaba ne kadar yük bindiriyor makinaya onu ilerde ölçeceğim.
Kod:int a = 0;
int s = 0;
int f = 0;
public void timer1_Tick(object sender, EventArgs e) //timer1 acılınca okunacak verıler
{
SistemAdi = textBoxsistemadi.Text;
SembolAdi = textBoxsembol.Text;
Periyot = textBoxperiyot.Text;
var Sistemim = User.Sistem.SistemGetir(SistemAdi, SembolAdi, Periyot);
if (Sistemim.SonYon == "A")
{
if (a==0)
{
lblsistemyonu.Text = "LONG";
var S1 = User.Sistem.YuzeyselVeriOku(SembolAdi);//yüzeysel verileri oku
float P1 = S1.LastPrice; //son fiyatı
lblislemfiyat.Text = P1.ToString("0.0000"); //yazdır
a++;
s = 0;
f = 0;
}
}
else if (Sistemim.SonYon == "S")
{
if (s==0)
{
lblsistemyonu.Text = "SHORT";
var S1 = User.Sistem.YuzeyselVeriOku(SembolAdi);//yüzeysel verileri oku
float P1 = S1.LastPrice; //son fiyatı
lblislemfiyat.Text = P1.ToString("0.0000"); //yazdır
s++;
a = 0;
f = 0;
}
}
else if (Sistemim.SonYon == "F")
{
if (f==0)
{
lblsistemyonu.Text = "FLAT";
var S1 = User.Sistem.YuzeyselVeriOku(SembolAdi);//yüzeysel verileri oku
float P1 = S1.LastPrice; //son fiyatı
lblislemfiyat.Text = P1.ToString("0.0000"); //yazdır
f++;
s = 0;
a = 0;
}
}
Erhan aşağıdaki kalıptan alacağın parça formül işine yarayacaktır.
grafiktekiPHP Code:
var FIYATLIST = Sistem.Liste(0);
if (AlisSinyal && SonYon != "A" || SonYon == "F" && Flat_Al ) // alış sinyal
{
Miktar = -Pozisyon + LevelLot ;
MIKTARLIST[i] = Miktar;
FIYATLIST[i] = C[i];
AvrFiyat = C[i];
AVRFIYATLIST[i] = AvrFiyat;
izLIST[i] = (FIYATLIST[i] - izleyen ) ;
Pozisyon = LevelLot ;
POZLIST[i] = Pozisyon;
SonYon = "A";
Sistem.Yon[i] = SonYon;
}
else if (SatisSinyal && SonYon != "S" || SonYon == "F" && Flat_Sat ) // satış sinyal
{
Miktar = -Pozisyon - LevelLot ;
MIKTARLIST[i] = Miktar;
FIYATLIST[i] = C[i];
AvrFiyat = C[i];
AVRFIYATLIST[i] = AvrFiyat;
izLIST[i] = (FIYATLIST[i] + izleyen ) ;
Pozisyon = - LevelLot ;
POZLIST[i] = Pozisyon;
SonYon = "S";
Sistem.Yon[i] = SonYon;
}
Sistem.Cizgiler[2].Deger = FIYATLIST;
beyaz çizgi İşlem yerlerini ve o andaki fiyatı
Açıkmavi ortalama maliyeti
Sarı İzleyen stop değerini gösterir
https://i.resimyukle.xyz/aMLQc4.png