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