merhaba aşağıda belirtilen stratejiyi kullanırken açığa satış yapılsın seçersem vadeli de kullanabilir miyim ?
yada pmax vadeli de kullanmam için strateji oluşturmam da yardımcı olur musunuz ?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Matriks.Data.Symbol; using Matriks.Engines; using Matriks.Indicators; using Matriks.Lean.Algotrader.AlgoBase; using Matriks.Lean.Algotrader.Models; using Matriks.Trader.Core; using Matriks.Trader.Core.Fields; //*******************************************************ACIKLAMA*******************************************************// //Kıvanç Özbilgiç'in hazirladigi PMAX indikatorunun kullanildigi bir stratejidir. Alim/Satim sinyalleri Cross Fonksiyonu //kullanilarak elde edilir. Strateji LONG/SHORT pozisyon almaktadir. Kalici sinyal ve sirasiz emir ile calismaktadir. //Ilk emir gonderildiginde isaretlenir, ve daha sonraki emirler ilk emrin 2 kati olarak gonderilir. Boylece pozisyon 1/0 //seklinde degil, 1/-1 seklinde alinabilmektedir (LONG/NEUTRAL yerine LONG/SHORT). Ek olarak OnOrderUpdate fonksiyonu ile //Algo icerisinde gercek zamanli pozisyon takibi de yapilmaktadir. AcigaSatisYapilsin kutusu isaretlenmedigi taktirde //aciga satis yapilmayacaktir ve emirler sirali olarak gonderilecektir. namespace Matriks.Lean.Algotrader { public class pmaxpara : 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("GENTS")] public string Symbol; [Parameter(SymbolPeriod.Min60)] public SymbolPeriod SymbolPeriod; [Parameter(10)] public int ATRPeriod; [Parameter(10)] public int MovPeriod; [Parameter(3)] public decimal Coefficient; [Parameter(MovMethod.E)] public MovMethod MovMethod; [Parameter(false)] public bool AcigaSatisYapilsin; int FirstRun = 0; int realposition = 0; PMaxIndicator pmax; // Başlangıç bakiyesi [Parameter(10000)] public decimal Bakiye; // Başlangıç adet [Parameter(0)] public decimal StartQuantity; // Tutar public decimal Amount; // Al sat adedi public decimal Quantity; // Bakiye kontrolü public bool BalanceControl = true; // strateji hisse senedi ile mi coin ile mi kullanılacak [Parameter(true)] public bool HisseSenedi; /// <summary> /// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri, /// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır. /// </summary> public override void OnInit() { pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod); 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); SendOrderSequential(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. } /// <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) { // Bardata verileri var barDataModel = GetBarData(); // Son fiyat var Close = barData.BarData.Close; // Güncel bakiye ile alış yapıp yapamayacağınız kontrolü ediliyor. true ise alış yapabilir if (HisseSenedi) { BalanceControl = (Math.Floor(Bakiye / Close) >0) ? true: false; } if (!AcigaSatisYapilsin) FirstRun = 0; var pmaxKline = Math.Round(pmax.KLine.CurrentValue, 2); var pmaxSTline = Math.Round(pmax.StLine.CurrentValue, 2); Debug("***********************************************"); Debug("pmaxSTline = " + pmaxSTline); Debug("pmaxKline = " + pmaxKline); if (CrossAbove(pmax.KLine, pmax.StLine) && BalanceControl == true && Bakiye > 0.00000001m); { // Alabileceği adet if (HisseSenedi) { Quantity = Math.Floor(Bakiye / Close); }else { Quantity = Bakiye / Close; } // Tutar Amount = Quantity * Close; // Güncel bakiye Bakiye -= Amount; SendMarketOrder(Symbol, Quantity, (OrderSide.Buy)); Quantity += StartQuantity; StartQuantity = 0; Debug("Alış Sinayli Oluştu. Fiyat: " + Close + " - Adet: " + Quantity + " - Tutar: " + Amount + " - Kalan Bakiye: " + Bakiye); if (CrossAbove(pmax.KLine, pmax.StLine)) { SendMarketOrder(Symbol, Quantity, (OrderSide.Buy)); Debug("Alış emri gonderildi."); } Quantity += StartQuantity; // Tutar Amount = Quantity * Close; // Güncel bakiye Bakiye += Amount; if (CrossBelow(pmax.KLine, pmax) && (Quantity != 0 || StartQuantity != 0)) { SendMarketOrder(Symbol, Quantity, (OrderSide.Sell)); Debug("Satış sinyali oluştu. Fiyat: " + Close + " - Adet: " + Quantity + " - Tutar: " + Amount + " - Kalan Bakiye: " + Bakiye); Quantity = 0; StartQuantity = 0; } else if (Close<Ref(barDataModel, OHLCType.Close, 1) && Quantity == 0) { Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Kalan Bakiye: " + Bakiye); } else if (CrossBelow(pmax.KLine, pmax.StLine)) { SendMarketOrder(Symbol, Quantity, (OrderSide.Sell)); Debug("Satış emri gonderildi."); } } } public override void OnOrderUpdate(IOrder order) { //Gercek zamanli pozisyon takibi if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy) { var positionChange = order.OrderQty; realposition += (int) positionChange; Debug("[ONORDERUPDATE]: Pozisyon = " + realposition); } if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell) { var positionChange = order.OrderQty; realposition -= (int) positionChange; Debug("[ONORDERUPDATE]: Pozisyon = " + realposition); } } } }