0 beğenilme 0 beğenilmeme
485 kez görüntülendi
kullandığım strateji içerisine iz süren stoploss ekledim ancak çalışmadığını fark ettim. Nerede hata yapıyorum söyler misiniz ?

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using Matriks.Data.Symbol;

using Matriks.Engines;

using Matriks.Indicators;

using Matriks.Symbols;

using Matriks.Trader.Core;

using Matriks.Trader.Core.Fields;

using Matriks.Lean.Algotrader.AlgoBase;

using Matriks.Lean.Algotrader.Models;

using Matriks.Lean.Algotrader.Trading;

 

namespace Matriks.Lean.Algotrader

{

public class AlphaTrendAlgo : MatriksAlgo

{

[SymbolParameter("FGARAN")]

public string Symbol;

 

[Parameter(SymbolPeriod.Min5)]

public SymbolPeriod SymbolPeriod;

 

[Parameter(5)]

public decimal BuyOrderQuantity;

 

[Parameter(5)]

public decimal SellOrderQuantity;

 

[Parameter(1)]

public decimal AlphatrendCoeff1;

 

[Parameter(14)]

public int AlphatrendPeriod1;

 

[Parameter(Momentum.MFI)]

public Momentum AlphatrendMomentum1;

 

 

[Parameter(3)]

public int KaldiracOrani;

 

 

[Parameter(6)]

public decimal TrailingStopLevel1;

 

 

 

[Parameter(1)]

public decimal StopLevel1;

 

 

MatriksIndicator AlphaTrend_IQ;

 

 

public override void OnDataUpdate(BarDataEventArgs barData)

{

if (CrossBelow(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))

{

TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, TrailingStopLevel1);

TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);

FX_Alis();

}

 

if (CrossAbove(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))

{

TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, TrailingStopLevel1);

TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);

FX_Satis();

}

}

 

public override void OnInit()

{

AddSymbol(Symbol, SymbolPeriod);

AlphaTrend_IQ = new AlphaTrend_IQ();

 

AlphaTrend_IQ.SetIndicatorParameters("Coeff", AlphatrendCoeff1);

AlphaTrend_IQ.SetIndicatorParameters("Period", AlphatrendPeriod1);

AlphaTrend_IQ.SetIndicatorParameters("Momentum", AlphatrendMomentum1); RegisterUserIndicator(AlphaTrend_IQ, Symbol, SymbolPeriod, OHLCType.Close, 5);

 

 

// Gerekli

WorkWithPermanentSignal(true);

 

if (AcigaSatisYapilsin)

{

SendOrderSequential(true, Side.All);

SendOrderSequentialForShort(true, Side.All);

}else

{

SendOrderSequential(true, Side.Buy);

}

// #Gerekli

 

// kaldıraç oranı

SetLeverage(Symbol, KaldiracOrani);

// kaldıraç tipi – true isolated, false cross

SetLeverageType(Symbol, true);

// Gerekli

 

}

 

[Parameter(false)]

public bool AcigaSatisYapilsin;

 

[Parameter(false)]

public bool AksamSeansiniDahilEt;

 

List<string> orderIDList = new List<string>();

 

public void FX_Alis()

{

string _orderID = string.Empty; ;

decimal _quantity = 0;

 

if (LastOrderSide.Obj != Side.Buy)

{

if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)

{

_orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

_quantity = BuyOrderQuantity;

}else

{

if (LastOrderSideForShort.Obj == Side.All)

{

_orderID = SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

_quantity = BuyOrderQuantity;

}else

{

_orderID = SendMarketOrder(Symbol, BuyOrderQuantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);

_quantity = BuyOrderQuantity * 2;

}

}

 

if (_orderID != string.Empty && _quantity != 0)

{

orderIDList.Add(_orderID);

Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSide.Obj = Side.Buy;

LastOrderSideForShort.Obj = Side.Buy;

}

}

}

 

public void FX_Satis()

{

string _orderID = string.Empty; ;

decimal _quantity = 0;

 

if (LastOrderSide.Obj != Side.Sell)

{

if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)

{

_orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

_quantity = SellOrderQuantity;

 

}else

{

if (LastOrderSideForShort.Obj == Side.All)

{

_orderID = SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

_quantity = SellOrderQuantity;

 

 

}else

{

_orderID = SendMarketOrder(Symbol, SellOrderQuantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);

_quantity = SellOrderQuantity * 2;

 

}

}

 

 

if (_orderID != string.Empty && _quantity != 0)

{

orderIDList.Add(_orderID);

Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");

LastOrderSide.Obj = Side.Sell;

LastOrderSideForShort.Obj = Side.Sell;

}

}

}

 

public override void OnOrderUpdate(IOrder order)

{

if (order.OrdStatus.Obj == OrdStatus.Filled)

{

// Senntetik emirler tanımlanıyor

// StopLoss(Symbol, SyntheticOrderPriceType.Percent, 1);

// TakeProfit(Symbol, SyntheticOrderPriceType.Percent, 1);

if (!orderIDList.Contains(order.CliOrdID) && AcigaSatisYapilsin)

{

LastOrderSideForShort.Obj = Side.All;

Debug("Sentetik emir tetiklendi");

}

}

}

// #Gerekli

}

}
Algoritmik Trading kategorisinde (18 puan) tarafından | 485 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Aşağıdaki yapı ile birlikte test edebilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;

namespace Matriks.Lean.Algotrader
{
	public class alphavadeli : MatriksAlgo
	{
		[SymbolParameter("GARAN")]
		public string Symbol;


		[Parameter(SymbolPeriod.Min5)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(5)]
		public decimal BuyOrderQuantity;

		[Parameter(5)]
		public decimal SellOrderQuantity;

		[Parameter(1)]
			public decimal AlphatrendCoeff1;

		[Parameter(14)]
			public int AlphatrendPeriod1;

		[Parameter(Momentum.MFI)]
			public Momentum AlphatrendMomentum1;

		[Parameter(3)]
		public int Kaldirac;

		[Parameter(6)]
		public decimal TrailingStopLevel1;

		[Parameter(1)]
		public decimal StopLevel1;

		MatriksIndicator AlphaTrend_IQ;

		public override void OnDataUpdate(BarDataEventArgs barData)
		{

			// alış koşulu
			if (CrossBelow(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);
				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, TrailingStopLevel1);
				TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);
				// #Gerekli açığa satış
			}

			// satış koşulu
			if (CrossAbove(AlphaTrend_IQ, AlphaTrend_IQ, 0, 1))
			{
				// Gerekli açığa satış
				FX_Satis(Symbol, SellOrderQuantity);
				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, TrailingStopLevel1);
				TakeProfit(Symbol, SyntheticOrderPriceType.Percent, StopLevel1);
				// #Gerekli açığa satış
			}

		}

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);

			AlphaTrend_IQ = new AlphaTrend_IQ();

			AlphaTrend_IQ.SetIndicatorParameters("Coeff", AlphatrendCoeff1);
			AlphaTrend_IQ.SetIndicatorParameters("Period", AlphatrendPeriod1);
			AlphaTrend_IQ.SetIndicatorParameters("Momentum", AlphatrendMomentum1); RegisterUserIndicator(AlphaTrend_IQ, Symbol, SymbolPeriod, OHLCType.Close, 5);


			// Gerekli açığa satış
			WorkWithPermanentSignal(true);

			if (HangiIslemleBaslasin == yon.Alis)
			{
				SendOrderSequential(true, Side.Buy);
			}else if (HangiIslemleBaslasin == yon.Satis)
			{
				SendOrderSequential(true, Side.Sell);
			}else
			{
				SendOrderSequential(true, Side.All);
			}

			SendOrderSequentialForShort(true, Side.All);
			// #Gerekli açığa satış

			// Gerekli - Kaldıraç			
			SetLeverage(Symbol, Kaldirac); // kaldıraç oranı			
			SetLeverageType(Symbol, true); // kaldıraç tipi - true isolated, false cross
			// #Gerekli - Kaldıraç

			// Gerekli - Timestamp
			SetTimerInterval(1);
			// #Gerekli - Timestamp
		}

		// Gerekli açığa satış
		[Parameter(true)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

		[Parameter(yon.Farketmez)]
		public yon HangiIslemleBaslasin;

		public enum yon
		{
			Alis, Satis, Farketmez
		}

		public void FX_Alis(string Symbol, decimal quantity)
		{
			decimal _quantity = 0;

			if (LastOrderSide.Obj != Side.Buy)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
					_quantity = quantity;
				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						SendMarketOrder(Symbol, quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity;
					}else
					{
						SendMarketOrder(Symbol, quantity * 2, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity * 2;
					}
				}

				Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSide.Obj = Side.Buy;
				LastOrderSideForShort.Obj = Side.Buy;
			}
		}

		public void FX_Satis(string Symbol, decimal quantity)
		{
			decimal _quantity = 0;

			if (LastOrderSide.Obj != Side.Sell)
			{
				if (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin)
				{
					SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
					_quantity = quantity;
				}else
				{
					if (LastOrderSideForShort.Obj == Side.All)
					{
						SendMarketOrder(Symbol, quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity;

					}else
					{
						SendMarketOrder(Symbol, quantity * 2, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
						_quantity = quantity * 2;
					}
				}

				Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSide.Obj = Side.Sell;
				LastOrderSideForShort.Obj = Side.Sell;
			}
		}

		// Gerekli - Timestamp
		public class OrderListTimestamp
		{
			public string ID;
			public string Symbol;
			public decimal Adet;
			public decimal Fiyat;
			public OrdType EmirTipi;
			public OrderSide orderSide;
			public string EmirYonu;
			public DateTime TetiklenmeZamani;
			public int Sayac;
			public bool AktifMI;
		}

		Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();

		[Parameter(3)]
		public int AyniEmirKacSeferGonderilsin;

		[Parameter(10)]
		public int KacSaniyeSonraTekrarGonderilsin;

		string orderIDTimestamp = string.Empty;

		public override void OnTimer()
		{
			var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);

			if (tutt.Count() >0)
			{
				foreach (var deger in tutt)
				{
					LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;

					if (deger.Value.EmirTipi.Obj == OrdType.Limit)
					{
						orderIDTimestamp = SendLimitOrder(deger.Value.Symbol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);
						Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
					}else if (deger.Value.EmirTipi.Obj == OrdType.Market)
					{
						orderIDTimestamp = SendMarketOrder(deger.Value.Symbol, deger.Value.Adet, deger.Value.orderSide);
						Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
					}

					deger.Value.ID = orderIDTimestamp;
					deger.Value.AktifMI = false;
					timestampDict[orderIDTimestamp] = deger.Value;
					timestampDict.Remove(deger.Key);

				}
			}
		}
		// #Gerekli - Timestamp

		public override void OnOrderUpdate(IOrder order)
		{
			// Gerekli - Timestamp
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{
				if (timestampDict.ContainsKey(order.CliOrdID))
				{
					timestampDict.Remove(order.CliOrdID);
					Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
				}
			}

			if (order.OrdStatus.Obj == OrdStatus.Rejected)
			{
				if (!timestampDict.ContainsKey(order.CliOrdID))
				{
					OrderListTimestamp orderList = new OrderListTimestamp();
					orderList.ID = order.CliOrdID;
					orderList.Symbol = order.Symbol;
					orderList.Adet = order.OrderQty;
					orderList.Fiyat = order.Price;
					orderList.EmirTipi = order.OrdType;
					orderList.TetiklenmeZamani = DateTime.Now;
					orderList.Sayac = 0;
					orderList.AktifMI = false;

					if (order.Side.Obj == Side.Buy)
					{
						orderList.orderSide = OrderSide.Buy;
						orderList.EmirYonu = "Alış";
					}else
					{
						orderList.orderSide = OrderSide.Sell;
						orderList.EmirYonu = "Satış";
					}

					timestampDict[order.CliOrdID] = orderList;
				}

				if (order.Text.Contains("Timestamp"))
				{
					if (timestampDict.ContainsKey(order.CliOrdID))
					{
						if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)
						{
							timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
							timestampDict[order.CliOrdID].Sayac++;
							timestampDict[order.CliOrdID].AktifMI = true;

							Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");
						}else
						{
							timestampDict.Remove(order.CliOrdID);
							Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");
						}
					}
				}
			}
		}
		// #Gerekli - Timestamp
		public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
		{
			if (sOrder.EnableOrderSending)
			{
				LastOrderSide.Obj = LastOrderSideForShort.Obj;
				Debug("Sentetik emir tetiklendi");
			}
		}
		// #Gerekli açığa satış
	}
}

İyi çalışmalar.

(11,069 puan) tarafından
0 0
Teşekkürler.Ellerinize sağlık.
Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.



7,511 soru
7,515 cevap
4,405 yorum
8,752 kullanıcı