namespace Matriks.Lean.Algotrader
{
    public class MOSTRSIStratejisi : MatriksAlgo
    //strateji ismini burada deklare ediyoruz. Dosyada ki isimle stratejide yazılan
    // isim tamamen aynı olmalıdır. (küçük büyük harf duyarlı)
    {
        // Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili
        // bir parametre ise, "SymbolParameter" ile, değilse "Parameter" ile tanımlama
        //yaparız. Parantez içindeki değerler default değerleridir.
        [SymbolParameter("GARAN")]
        public string Symbol;//Sembol ismi

        [Parameter(SymbolPeriod.Day)]
        public SymbolPeriod SymbolPeriod;
        //Stratejiyi çalıştırmak istediğimiz bar periyodu

        [Parameter(100)]
        public int BuyOrderCount;
        //alım miktarı için kullanacağımız parametre

        [Parameter(100)]
        public int SellOrderCount;
        //satım miktarı için kullanacağımız parametre

        [Parameter(14)]
        public int periodRsi;
        //RSI periyodu için kullanacağımız parametre

        [Parameter(3)]
        public int periodMost;
        //MOST periyodu için kullanacağımız parametre

        [Parameter(2)]
        public decimal percentage;
        //MOST yüzde paremetresi için kullanacağımız parametre
        
        //Kullanacağımız indikatör obje tanımları
        RSI rsi;
        MOST most;

        // Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit
        //işlemleri,indikator ekleme, haberlere kayıt olma işlemleri burada yapılır.
        public override void OnInit()
        {
            //tanımladığımız objelere indikatör tanımlarını ve gerekli değerleri
            //atıyoruz
            rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, periodRsi);
            most = MOSTIndicator(rsi, periodMost, percentage, MovMethod.Exponential);

            //Sembol ve periyoduna kayıt
            AddSymbol(Symbol, SymbolPeriod);

            // Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını
            //belirliyoruz. true değer, algoritmanın sadece yeni bar açılışlarında
            //çalışmasını sağlar, bu fonksiyonu çağırmazsak veya false olarak
            //belirlersek her işlem olduğunda algoritma
            //tetiklenecektir.
            WorkWithPermanentSignal(true);

            //Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu
            //true set edilir.
            //Alttaki satırı silerek veya false geçerek emirlerin sirayla
            //gönderilmesini engelleyebilirsiniz.
            SendOrderSequential(true);
        }

        // Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu
        //fonksiyon tetiklenir.
        //Dolayısıyla asıl al/sat stratejisini yazacağımız bölümdür
        public override void OnDataUpdate(BarDataEventArgs barData)
        {
            //Bu koşul alım emri içindir. Eğer grafikte MOST'un EXMOV bandı
            //most bandını yukarı kırarsa al emri gönderilecek.
            if (CrossAbove(most.CurrentValue, most.ExMOV))
            {
                //Parametrelerde belirlenen sembolden, belirlenen miktarda, piyasa
                //fiyatından alış emri gönderir
                SendMarketOrder(Symbol, BuyOrderCount, (OrderSide.Buy));

                //"" içerisinde bulunan ifadeyi debug penceresine basar
                Debug("Alış Emri Gönderildi");

                //EXMOV değerini debug penceresine basar
                Debug("exmov:" + Math.Round(most.ExMOV.CurrentValue, 2));

                //MOST değerini debug penceresine basar
                Debug("most:" + Math.Round(most.CurrentValue, 2));
            }

            //Bu koşul satım emri içindir. Eğer grafikte MOST'un EXMOV bandı
            //most bandını aşağı kırarsa sat emri gönderilecek.
            if (CrossBelow(most.CurrentValue, most.ExMOV))
            {
                //Parametrelerde belirlenen sembolden, belirlenen miktarda, piyasa
                //fiyatından satış emri gönderir
                SendMarketOrder(Symbol, SellOrderCount, (OrderSide.Sell));

                //"" içerisinde bulunan ifadeyi debug penceresine basar
                Debug("Satış Emri Gönderildi");

                //EXMOV değerini debug penceresine basar
                Debug("exmov:" + Math.Round(most.ExMOV.CurrentValue, 2));

                //MOST değerini debug penceresine basar
                Debug("most:" + Math.Round(most.CurrentValue, 2));
            }
        }
    }
}