Merhaba, aşağıdaki koda (%1.5) izsüren stop ekleyebilir misiniz ? Birde sistem alış yaptığında pozisyonu ya sat sinyaliyle shorta geçirsin ya da %1.5 izsüren stop ile kapatsın, aynı şekilde shorttaykende ya al sinyali ile al a geçirsin ya da %1.5 iz süren stop ile poz kapatsın. Backtesti bu koşullara göre yapmak istiyorum.

 

Kısa sürede dönebilirseniz sevinirim.

 

İyi çalışmalar.

 

 

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;

 

//=======================================ACIKLAMA===============================================//

// Bar kapanışı bir önceki barın kapanışının üstünde olan barları sıralı olarak sayar                      //

// (bar bir önceki kapanıştan aşağı kapattığında sıra bozulmaktadır, sayım sıfırlanır)                     //

// bu sayı belirlenen parametreyi geçtiğinde alım yapılır. Aynı şekilde aşağı kapanan barlar da   //

// sayılmaktadır, asagi barlar serisi belirlenen parametreye geldiginde satış yapar.                        //

// Output(cikti parametreleri) eklenmistir.                                                                                        //

 

namespace Matriks.Lean.Algotrader

{

            public class SerialUp_Kopya : 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.Min5)]

                        public SymbolPeriod SymbolPeriod;

 

                        [Parameter(3)]

                        public int ConsecutiveBarsUp;

 

                        [Parameter(3)]

                        public int ConsecutiveBarsDown;

 

                        [Parameter(100)]

                        public decimal BuyOrderQuantity;

 

                        [Parameter(100)]

                        public decimal SellOrderQuantity;

 

                        public int upCounter = 0;

                        public int downCounter = 0;

 

                        [Output]

                        public decimal sonBarKapanisi;

                        [Output]

                        public decimal oncekiBarKapanisi;

                        [Output]

                        public int upcounter;

                        [Output]

                        public int downcounter;

 

                        public override void OnInit()

                        {

                                    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);

                        }

 

                        /// <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 voidOnDataUpdate(BarDataEventArgs barData)

                        {

                                    var barDataModel = GetBarData();

 

                                    Debug("DataUpdate");

                                    //Debug("this bar's close: " + barDataModel.Close[barData.BarDataIndex -1] + " last: " + barDataModel.Close[barData.BarDataIndex -2]);

 

                                    if(barDataModel.Close[barData.BarDataIndex -1] > barDataModel.Close[barData.BarDataIndex -2])

                                    {

                                               Debug("this bar's close: " + barDataModel.Close[barData.BarDataIndex -1] + " > last: " + barDataModel.Close[barData.BarDataIndex -2]);

                                               if (downCounter != 0)

                                               {

                                                           downCounter = 0;

                                                           Debug("downCounter reset");

                                               }

                                               upCounter += 1;

                                               Debug("upCounter = " + upCounter);

                                    }

 

                                    if(barDataModel.Close[barData.BarDataIndex -1] < barDataModel.Close[barData.BarDataIndex -2])

                                    {

                                               Debug("this bar's close: " + barDataModel.Close[barData.BarDataIndex -1] + " < last: " + barDataModel.Close[barData.BarDataIndex -2]);

                                               if (upCounter != 0)

                                               {

                                                           upCounter = 0;

                                                           Debug("upCounter reset");

                                               }

                                               downCounter += 1;

                                               Debug("downCounter = " + downCounter);

                                    }

 

                                    if (upCounter >= ConsecutiveBarsUp)

                                    {

                                               SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);

                                               Debug("Alış Emri Gönderildi");

                                    }

 

                                    if (downCounter >= ConsecutiveBarsDown)

                                    {

                                               SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);

                                               Debug("Satış Emri Gönderildi");

                                    }

 

                                    sonBarKapanisi = barDataModel.Close[barData.BarDataIndex -1];

                                    oncekiBarKapanisi = barDataModel.Close[barData.BarDataIndex - 2];

                                    upcounter = upCounter;

                                    downcounter = downCounter;

                        }

 

                        /// <summary>

                        /// Strateji durdurulduğunda bu fonksiyon tetiklenir.

                        /// </summary>

                        public override void OnStopped()

                        {

                        }

            }

}