Cevabınız için teşekkür ederim.
Printable View
oldu galiba ,belki kullanmak isteyen olur.
var V = Sistem.GrafikVerileri;
var HHV = Sistem.HHV(6, "Yuksek");
var LLV = Sistem.LLV(6, "Dusuk");
var H1st = Sistem.Liste(0);
var L1st = Sistem.Liste(0);
for (int i = 1 ; i < Sistem.BarSayisi; i++)
{
if (V[i].Date.Hour == 09 && V[i].Date.Minute ==10)
{
H1st[i] = HHV[i];
L1st[i] = LLV[i];
}
else
{
H1st[i] = H1st[i-1];
L1st[i] = L1st[i-1];
}
}
var atr=Sistem.AverageTrueRange(13);
var TA1 = Sistem.Liste(0);
var TA2 = Sistem.Liste(0);
var TA3 = Sistem.Liste(0);
var TF1 = Sistem.Liste(0);
var TF2 = Sistem.Liste(0);
var TF3 = Sistem.Liste(0);
var A1 = Sistem.Liste(0);
var A2 = Sistem.Liste(0);
var A3 = Sistem.Liste(0);
var F1 = Sistem.Liste(0);
var F2 = Sistem.Liste(0);
var F3 = Sistem.Liste(0);
for (int i = 1 ; i < Sistem.BarSayisi; i++)
{
TA1[i] = (H1st[i]+2*atr[i]*0.8f)/0.025f+0.50f;
TA2[i] = (H1st[i]+atr[i]*0.8f)/0.025f+0.50f;
TA3[i] =(H1st[i]-2*atr[i]*0.8f)/0.025f+0.50f;
TF1[i] = (L1st[i]+2*atr[i]*0.8f)/0.025f+0.50f;
TF2[i] = (L1st[i]-atr[i]*0.8f)/0.025f+0.50f;
TF3[i] = (L1st[i]-2*atr[i]*0.8f)/0.025f+0.50f;
A1[i] =(int)TA1[i]*0.025f;//(int)a1
A2[i] =(int)TA2[i]*0.025f;
A3[i] =(int)TA3[i]*0.025f;
F1[i] =(int)TF1[i]*0.025f;
F2[i] =(int)TF2[i]*0.025f;
F3[i] =(int)TF3[i]*0.025f;
}
Sistem.Cizgiler[0].Deger = A1 ;
Sistem.Cizgiler[1].Deger = A2 ;
Sistem.Cizgiler[2].Deger = A3 ;
Sistem.Cizgiler[3].Deger = F1 ;
Sistem.Cizgiler[4].Deger = F2 ;
Sistem.Cizgiler[5].Deger = F3 ;
Veri güncellemeyle ilgili sorunları aşamadım bir türlü..
Sorgu kodlarında bir sembolün bir periyodu için hesaplama yaparken
eğer o sembol için grafik daha önceden ekrana çizilmemişse;
sorgu sonucunda göstergeler için hesaplanan sonuçlar ile
sembolün grafiğini ekrana çizdirdiğim zaman güncellenen barlar nedeniyle
değişen gösterge değerleri; haliyle; birbirinden farklı çıkıyor.
(Sembol grafiği seçili periyotta ekrana çizilince veriler güncelliyor; hop.. bir kaç bar daha ekleniyor grafiğe, dolayısıyla sorguda hesaplanan değerler değişiyor)
Bu verinin sonradan; grafiği çizilince; güncellenmesi seans saatleri içinde de oluyor mu onu tespit edemedim.
Sorgu öncesi iDeal menüsünden güncellemeyi yapıyorum. Bazen veri indiriyor, bazen veriler güncel olduğu için indirmiyor.
https://i.hizliresim.com/bhwt48c.png
Sistem değil.. Sorgularda yaşıyorum bu problemi.. sistem için de aynı şey oluyor ama amaç sorgu sinyalini kaçırmamak.
Sorgu gerçekleşiyor.. algoritmaya göre (custom) AL-SAT vb. sinyaller üretiliyor..
Sembolün grafiğini açtığımda bir bakıyorum beş altı bar ekleniyor grafiğe ve sorgunun ürettiği sinyalle alakası olmayan bir durumla karşılaşıyorum.
Çözemedim bu işi. Bu konuda yanlış olan, ya da yanlış- eksik yaptığım bir şeyler var. Yardım edebilecek var mı?
Sorgu kodlarında aşağıdaki şekilde veri okutuyorum.
PHP Code:
string Periyot = Sistem.Periyot;
Sistem.GrafikVerisiIndir(Sistem.Sembol, Periyot);//ardarda 1 saat geçmeden kullanamazsınız
//Sistem.YuzeyselGuncelle(Sistem.Sembol); //Verileri sıfırlıyor, hesaplama yapılamıyor
//Sistem.GrafikGuncelle(Sistem.Sembol); //Kullanıcı tanımlı semboller için
var Veriler = Sistem.GrafikVerileriniOku(Sistem.Sembol, Periyot);
var BarYüksek = Sistem.GrafikFiyatOku(Veriler, "Yuksek");
var BarDüşük = Sistem.GrafikFiyatOku(Veriler, "Dusuk");
var BarPIVOT = Sistem.GrafikFiyatOku(Veriler, "OHLC/4");
//Bazı periyotlarda barların ağırlıklı ortalamasını veri olarak alamıyorsun..
//var BarYüksek = Sistem.GrafikFiyatSec("Yuksek");
//var BarDüşük = Sistem.GrafikFiyatSec("Dusuk");
//var BarPIVOT = Sistem.GrafikFiyatSec("OHLC/4");
var V_240 = Sistem.GrafikVerileriniOku(Sistem.Sembol, "240", "OHLC/4");
var V_60 = Sistem.GrafikVerileriniOku(Sistem.Sembol, "60", "OHLC/4");
Verileri tamamlasın diye bazen aşağıdaki sorguyu kullanıyorum.. kullandığım bütün periyotları işaretleyip bu sorguyu çalıştırıyorum yine de ekrana grafik çizilmeden bir türlü şu veriyi tamamlatamadım. Karanlık oda verisinin de hangi periyotta hangi bara eklendiği konusu da soru işareti.. G ve 240 dakikalık barlara ekleniyor, fakat diğer periyotlarda ayrı bir bar olarak sona ekleniyor.. yanlış yaptığım bir şeyler var.
Önce tüm sembollerde ekrana grafik çizdirilecek.. sorgu tekrar çalıştırılacak.. o zaman sorun yok. :28:
https://i.hizliresim.com/a76pt16.pngPHP Code:
public void QUERY_COMPLETE_DATA()
{
//Senetler
Sistem.SorguAciklamaGenislik = 150;
Sistem.SorguSutunGenislik[0] = 50;
Sistem.SorguBaslik[0] = "SEMBOL";
Sistem.SorguSutunTip[0] = "YAZI";
Sistem.SorguSutunHizala[0] = "SOL";
var Symbol = (Sistem.Sembol.Contains("IMKBH'") ? Sistem.Sembol.Replace("IMKBH'", "") : Sistem.Sembol);
Sistem.SorguDeger[0] = Symbol;
var Yuzeysel = Sistem.YuzeyselVeriOku(Sistem.Sembol);//Etkisiz
var SonFiyat = Sistem.SonFiyat(Sistem.Sembol);
if (SonFiyat > 0)
{
try
{
int colID = 1;
Sistem.SorguSutunGenislik[colID] = 60;
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguBaslik[colID] = "(SonFiyat) KAPANIŞ";
Sistem.SorguDeger[colID] = SonFiyat;
colID++;
Sistem.SorguSutunGenislik[colID] = 110;
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguBaslik[colID] = "(OncekiKapanisGun) Önceki Kapanış";
var OncekiKapanisGun = Sistem.OncekiKapanisGun(Sistem.Sembol);
Sistem.SorguDeger[colID] = OncekiKapanisGun;
colID++;
Sistem.SorguSutunGenislik[colID] = 80;
Sistem.SorguOndalik[colID] = 0;
Sistem.SorguBaslik[colID] = "(SonHacim) SON HACİM";
var SonHacim = Sistem.SonHacim(Sistem.Sembol);
Sistem.SorguDeger[colID] = SonHacim;
colID++;
Sistem.SorguSutunGenislik[colID] = 20;
Sistem.SorguBaslik[colID] = "-";
Sistem.SorguSutunHizala[colID] = "ORTA";
Sistem.SorguDeger[colID] = "";
string Periyot = Sistem.Periyot;
Sistem.GrafikVerisiIndir(Sistem.Sembol, Periyot);
//Sembol ve Periyot
int _Periyot = 0;
int.TryParse(Periyot, out _Periyot);
string PeriodValue = Symbol + " " + (_Periyot == 0 ? Periyot : _Periyot.ToString("000"));
colID++;
Sistem.SorguSutunGenislik[colID] = 70;
Sistem.SorguBaslik[colID] = "Sembol & Periyot"; //Periyot
Sistem.SorguSutunHizala[colID] = "SOL";
Sistem.SorguSutunTip[colID] = "YAZI";
Sistem.SorguDeger[colID] = PeriodValue;
//Sistem Bar Sayısı
colID++;
Sistem.SorguSutunGenislik[colID] = 60;
Sistem.SorguBaslik[colID] = "Sistem Bar Sayısı";
Sistem.SorguOndalik[colID] = 0;
Sistem.SorguDeger[colID] = Sistem.BarSayisi;
// GRAFİK VERİLERİNİ OKU
var Barlar = Sistem.GrafikVerileriniOku(Sistem.Sembol, Periyot);
//Grafik Verilerini Oku : Bar Sayısı
int Barlar_Count = Barlar.Count;
colID++;
Sistem.SorguSutunGenislik[colID] = 60;
Sistem.SorguBaslik[colID] = "(GVO) Bar Sayısı";
Sistem.SorguOndalik[colID] = 0;
Sistem.SorguDeger[colID] = Barlar_Count;
//Grafik Verilerini Oku : Önceki Bar Kapanış Saati
colID++;
Sistem.SorguSutunGenislik[colID] = 85;
Sistem.SorguBaslik[colID] = "(GVO) Önceki Bar Zamanı";
Sistem.SorguSutunTip[colID] = "YAZI";
Sistem.SorguDeger[colID] = Barlar[Barlar.Count - 2].Date.ToLongTimeString();
//Grafik Verilerini Oku : Son Bar Kapanış Saati
colID++;
Sistem.SorguSutunGenislik[colID] = 80;
Sistem.SorguBaslik[colID] = "(GVO) Son Bar Zamanı";
Sistem.SorguSutunTip[colID] = "YAZI";
Sistem.SorguDeger[colID] = Barlar[Barlar.Count - 1].Date.ToLongTimeString();
//Grafik Verilerini Oku : Önceki Bar Kapanış
colID++;
Sistem.SorguSutunGenislik[colID] = 85;
Sistem.SorguBaslik[colID] = "(GVO) Önceki Bar Kapanış";
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguDeger[colID] = Barlar[Barlar.Count - 2].Close;
//Grafik Verilerini Oku : Son Bar Kapanış
colID++;
Sistem.SorguSutunGenislik[colID] = 80;
Sistem.SorguBaslik[colID] = "(GVO) Son Bar Kapanış";
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguDeger[colID] = Barlar[Barlar.Count - 1].Close;
// GRAFİK FİYAT OKU
var GFO_Close = Sistem.GrafikFiyatOku(Barlar, "Kapanis");
//Grafik Fiyat Oku : Önceki Bar Kapanış
var GFO_Close_Prev = GFO_Close[GFO_Close.Count - 2];
colID++;
Sistem.SorguSutunGenislik[colID] = 70;
Sistem.SorguBaslik[colID] = "(GFO) Önceki Kapanış";
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguDeger[colID] = GFO_Close_Prev;
//Grafik Fiyat Oku : Son Bar Kapanış
var GFO_Close_Last = GFO_Close[GFO_Close.Count - 1];
colID++;
Sistem.SorguSutunGenislik[colID] = 65;
Sistem.SorguBaslik[colID] = "(GFO) Son Kapanış";
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguDeger[colID] = GFO_Close_Last;
var GFO_Volume = Sistem.GrafikFiyatOku(Barlar, "Hacim");
//Grafik Fiyat Oku : Önceki Bar Hacim
var GFO_Volume_Prev = GFO_Volume[GFO_Volume.Count - 2];
colID++;
Sistem.SorguSutunGenislik[colID] = 100;
Sistem.SorguBaslik[colID] = "(GFO) Önceki Hacim";
Sistem.SorguOndalik[colID] = 0;
Sistem.SorguDeger[colID] = GFO_Volume_Prev;
//Grafik Fiyat Oku : Son Bar Hacim
var GFO_Volume_Last = GFO_Volume[GFO_Volume.Count - 1];
colID++;
Sistem.SorguSutunGenislik[colID] = 100;
Sistem.SorguBaslik[colID] = "(GFO) Son Hacim";
Sistem.SorguOndalik[colID] = 0;
Sistem.SorguDeger[colID] = GFO_Volume_Last;
// GRAFİK VERİLERİ
//Grafik Verileri : Önceki Bar Tarihi
string GV_Date_Prev = Sistem.GrafikVerileri[Sistem.BarSayisi - 2].Date.ToString("dd/MM/yyyy HH:mm:ss.ff");
colID++;
Sistem.SorguSutunGenislik[colID] = 130;
Sistem.SorguBaslik[colID] = "(GV) Önceki Veri Tarih";
Sistem.SorguSutunTip[colID] = "YAZI";
Sistem.SorguDeger[colID] = GV_Date_Prev;
//Grafik Verileri : Son Bar Tarihi
string GV_Date_Last = Sistem.GrafikVerileri[Sistem.BarSayisi - 1].Date.ToString("dd/MM/yyyy HH:mm:ss.ff");
colID++;
Sistem.SorguSutunGenislik[colID] = 130;
Sistem.SorguBaslik[colID] = "(GV) Son Veri Tarih";
Sistem.SorguSutunTip[colID] = "YAZI";
Sistem.SorguDeger[colID] = GV_Date_Last;
//Grafik Verileri : Önceki Bar Kapanış
float GV_Close_Prev = Sistem.GrafikVerileri[Sistem.BarSayisi - 2].Close;
colID++;
Sistem.SorguSutunGenislik[colID] = 80;
Sistem.SorguBaslik[colID] = "(GV) Önceki Veri Kapanış";
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguDeger[colID] = GV_Close_Prev;
//Grafik Verileri : Son Bar Kapanış
float GV_Close_Last = Sistem.GrafikVerileri[Sistem.BarSayisi - 1].Close;
colID++;
Sistem.SorguSutunGenislik[colID] = 80;
Sistem.SorguBaslik[colID] = "(GV) Son Veri Kapanış";
Sistem.SorguOndalik[colID] = 2;
Sistem.SorguDeger[colID] = GV_Close_Last;
//Grafik Verileri : Önceki Bar Kapanış
float GV_Vol_Prev = Sistem.GrafikVerileri[Sistem.BarSayisi - 2].Vol;
colID++;
Sistem.SorguSutunGenislik[colID] = 80;
Sistem.SorguBaslik[colID] = "(GV) Önceki Veri Hacim";
Sistem.SorguOndalik[colID] = 0;
Sistem.SorguDeger[colID] = GV_Vol_Prev;
//Grafik Verileri : Son Bar Kapanış
float GV_Vol_Last = Sistem.GrafikVerileri[Sistem.BarSayisi - 1].Vol;
colID++;
Sistem.SorguSutunGenislik[colID] = 80;
Sistem.SorguBaslik[colID] = "(GV) Son Veri Hacim";
Sistem.SorguOndalik[colID] = 0;
Sistem.SorguDeger[colID] = GV_Vol_Last;
Sistem.SorguAciklama = "Periyot: " + Periyot + " için değerler";
Sistem.SorguEkle();
}
catch (Exception Ex)
{
string errorline = "Message : " + Ex.Message + " Source : " + Ex.Source + " StackTrace : " + Ex.StackTrace;
Sistem.SorguAciklama = errorline;
Sistem.SorguEkle();
}
}
else
{
Sistem.SorguAciklama = "!!* Veri Alınamadı *!!";
Sistem.SorguEkle();
}
}
(Uygulama güzel. Çok emek var. :ok: Ama bir kaç eleştiri: :rules: üstelik WPF bile değil yani.., uygulamanın UI özellikleri umarım daha da geliştirilecek)
Özellikler diğer ayarlar da Günlük / Güniçi Barlar kaydedilsin tikli mi acaba. Sorgu ile alakalı mı emin değilim ama; grafik sağ klik te Okunacak bar sayısı ve Maksimum bar sayısı (30 dk için mesela 5dk verisinden aldığı için formüldeki parametrenin en az 6 katı olmalı)
*Sorgu ekranında son 5bin bar seçili parametreler de 830 üstüne çıkmanız durumunda daha yüksek değer girilmeli.
Güncellemeler Grafik bölümünden yapılmalı.
@inventor
var V = Sistem.GrafikVerileri;
var H = Sistem.GrafikFiyatOku(V, "Yuksek" ) ;
var L = Sistem.GrafikFiyatOku(V, "Dusuk" ) ;
var C = Sistem.GrafikFiyatOku(V, "Kapanis" ) ;
var EMA = Sistem.MA(C, "Exp", Periyot);
var TOMA = Sistem.TOMA(Periyot, Yuzde);
// vs vs
var BaslangicNo = 1000;
if (Sistem.BarSayisi > Kullan) BaslangicNo = Sistem.BarSayisi - Kullan;
for (int i = BaslangicNo ; i < Sistem.BarSayisi; i++)
{
/// sistemin stratejin yada indikatör hesaplamaların
}
Farklı periyodlara ait 2 sistemin sinyallerini birleştirip yeni bir sistem oluşturup repaint yapmadan kullanabilirmiyiz.
Eskilerde sayın anonimin yazdığı örnek kodu kullandım. 2 sisteminde sinyalleri önceki bara göre atandığı halde gerçege aldığımda sistem repaint yapıyor.
Elinde örnek kalıp olan var mı.
Teşekkürler. :ok:
Sorgu için bana son birkaç bardaki veri lazım.
Örneğin;
Arkası var.. her birine 98bin bar kullanarak hesaplama yapacak..PHP Code:
var Veriler = Sistem.GrafikVerileriniOku(Sistem.Sembol, Periyot);
var BarPIVOT = Sistem.GrafikFiyatOku(Veriler, "OHLC/4");
//Periyot 5 ise 98bin küsür bar verisi getiriyor
//Periyot 30 ise 17bin küsür bar verisi getiriyor vb.
//Bu şekilde 98bin bar için hesap yapacak..
var STO = Sistem.StochasticFast(5, 3);
var MACD = Sistem.MACD(12, 26);
List<float> MACD_100 = null;
List<float> RSI_100 = null;
List<float> STO_100 = null;
List<float> STR_100 = null;
List<float> WIR_100 = null;
List<float> CCI_100 = null;
List<float> CHM_100 = null;
List<float> MOM_100 = null;
List<float> DMN_100 = null;
List<float> DMR_100 = null;
List<float> FXS_100 = null;
List<float> ULT_100 = null;
List<float> RMI_100 = null;
List<float> IMI_100 = null;
List<float> AWS_100 = null;
List<float> QST_100 = null;
List<float> KAI_100 = null;
List<float> IFI_100 = null;
List<float> MFI_100 = null;
List<float> POP_100 = null;
List<float> RAV_100 = null;
List<float> TRX_100 = null;
Bir de bunların HHL, LLV değerlerini hesaplayacak..
Yani bir sorgu döngüsünde bütün bunları 98bin barlık verileri kulanarak hesaplamak yerine
Verileri 1000 elemanlık bir liste olarak oluşturdum.. VerilerinSonBarları 1000 elemanlık bir liste.PHP Code:
var Veriler_ÇOK_FAZLA_BAR_VAR = Sistem.GrafikVerileriniOku(Sistem.Sembol, Periyot);
var BarPIVOT_ÇOK_FAZLA_BAR_VAR = Sistem.GrafikFiyatOku(Veriler_ÇOK_FAZLA_BAR_VAR, "OHLC/4");
int VerilerdenSondanKaçBarAlınsın = 1000;
var VerilerinSonBarları =
Veriler_ÇOK_FAZLA_BAR_VAR
.GetRange(Veriler_ÇOK_FAZLA_BAR_VAR.Count - VerilerdenSondanKaçBarAlınsın, VerilerdenSondanKaçBarAlınsın);
List<float> BarPIVOT =
BarPIVOT_ÇOK_FAZLA_BAR_VAR
.GetRange(BarPIVOT_ÇOK_FAZLA_BAR_VAR.Count - VerilerdenSondanKaçBarAlınsın, VerilerdenSondanKaçBarAlınsın);
BarPIVOT listesi keza öyle..
20 küsür gösterge ve bunların HHLL hesapları + 20 küsür hareketli ortalama hesabında
98 bin barlık listeler değil de
1 bin barlık listeler kullanılacak.
var STO = Sistem.StochasticFast(VerilerinSonBarları, 5, 3);
var MACD = Sistem.MACD(BarPIVOT, 12, 26);
...
5 dakikalık barlarda hesaplama süresi neredeyse 1/100 oranında kısaldı.