0 beğenilme 0 beğenilmeme
315 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 | 315 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.

(4,526 puan) tarafından
0 0
Teşekkürler.Ellerinize sağlık.
5,709 soru
5,776 cevap
3,679 yorum
4,575 kullanıcı