namespace Matriks.Lean.Algotrader { //Strateji ismini burada deklare ediyoruz. //Dosya daki isimle stratejide yazılan isim tamamen aynı olmalıdır. (küçük büyük harf duyarlı) public class BolRsiStrategy : MatriksAlgo { //canlı, backtest ve backtest optimization kısımlarında değiştirilebilir olması //istenilen parametreler bu bölümde yazılır [SymbolParameter("AKBNK")] public string Symbol;//Sembol ismi [Parameter(SymbolPeriod.Day)] public SymbolPeriod SymbolPeriod;//Stratejiyi çalıştırmak istediğimiz bar periyodu [Parameter(1)] public decimal BuyOrderQuantity;//Alım miktarı için kullanacağımız parametre [Parameter(1)] public decimal SellOrderQuantity;//Satım miktarı için kullanacağımız parametre [Parameter(11)] //RSI periyodu için kullanacağımız parametre public int RsiPeriod; [Parameter(MovMethod.E)] public MovMethod MovMethod;//BOLLINGER indikatörünü hesaplamak için kullanacağımız hareketli ortalama metodu parametre [Parameter(15)] public int BolPeriod; //BOLLINGER periyodu için kullanacağımız parametre [Parameter(2)] public decimal StandartDeviation;//BOLLINGER indikatörünü hesaplamak için kullanacağımız standart sapma değeri [Output] public decimal Kapanis; [Output] public decimal Bollinger_Ust_Bant; [Output] public decimal Bollinger_Alt_Bant; [Output] public decimal RSI; // indikator tanımları. BOLLINGER bollinger;//BOLLINGER indikatörü türünde bollinger isminde bir obje tanımlıyoruz RSI rsi;//RSI indikatörü türünde rsi isminde bir obje tanımlıyoruz public override void OnInit() { rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, RsiPeriod); bollinger = BollingerIndicator(Symbol, SymbolPeriod, OHLCType.Close, BolPeriod, StandartDeviation, MovMethod); AddSymbol(Symbol, SymbolPeriod); // Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur. // true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız //veya false geçerseniz her işlem olduğunda algoritma tetiklenir. WorkWithPermanentSignal(true); //Eger 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. public override void OnDataUpdate(BarDataEventArgs barData) { /*Debug("*********************************"); Debug("Close = " + barData.BarData.Close); Debug("bollinger ust bant = " + Math.Round(bollinger.Bollingerup.CurrentValue, 4)); Debug("bollinger alt bant = " + Math.Round(bollinger.BollingerDown.CurrentValue, 4)); Debug("rsi = " + Math.Round(rsi.CurrentValue, 2));*/ if (CrossAbove(rsi, rsi.DownLevel) && bollinger.BollingerDown.CurrentValue > barData.BarData.Close) { SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy)); Debug("Close = " + barData.BarData.Close); Debug("BOLLINGER DOWN = " + bollinger.BollingerDown.CurrentValue); Debug("rsi = " + Math.Round(rsi.CurrentValue, 2)); Debug("Alış Emri Gönderildi"); } if (CrossBelow(rsi, rsi.UpLevel) && bollinger.Bollingerup.CurrentValue < barData.BarData.Close) { SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell)); Debug("Close = " + barData.BarData.Close); Debug("BOLLINGER UP = " + Math.Round(bollinger.Bollingerup.CurrentValue, 4)); Debug("rsi = " + Math.Round(rsi.CurrentValue, 2)); Debug("Satış Emri Gönderildi"); } Kapanis = barData.BarData.Close; Bollinger_Ust_Bant = Math.Round(bollinger.Bollingerup.CurrentValue, 2); Bollinger_Alt_Bant = Math.Round(bollinger.BollingerDown.CurrentValue, 2); RSI = Math.Round(rsi.CurrentValue, 2); } /// <summary> /// Strateji durdurulduğunda bu fonksiyon tetiklenir. /// </summary> public override void OnStopped() { } } }