Parabolik SAR (Stop and Reverse), J. Welles Wilder Jr. tarafından geliştirilmiş ve finansal piyasalarda trend takibi amacıyla kullanılan bir teknik analiz aracıdır. Bu gösterge, fiyat hareketlerini izleyerek trendin devam edip etmeyeceğini ve olası dönüş noktalarını belirlemeye yardımcı olur. “Parabolik SAR nedir?” sorusu, genel anlamda trendin yön değiştirdiği seviyeleri saptamaya yarayan bir gösterge olarak yanıtlanabilir. “SAR” kısaltması, “Stop and Reverse” ifadesinden gelir ve bu da fiyat yönündeki olası değişimleri işaret eden seviyeleri temsil eder.
Parabolik SAR, fiyatın hareket yönüne bağlı olarak yukarı ya da aşağı doğru parabolik bir eğri oluşturan bir indikatördür. Yükseliş trendlerinde SAR noktaları fiyatın altında yer alır ve zamanla yukarı doğru hareket eder. Bu durum, “parabolik artış” ifadesinin neyi ifade ettiğini de ortaya koyar. Düşüş trendlerinde ise noktalar fiyatın üzerinde oluşur ve aşağı yönlü bir eğri çizer. Fiyatın bu SAR noktasını kırması, trendin yön değiştirdiğine işaret eder ve bu durum “Stop and Reverse” (durdur ve tersine dön) sinyali olarak değerlendirilir.
Parabolik SAR, hareketli ortalamalara benzer biçimde trend takibi yapar; ancak daha hassas bir yapıya sahiptir ve fiyat değişimlerine karşı daha çabuk tepki verir.
Parabolic SAR indikatörünün al/sat sinyallerine göre işlem gerçekleştirir. Yalnızca uzun pozisyon açar ve kapatır; bu durum SendOrderSequential(true);
ayarı ile belirlenmiştir. 60 dakikalık grafikte Parabolic SAR alt kanalda ise alım yapılır, üst kanalda ise mevcut pozisyon kapatılır. Parabolic SAR parametreleri ve işlem yapılacak sembolün periyodu kullanıcı tarafından değiştirilebilir.
using System; using System.Collections.Generic; using System.Linq; using Matriks.Data.Symbol; using Matriks.Engines; using System.Windows.Media; using Matriks.Indicators; using Matriks.Symbols; using Matriks.AlgoTrader; using Matriks.Trader.Core; using Matriks.Trader.Core.Fields; using Matriks.Trader.Core.TraderModels; using Matriks.Lean.Algotrader.AlgoBase; using Matriks.Lean.Algotrader.Models; using Matriks.Lean.Algotrader.Trading; using Matriks.Data.Tick; using Matriks.Enumeration; using Matriks.IntermediaryInstitutionAnalysis.Enums; using Newtonsoft.Json; namespace Matriks.Lean.Algotrader { public class ParabolicSAR_Strategy : 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("BTC_BUSD_FBIN")] public string Symbol; [Parameter(0.01)] public decimal Quantity; [Parameter(SymbolPeriod.Min)] public SymbolPeriod SymbolPeriod; [Parameter(0.02)] public decimal Acceleration_factor; [Parameter(0.2)] public decimal MaxAcc; [Parameter(SymbolPeriod.Min60)] public SymbolPeriod PSar_Period; ParabolicSAR parabolicSar; public override void OnInit() { AddSymbol(Symbol, SymbolPeriod); //AddSymbol(Symbol, PSar_Period); parabolicSar = ParabolicSARIndicator(Symbol, PSar_Period, Acceleration_factor, MaxAcc); //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); WorkWithPermanentSignal(true); } /// <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(BarDataCurrentValues barDataCurrentValues) { var barDataModel = GetBarData(); var close = barDataCurrentValues.LastUpdate.Close; if (parabolicSar.CurrentValue < close) { Debug($"Parabolic SAR {PSar_Period} @{parabolicSar.CurrentValue} < close @ {close}"); SendMarketOrder(Symbol, Quantity, OrderSide.Buy); Debug($"Alis emri gonderildi"); } else if (parabolicSar.CurrentValue > close) { Debug($"Parabolic SAR {PSar_Period} @{parabolicSar.CurrentValue} > close @ {close}"); SendMarketOrder(Symbol, Quantity, OrderSide.Sell); Debug($"Satis emri gonderildi"); } } /// <summary> /// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir. /// </summary> /// <param name="order">Emrin son durumu</param> public override void OnOrderUpdate(IOrder order) { if (order.OrdStatus.Obj == OrdStatus.Filled) { } } /// <summary> /// Strateji durdurulduğunda bu fonksiyon tetiklenir. /// </summary> public override void OnStopped() { } } }
Parabolic SAR FUTURE #
Parabolic SAR indikatörü, al/sat durumuna göre işlem yapar ve uzun/short pozisyon açabilir. 60 dakikalık grafikte, Parabolic SAR alt kanalda ise uzun pozisyon, üst kanalda ise kısa pozisyon alınmaktadır. Parabolic SAR parametreleri ve işlem yapılacak sembol için periyotlar kullanıcı tarafından değiştirilebilir.
using System; using System.Collections.Generic; using System.Linq; using Matriks.Data.Symbol; using Matriks.Engines; using System.Windows.Media; using Matriks.Indicators; using Matriks.Symbols; using Matriks.AlgoTrader; using Matriks.Trader.Core; using Matriks.Trader.Core.Fields; using Matriks.Trader.Core.TraderModels; using Matriks.Lean.Algotrader.AlgoBase; using Matriks.Lean.Algotrader.Models; using Matriks.Lean.Algotrader.Trading; using Matriks.Data.Tick; using Matriks.Enumeration; using Matriks.IntermediaryInstitutionAnalysis.Enums; using Newtonsoft.Json; namespace Matriks.Lean.Algotrader { public class ParabolicSAR_Future : 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("BTC_USDT_FBIN")] public string Symbol; [Parameter(0.01)] public decimal Quantity; [Parameter(SymbolPeriod.Min)] public SymbolPeriod SymbolPeriod; [Parameter(0.02)] public decimal Acceleration_factor; [Parameter(0.2)] public decimal MaxAcc; [Parameter(SymbolPeriod.Min60)] public SymbolPeriod PSar_Period; ParabolicSAR parabolicSar; public int position = 0; public override void OnInit() { AddSymbol(Symbol, SymbolPeriod); parabolicSar = ParabolicSARIndicator(Symbol, PSar_Period, (decimal) Acceleration_factor, (decimal) MaxAcc); //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(false); WorkWithPermanentSignal(true); } /// <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="barDataCurrentValues">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param> public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues) { var barDataModel = GetBarData(); var close = barDataCurrentValues.LastUpdate.Close; if (parabolicSar.CurrentValue < close) { Debug($"Parabolic SAR {PSar_Period} @{parabolicSar.CurrentValue} < close @ {close}"); if (position == 0) { SendMarketOrder(Symbol, Quantity, OrderSide.Buy); Debug($"Alis emri gonderildi"); position = 1; } else if (position == -1) { SendMarketOrder(Symbol, 2 * Quantity, OrderSide.Buy); Debug("Kisa pozisyondan uzun pozisyona geciliyor. Alis emri gonderildi"); position = 1; } } else if (parabolicSar.CurrentValue > close) { Debug($"Parabolic SAR {PSar_Period} @{parabolicSar.CurrentValue} > close @ {close}"); if (position == 0) { SendMarketOrder(Symbol, Quantity, OrderSide.Sell); Debug("Satis emri gonderildi"); position = -1; } else if (position == 1) { SendMarketOrder(Symbol, 2 * Quantity, OrderSide.Buy); Debug("Uzun pozisyondan kisa pozisyona geciliyor. Satis emri gonderildi"); position = -1; } } } /// <summary> /// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir. /// </summary> /// <param name="order">Emrin son durumu</param> public override void OnOrderUpdate(IOrder order) { if (order.OrdStatus.Obj == OrdStatus.Filled) { } } /// <summary> /// Strateji durdurulduğunda bu fonksiyon tetiklenir. /// </summary> public override void OnStopped() { } } }