namespace Matriks.Lean.Algotrader
{//strateji ismini burada deklare ediyoruz. Dosyada ki isimle stratejide yazılan isim tamamen aynı olmalıdır. (küçük büyük harf duyarlı)
    public class SimpleTMAHullMA : MatriksAlgo
    {
        //canlı, backtest ve backtest optimization kısımlarında değiştirilebilir olması istenilen parametreler bu bölümde yazılır
        // Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,

        [SymbolParameter("XU100")]
        public string Symbol;//Sembol ismi

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

        [Parameter(22)]
        public int HullMAPeriod;//Moving average periyodu için kullanacağımız parametre

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

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

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

        TMA tma;//TMA indikatörü türünde tma isminde bir obje tanımlıyoruz

        HullMA hullMA;//HullMA indikatörü türünde hullMA isminde bir obje tanımlıyoruz

        public override void OnInit()
        {

            //tanımladığımız objelere indikatör tanımlarını ve gerekli değerleri atıyoruz
            hullMA = HullMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, HullMAPeriod);
            tma = TMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, TmaPeriod);

            //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);
        }

        //Kayıt olunan sembol veya indikatörler 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)
        {
            var barDataModel = GetBarData();
            //Bu koşul alım emri içindir. Eğer grafikte fiyat çubukları hullMA bandını yukarı kırarsa ve 
            //o anki hullMA değeri, tma değerinin altındaysa al emri gönderilecek.
            if (CrossAbove(barDataModel, hullMA, OHLCType.Close, 0) && hullMA.CurrentValue<tma.CurrentValue)
            {
                //Parametrelerde belirlenen sembolden, belirlenen miktarda, piyasa fiyatından alış emri gönderir
                SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
                //bar kapanışını debug penceresine basar
                Debug("Close = " + barData.BarData.Close);
                //HullMA değerini debug penceresine basar
                Debug("HullMA = " + hullMA.CurrentValue);
                //TMA değerini debug penceresine basar
                Debug("TMA = " + tma.CurrentValue);
                //"" içerisinde bulunan ifadeyi debug penceresine basar
                Debug("Alış Emri Gönderildi");

            }
            //Bu koşul satım emri içindir. Eğer grafikte fiyat çubukları hullMA bandını aşağı kırarsa ve 
            //o anki hullMA değeri, tma değerinin üstündeyse sat emri gönderilecek.
            if (CrossBelow(barDataModel, hullMA, OHLCType.Close, 0) && hullMA.CurrentValue>tma.CurrentValue)
            {
                //Parametrelerde belirlenen sembolden, belirlenen miktarda, piyasa fiyatından satış emri gönderir
                SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
                //bar kapanışını debug penceresine basar
                Debug("Close = " + barData.BarData.Close);
                //HullMA değerini debug penceresine basar
                Debug("HullMA = " + hullMA.CurrentValue);
                //TMA değerini debug penceresine basar
                Debug("TMA = " + tma.CurrentValue);
                //"" içerisinde bulunan ifadeyi debug penceresine basar
                Debug("Satış Emri Gönderildi");

            }
        }

        /// <summary>
        /// Strateji durdurulduğunda bu fonksiyon tetiklenir.
        /// </summary>
        public override void OnStopped()
        {
        }
    }
}