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