MOST ve Directional Indicator verileri kullanılır.
Directional Indicator, teknik analizde en iyi trend gösteren indikatörlerden biridir.
DI+ yüzdesel olarak yukarı hareketi, DI– ise aşağı hareket oranını temsil eder.
Strateji, DI+ değeri DI–’nın üzerine kırdığında veya MOST’un hareketli ortalama komponenti MOST’un üzerine kırdığında alış,
bu koşullardan herhangi biri tersine döndüğünde ise satış emri gönderir.
using System; using System.Collections.Generic; using System.Linq; using Matriks.Data.Symbol; using Matriks.Engines; 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 MostDICross : 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.Min60)] public SymbolPeriod SymbolPeriod; [Parameter(100)] public decimal BuyOrderQuantity; [Parameter(100)] public decimal SellOrderQuantity; [Parameter(14)] public int DIPeriod; [Parameter(4)] public int MOSTPeriod; [Parameter(1)] public decimal Percentage; DI di; MOST most; public override void OnInit() { di = DIIndicator(Symbol, SymbolPeriod, OHLCType.Close, DIPeriod); most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, MOSTPeriod, Percentage, MovMethod.Exponential); 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 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); } /// <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) { Debug("most.ExMOV.CurrentValue " + Math.Round(most.ExMOV.CurrentValue, 2)); Debug("most.CurrentValue " + Math.Round(most.CurrentValue, 2)); Debug("di.Pdi.CurrentValue " + Math.Round(di.Pdi.CurrentValue, 2) + " di.Mdi.CurrentValue " + Math.Round(di.Mdi.CurrentValue, 2)); if (CrossAbove(di.Pdi, di.Mdi) || CrossAbove(most.ExMOV, most)) { SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy)); Debug("Alış emri gönderildi."); } if (CrossBelow(di.Pdi, di.Mdi) || CrossBelow(most.ExMOV, most)) { SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell)); Debug("Satış emri gönderildi."); } } /// <summary> /// Strateji durdurulduğunda bu fonksiyon tetiklenir. /// </summary> public override void OnStopped() { } } }