namespace Matriks.Lean.Algotrader
{
public class SimpleRSI_SMA : MatriksAlgo
{
// 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;
[Parameter(SymbolPeriod.Day)]
public SymbolPeriod SymbolPeriod;
[Parameter(100)]
public decimal BuyOrderQuantity;
[Parameter(100)]
public decimal SellOrderQuantity;
[Parameter(10)]
public int MovPeriod;
[Parameter(2)]
public int RsiPeriod;
RSI rsi;
SMA sma10;
SMA sma200;
[Output]
public decimal HareketliOrtalama_10;
[Output]
public decimal HareketliOrtalama_200;
[Output]
public decimal RSI;
public override void OnInit()
{
sma10 = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod);
sma200 = SMAIndicator(Symbol, SymbolPeriod, OHLCType.Close, 200);
rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, RsiPeriod);
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);
//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
//SetTimerInterval(3);
}
/// <summary>
/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir
/// </summary>
public override void OnInitCompleted()
{
}
/// <summary>
/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
public override void OnDataUpdate(BarDataEventArgs barData)
{
var barDataModel = GetBarData();
var close = barData.BarData.Close;
if (rsi.CurrentValue < 10 && barData.BarData.Close > sma200.CurrentValue)
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
Debug("Close = " + barData.BarData.Close);
Debug("200 SMA = " + sma200.CurrentValue);
Debug("rsi = " + rsi.CurrentValue);
Debug("Alış Emri Gönderildi");
}
if (barData.BarData.Close > sma10.CurrentValue)
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
Debug("Close = " + barData.BarData.Close);
Debug("10 SMA = " + sma10.CurrentValue);
Debug("rsi = " + rsi.CurrentValue);
Debug("Satış Emri Gönderildi");
}
else
{
Debug("Beklemede");
if (rsi.CurrentValue>10)
{
Debug("Rsi ALIS kosulu gerceklesmedi");
Debug("RSI = " + rsi.CurrentValue + " > 10");
}
if (barData.BarData.Close < sma200.CurrentValue)
{
Debug("SMA ALIS kosulu gerceklesmedi");
Debug("Close = " + barData.BarData.Close + " < " + "sma200 = " + sma200.CurrentValue);
}
if (barData.BarData.Close < sma10.CurrentValue) //sadece stok varsa olacak
{
Debug("SMA SATIS kosulu gerceklesmedi");
Debug("Close = " + barData.BarData.Close + " < " + "10 SMA = " + sma10.CurrentValue);
}
}
HareketliOrtalama_10 = Math.Round(sma10.CurrentValue, 2);
HareketliOrtalama_200 = Math.Round(sma200.CurrentValue, 2);
RSI = Math.Round(rsi.CurrentValue, 2);
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
}
}