MatriksİQ için Stoploss kodu
- Soruldu
- Kategori
- Algoritmik Trading
- Görüntülenme
- 2.527 görüntülenme
- Durum
- Çözüldü
Kullandığım sistemlerin içine stoploss kodu eklemek istiyorum.
Hem backtest yapabileceğim hemde sistemin içinde kullanabileceğim şekilde stoploss kodu paylaşabilirmisiniz?
Birde kod yazmayı bilmediğim için . stoploss kodunu hangi satırlara yapıştıracağımı da söyleyebilirmisiniz?
Teşekkürler



Selamlar,
denedim ama olmuyor , Pmax kodu aşağıdaki gibi. siz son haline getirilmesi için yardımcı olabilir misiniz?
* eğer alım yaptıktan sonra %x kadar düştüğünde bar kapanışını beklemeden sat. ( stoploss )
tşk.
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 PMAX_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("XBT_USD_BMEX")] public string Symbol; [Parameter(SymbolPeriod.Min60)] public SymbolPeriod SymbolPeriod; [Parameter(100)] public int BuyOrderQuantity; [Parameter(100)] public int SellOrderQuantity; [Parameter(10)] public int ATRPeriod; [Parameter(10)] public int MovPeriod; [Parameter(3)] public decimal Coefficient; [Parameter(MovMethod.E)] public MovMethod MovMethod; [Parameter(true)] public bool AcigaSatisYapilsin; //Burdaki değer ile yüzdeli stoploss kurulur. [Parameter(1)] public decimal Zarar_Durdur_Yuzdesi; int FirstRun = 0; int realposition = 0; PMaxIndicator pmax; 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); //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(!AcigaSatisYapilsin); } /// <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) { 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)) { if (FirstRun == 0) { SendMarketOrder(Symbol, BuyOrderQuantity, (OrderSide.Buy)); StopLoss(Symbol, SyntheticOrderPriceType.Percent, Zarar_Durdur_Yuzdesi); Debug("Alış emri gonderildi."); FirstRun = 1; } else { SendMarketOrder(Symbol, BuyOrderQuantity * 2, (OrderSide.Buy)); StopLoss(Symbol, SyntheticOrderPriceType.Percent, Zarar_Durdur_Yuzdesi); Debug("Alış emri gonderildi."); } } if (CrossBelow(pmax.KLine, pmax)) { if (FirstRun == 0) { SendMarketOrder(Symbol, SellOrderQuantity, (OrderSide.Sell)); Debug("Satış emri gonderildi."); FirstRun = 1; } else { SendMarketOrder(Symbol, SellOrderQuantity * 2, (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); } } } }