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() { } } }