Başımı ağrıtacak, anladım.
Zamanında çok balonlar görüldü..

Bu da bebelere balon..
PHP Code:
var Increment = 0.065; // Sistem.Parametreler[0];
var AccelerationFactor = 0.43; // = Sistem.Parametreler[1];
var SonYon = string.Empty;
var Sinyal = string.Empty;
var C = Sistem.GrafikFiyatSec("Kapanis");
var PSAR = Sistem.Parabolic(C, Increment, AccelerationFactor);
for (int i = 1; i < Sistem.BarSayisi; i++)
{
if (PSAR[i] > C[i]) Sinyal = "S";
if (PSAR[i] < C[i]) Sinyal = "A";
if (SonYon != "A" && Sinyal == "A")
{
Sistem.Yon[i] = "A";
SonYon = "A";
}
if (SonYon != "S" && Sinyal == "S")
{
Sistem.Yon[i] = "S";
SonYon = "S";
}
}
Sistem.Cizgiler[0].Deger = PSAR;


PHP Code:
var C = Sistem.GrafikFiyatSec("Kapanis");
var SonYon = string.Empty;
var Sinyal = string.Empty;
for (float AF = 0.05f; AF <= 1.0f; AF += 0.001f)
{
for (float INC = 0.001f; INC <= 0.5f; INC += 0.01f)
{
var PSAR = Sistem.Parabolic(C, INC, AF);
for (int i = 0; i < Sistem.BarSayisi; i++)
Sistem.Yon[i] = string.Empty;
for (int i = 1; i < Sistem.BarSayisi; i++)
{
if (PSAR[i] > C[i]) Sinyal = "S";
if (PSAR[i] < C[i]) Sinyal = "A";
//YÖN KALIBI
if (SonYon != "A" && Sinyal == "A")
{
Sistem.Yon[i] = "A";
SonYon = "A";
}
if (SonYon != "S" && Sinyal == "S")
{
Sistem.Yon[i] = "S";
SonYon = "S";
}
}
Sistem.Optimizasyon("Acceleration Factor, Increment", AF, INC);
}
}


Böyle hesaplanır..
PHP Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
namespace INVENTOR_Analiz_CS
{
public class clsCalculate_PSar
{
// CurrentSAR = PriorSAR + Prior AF * ( PriorEP - PriorSAR)
List<clsBar> Barlar = new List<clsBar>();
int barID;
bool isUpTrend;
int upTrendStartBarID;
int downTrendStartBarID;
double priorAF;//Acceleration Factor
double priorEP;//Extreme Point
double priorSAR;
double maxOfInitialBars;
double minOfInitialBars;
int searchCount;
public void CalculatePSAR_PIVOT(int cloudId, strIndicatorPeriods_PSAR periods, List<clsBar> BARLAR)
{
enuGrafikDovizTipi DOVIZ = enuGrafikDovizTipi.GrafikDovizTipi_TL;
if (!App.BIST.boolShowTLGraph)
DOVIZ = enuGrafikDovizTipi.GrafikDovizTipi_USD;
List<clsBar> xBarlar = new List<clsBar>();
clsBar virtualBar = new clsBar(null)
{
};
xBarlar.Add(virtualBar);
for (int i = 0; i <= 2 * periods.SearchCount + 1; i++)
{
clsBar xbar = new clsBar(null)
{
GercekKapanis = BARLAR[i].GercekKapanis,
GercekAcilis = BARLAR[i].GercekAcilis
};
xbar.PSAR.ParSar = BARLAR[i].PSAR.ParSar;
xBarlar.Add(xbar);
}
double barOneRealClose = xBarlar[1].GercekKapanis;
double barOnePSarValue= xBarlar[1].PSAR.ParSar;
//Son gün kapanış değeri virtual bara ( 0 numaralı bar) aktarılıyor
//Eğer son gün kapanış >= açılış ise kapanış - 2 * PriceStep kadar aşağıdan kapanış ver
//Eğer son gün kapanış < açılış ise kapanış + 2 * PriceStep kadar aşağıdan kapanış ver
if (xBarlar[1].GercekKapanis >= xBarlar[1].GercekAcilis)
xBarlar[0].GercekKapanis = xBarlar[1].GercekKapanis - 2 * App.BIST.GraphTool.PriceStep(xBarlar[1].GercekKapanis, DOVIZ);
else
xBarlar[0].GercekKapanis = xBarlar[1].GercekKapanis + 2 * App.BIST.GraphTool.PriceStep(xBarlar[1].GercekKapanis, DOVIZ);
//Açılış değeri olarak son gün kapanış değerini kullan
xBarlar[0].GercekAcilis = xBarlar[1].GercekKapanis;
CalculatePSAR(periods, xBarlar, true, 1);
BARLAR[0].PSAR_Cloud[cloudId].VirtualNextDayPivotValue = xBarlar[0].PSAR.ParSar;
//YUKARIDAKİ İKİ SATIR PİVOT DEĞERİN HESAPLANMASI İÇİN YETERLİ
BARLAR[0].PSAR_Cloud[cloudId].VirtualNextDayPivotValue =
App.BIST.GraphTool.RegulatePriceToNearestPriceValue(BARLAR[0].PSAR_Cloud[cloudId].VirtualNextDayPivotValue, DOVIZ);
}
public void CalculatePSAR(strIndicatorPeriods_PSAR periods, List<clsBar> BARLAR, bool useTraderSettings, int customBarCountForCalculations = 0)
{
this.Barlar = BARLAR;
this.searchCount = periods.SearchCount;
if (Barlar.Count < this.searchCount) return;
if (customBarCountForCalculations == 0)
if (useTraderSettings)
customBarCountForCalculations = App.BIST.TradingGraph.BarCountForCalculations;
else
customBarCountForCalculations = App.BIST.IA_Constants.BarCountForCalculations;
barID = customBarCountForCalculations + periods.SearchCount;
if (Barlar.Count < barID) return;
//İlk searchCount adet bardaki en yüksek değer
maxOfInitialBars = getHIGHofOpenClose(barID, this.searchCount);
//İlk searchCount adet bardaki en düşük değer
minOfInitialBars = getLOWofOpenClose(barID, this.searchCount);
//ilk searchCount adet bardaki en yüksek ve en düşük değerlerin oluşturduğu yatay kanalın dışına çıkmış ilk barı tespit et
barID = getFirstBarIDForCalculation(barID);
int iterationBarCount = customBarCountForCalculations;
//if (useTraderSettings)
// iterationBarCount = App.BIST.TradingGraph.BarCountForCalculations;
//else
// iterationBarCount = App.BIST.IA_Constants.BarCountForCalculations;
if (Barlar[barID].GetPrice(enuUseForCalculation.RealHighOf_OpenClose) >= maxOfInitialBars)
{//UPTREND
for (int i = barID; i < iterationBarCount; i++)
Barlar[i].PSAR.ParSar = minOfInitialBars;
isUpTrend = true;
upTrendStartBarID = barID;
priorEP = maxOfInitialBars;
}
else if (Barlar[barID].GetPrice(enuUseForCalculation.RealLowOf_OpenClose) <= minOfInitialBars)
{//DOWNTREND
for (int i = barID; i < iterationBarCount; i++)
Barlar[i].PSAR.ParSar = maxOfInitialBars;
isUpTrend = false;
downTrendStartBarID = barID;
priorEP = minOfInitialBars;
}
else
{
return;
}
priorSAR = Barlar[barID].PSAR.ParSar;
priorAF = periods.Increment;
this.searchCount--;
while (barID > 0)
{
barID--;
double currentSAR = priorSAR + priorAF * (priorEP - priorSAR);
if (isUpTrend)
{
if (Barlar[barID].GetPrice(enuUseForCalculation.RealLowOf_OpenClose) >= currentSAR)
{
maxOfInitialBars = priorEP;
for (int i = barID; i <= upTrendStartBarID; i++)
maxOfInitialBars = Math.Max(maxOfInitialBars, Barlar[i].GetPrice(enuUseForCalculation.RealHighOf_OpenClose));
if (maxOfInitialBars > priorEP)
{
priorEP = maxOfInitialBars;
priorAF += periods.Increment;
if (priorAF > periods.AccelerationFactor)
priorAF = periods.AccelerationFactor;
}
}
else
{
priorAF = periods.Increment;
isUpTrend = false;
currentSAR = getHIGHofOpenClose(barID, searchCount);
priorEP = Barlar[barID].GetPrice(enuUseForCalculation.RealLowOf_OpenClose);
downTrendStartBarID = barID;
}
Barlar[barID].PSAR.ParSar = currentSAR;
priorSAR = currentSAR;
}
else
{
if (Barlar[barID].GetPrice(enuUseForCalculation.RealHighOf_OpenClose) <= currentSAR)
{
minOfInitialBars = priorEP;
for (int i = barID; i <= downTrendStartBarID; i++)
minOfInitialBars = Math.Min(minOfInitialBars, Barlar[i].GetPrice(enuUseForCalculation.RealLowOf_OpenClose));
if (minOfInitialBars < priorEP)
{
priorEP = minOfInitialBars;
priorAF += periods.Increment;
if (priorAF > periods.AccelerationFactor) priorAF = periods.AccelerationFactor;
}
}
else
{
priorAF = periods.Increment;
isUpTrend = true;
currentSAR = getLOWofOpenClose(barID, searchCount);
priorEP = Barlar[barID].GetPrice(enuUseForCalculation.RealHighOf_OpenClose);
upTrendStartBarID = barID;
}
Barlar[barID].PSAR.ParSar = currentSAR;
priorSAR = currentSAR;
}
}
}
private double getLOWofOpenClose(int barID, int pastBarsCount)
{
//barID numaralı bar ile birlikte
//geçmişteki pastBarsCount adet bar içindeki
//en düşük değeri döndürür.
double minOfBars;
minOfBars = Barlar[barID].GetPrice(enuUseForCalculation.RealLowOf_OpenClose);
for (int i = 1; i < pastBarsCount; i++)
minOfBars = Math.Min(minOfBars, Barlar[barID + i].GetPrice(enuUseForCalculation.RealLowOf_OpenClose));
return minOfBars;
}
private double getHIGHofOpenClose(int barID, int pastBarsCount)
{
//barID numaralı bar ile birlikte
//geçmişteki pastBarsCount adet bar içindeki
//en yüksek değeri döndürür.
double maxOfBars;
maxOfBars = Barlar[barID].GetPrice(enuUseForCalculation.RealHighOf_OpenClose);
for (int i = 1; i < pastBarsCount; i++)
maxOfBars = Math.Max(maxOfBars, Barlar[barID + i].GetPrice(enuUseForCalculation.RealHighOf_OpenClose));
return maxOfBars;
}
private int getFirstBarIDForCalculation(int _barID)
{//Recursive method
if(_barID == 0) return 0;
_barID--;
while (
Barlar[_barID].GetPrice(enuUseForCalculation.RealHighOf_OpenClose) < maxOfInitialBars
&
Barlar[_barID].GetPrice(enuUseForCalculation.RealLowOf_OpenClose) > minOfInitialBars
)
{
_barID--;
if (_barID == 0) return 0;
}
if (
Barlar[_barID].GetPrice(enuUseForCalculation.RealLowOf_OpenClose) > maxOfInitialBars
&
Barlar[_barID].GetPrice(enuUseForCalculation.RealLowOf_OpenClose) < minOfInitialBars
)
{
// bar.YUKSEK > maxof ve bar.DUSUK < minof olması durumunda değerleri güncelle
searchCount++;
maxOfInitialBars = getHIGHofOpenClose(_barID, searchCount);
minOfInitialBars = getLOWofOpenClose(_barID, searchCount);
_barID = getFirstBarIDForCalculation(_barID);
}
return _barID;
}
}
}
Böyle kazandırır.


Anlayan anlar.
PHP Code:
private void btnPerformPSAR_Click(object sender, RoutedEventArgs e)
{
double ratio=App.BIST.TradingGraph.GunlukBarlar[0].GercekKapanis / App.BIST.TradingGraph.GunlukBarlar[520].GercekKapanis;
var retStr = System.Windows.MessageBox.Show("Oran 520 -> 0 : " + Math.Round(ratio * 100, 0) + " Hesaplama uzun sürecek. Devam etmek?", "Onay", MessageBoxButton.YesNo);
if (retStr != MessageBoxResult.Yes)
{
return;
}
PSarSonuclari tabloSatirlari = new PSarSonuclari();
int id = 1;
int daysCountForPerformanceTest = 520;
//using (System.IO.StreamWriter file = new System.IO.StreamWriter(App.BIST.Klasor_INVENTOR_Sinyaller + "\\PSAR Performance.txt", false))
//{
//file.WriteLine("PSAR AL-SAT Hesabı : Son " + daysCountForPerformanceTest.ToString() + " günde 100 birim para kaç birim oldu ");
for (int search_count = 2; search_count <= 49; search_count++) //Minimum="2" Maximum="50" SmallChange="1"
{
int PSar_SearchCount = Convert.ToInt16(search_count);
//GÜNCELLEME ACCELERATION FACTOR DEĞERİ INIMUM 0.05 OLACAK ŞEKİLDE HESAPLAMA YAPILACAK
for (int acceleration_factor = 5; acceleration_factor <= 50; acceleration_factor++) //Minimum="0.05" OLACAK Maximum="0.50" SmallChange="0.01"
{
double PSar_AccelerationFactor = Math.Round((double)acceleration_factor / 100, 2);
for (int increment = 1; increment <= 200; increment++) // Minimum = "0.001" Maximum = "0.2" SmallChange = "0.001"
{
double PSar_Increment = Math.Round((double)increment / 1000, 3);
App.BIST.TradingGraph.Menkul.ResetPSAR_Period(PSar_AccelerationFactor, PSar_Increment, PSar_SearchCount);
clsCalculate_PSar pSar = new clsCalculate_PSar();
pSar.CalculatePSAR(App.BIST.TradingGraph.Menkul.indicatorPeriods.PSAR, App.BIST.TradingGraph.GunlukBarlar, true, daysCountForPerformanceTest);
//file.WriteLine("____________________________________________________________________________________________________");
//file.WriteLine("SearchCount:" + PSar_SearchCount.ToString() + " / " + "AccelerationFactor:" + PSar_AccelerationFactor.ToString() + " / " + "Increment:" + PSar_Increment.ToString());
//string methodOutput = AlSat_Performans_Hesapla_PSAR(hesaplanacakGunSayisi: daysCountForPerformanceTest);
//file.WriteLine(methodOutput);
//file.WriteLine("********");
int islemSayisi = 0;
double gainLoss = AlSat_Performans_Hesapla_PSAR(hesaplanacakGunSayisi: daysCountForPerformanceTest, ref islemSayisi);
PSarSonucu psonuc = new PSarSonucu
{
ID = id,
PSar_SearchCount = PSar_SearchCount,
PSar_Increment = PSar_Increment,
PSar_AccelerationFactor = PSar_AccelerationFactor,
GainWeight = Math.Round(gainLoss, 1),
islemSayisi = islemSayisi
};
id++;
tabloSatirlari.Add(psonuc);
//Console.WriteLine(id.ToString());
}
//Console.WriteLine(id.ToString());
}
Console.WriteLine(id.ToString());
}
//}
clsExportToExcel<PSarSonucu, PSarSonuclari> Tablo = new clsExportToExcel<PSarSonucu, PSarSonuclari>
{
dataToPrint = tabloSatirlari
};
Tablo.GenerateReport();
System.Windows.MessageBox.Show("Tamamlandı");
}
PHP Code:
private double AlSat_Performans_Hesapla_PSAR(int hesaplanacakGunSayisi, ref int _alisIslemiSayisi)
{
int alisIslemiSayisi = 0;
int satisIslemiSayisi = 0;
double birikmisPara = 100.0;
bool boolPozisyonda = false;
double lotBakiyesi = 0.0;
int hesaplamayaBaslanacakBarNumarasi = 0;
for (int i = hesaplamayaBaslanacakBarNumarasi + hesaplanacakGunSayisi; i >= hesaplamayaBaslanacakBarNumarasi; i--)
{
if (boolPozisyonda)
{
//pozisyonda: PSAR altında kapanış olduysa SAT
if (App.BIST.TradingGraph.GunlukBarlar[i].GercekKapanis < App.BIST.TradingGraph.GunlukBarlar[i].PSAR.ParSar)
{
birikmisPara = lotBakiyesi * App.BIST.TradingGraph.GunlukBarlar[i].GercekKapanis;
lotBakiyesi = 0;
satisIslemiSayisi++;
boolPozisyonda = false;
}
}
else
{
//pozisyonda değil: PSAR üzerinde kapanış olduysa AL
if (App.BIST.TradingGraph.GunlukBarlar[i].GercekKapanis >= App.BIST.TradingGraph.GunlukBarlar[i].PSAR.ParSar)
{
lotBakiyesi = birikmisPara / App.BIST.TradingGraph.GunlukBarlar[i].GercekKapanis;
birikmisPara = 0.0;
alisIslemiSayisi++;
boolPozisyonda = true;
}
}
}
//Son gün lotları paraya çevir
if (boolPozisyonda)
{
birikmisPara = lotBakiyesi * App.BIST.TradingGraph.GunlukBarlar[0].GercekKapanis;
satisIslemiSayisi++;
}
//return (birikmisPara.ToString("0") + " birim oldu. " + "Alış işlemi sayısı: " + alisIslemiSayisi);
_alisIslemiSayisi = alisIslemiSayisi;
return birikmisPara;
}
Yer İmleri