0 beğenilme 0 beğenilmeme
1,725 kez görüntülendi
Selamlar,

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
Algoritmik Trading kategorisinde (200 puan) tarafından | 1,725 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme
En İyi Cevap
Merhabalar,

Stoploss için SMA_Bitmex_TPSL hazır stratejisini inceleyebilirsiniz. Stoploss kodunu al/sat emirlerini verdikten sonra yazmanız yeterli olacaktır. Tetiklendiğinde otomatik olarak çalışacaktır.

İyi çalışmalar
(4,555 puan) tarafından
tarafından seçilmiş
0 0

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

		}

	}

}

 

0 0
Yorumunuzda paylaştığınız kodu düzenledim ve stoploss ekledim. İnceleyebilirsiniz.
0 0

selamlar , kodu derle derken aşağıdaki gibi hatalar alıyorum. nedemek bu hatalar?

0 0
aşağıdaki koda ekleyebilirmisiniz rica etsem

 

 

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;

 

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

Debug("Alış emri gonderildi.");

FirstRun = 1;

}

else

{

SendMarketOrder(Symbol, BuyOrderQuantity * 2, (OrderSide.Buy));

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

}

}

}

}
0 0

Merhaba, paylaştığım kodda sorun yok. Oluşturduğunuz strateji ile benim paylaştığım kodun isimleri aynı değil. Onu düzeltirseniz çalışır.

Stratejiye verdiğiniz adla altta belirttiğim alanda bulunan isimlerin aynı olması gerekli.

public class PMAX_Strategy : MatriksAlgo

 

1 0
çok teşekkürler dönüşünüz için.
8,636 soru
8,590 cevap
4,821 yorum
19,790 kullanıcı