0 beğenilme 0 beğenilmeme
364 kez görüntülendi

Merhaba;

Long/Short düzeni ile çalışmasını istediğim stratejim stop olduğunda sonraki emrin lot sayısında yanlışlık olması sebebiyle bozuluyor. Yardımlarınız için şimdiden teşekkürler.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
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;
using Matriks.AI;
using Matriks.AI.AiParameters;
using Matriks.AI.Data;
using Matriks.Trader.Core.TraderModels;

namespace Matriks.Lean.Algotrader
{
	public class SOTT_11_CROSS : MatriksAlgo
	{
		[SymbolParameter("BNB_USDT_FBIN")]
			public string Symbol1;
		[Parameter(SymbolPeriod.Min15)]
			public SymbolPeriod SymbolPeriod1;
		[Parameter(13)]
			public int SottPeriodK1;
		[Parameter(142)]
			public int SottPeriodSlowK1;
		[Parameter(10)]
			public int SottOttPeriod1;
		[Parameter(0.6)]
			public decimal SottOttOpt1;
		[Parameter(MovMethod.VAR)]
			public MovMethod SottOttMethod1;
		[Parameter(MovMethod.VAR)]
			public MovMethod SottStosKMethod1;
		[Parameter(1)]
			public decimal OrderQuantity1;
		[Parameter(false)]
			public bool IsReduceOnly1;
		[Parameter(false)]
			public bool IsReduceOnly2;
		[Parameter(20)]
			public decimal Leverage2;
		[Parameter(false)]
			public bool IsReduceOnly3;
		[Parameter(CryptoLeverageType.Isolated)]
			public CryptoLeverageType LeverageType3;
		[Parameter(1)]
			public decimal OrderQuantity4;
		[Parameter(false)]
			public bool IsReduceOnly4;
		[Parameter(false)]
			public bool IsReduceOnly5;
		[Parameter(20)]
			public decimal Leverage5;
		[Parameter(false)]
			public bool IsReduceOnly6;
		[Parameter(CryptoLeverageType.Isolated)]
			public CryptoLeverageType LeverageType6;
		
		SOTT sott;

		int FirstRun = 0;
		int realposition = 0;

		public override void OnInit()
		{

			sott = SOTTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, SottPeriodK1, SottPeriodSlowK1, SottOttPeriod1, SottOttOpt1, SottOttMethod1, SottStosKMethod1);

			SetLeverage(Symbol1, Leverage2);
			SetLeverageType(Symbol1, LeverageType3);
			SetLeverage(Symbol1, Leverage5);
			SetLeverageType(Symbol1, LeverageType6);

			SendOrderSequential(true, Side.All);
			WorkWithPermanentSignal(true);
		}
		public override void OnInitCompleted()
		{
		}
		public override void OnTimer()
		{
		}
		public override void OnNewsReceived(int newsId, List<string> relatedSymbols)
		{
		}
		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(sott, sott, 0, 1))
			{
				if (FirstRun == 0)
				{
					SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false, isReduceOnly : IsReduceOnly1);
					FirstRun = 1;
				}
				else
				{
					SendMarketOrder(Symbol1, OrderQuantity1 * 2, OrderSide.Buy, includeAfterSession:false, isReduceOnly : IsReduceOnly1);
				}
			}
			if (CrossBelow(sott, sott, 0, 1))
			{
				if (FirstRun == 0)
				{
					SendMarketOrder(Symbol1, OrderQuantity4, OrderSide.Sell, includeAfterSession:false, isReduceOnly : IsReduceOnly4);
					FirstRun = 1;
				}
				else
				{
					SendMarketOrder(Symbol1, OrderQuantity4 * 2, OrderSide.Sell, includeAfterSession:false, isReduceOnly : IsReduceOnly4);
				}
			}
		}
	}
}

 

Algoritmik Trading kategorisinde (112 puan) tarafından | 364 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme
En İyi Cevap

 Merhabalar,

Sisteminizi aşağıdaki gibi inceleyebilirsiniz.

İz süren, kar al ve zarar durdur satırları mevcuttur.(110. satırdan itibaren, 125. satırdan itibaren)

Kullanmak istemediğinizi silip test edebilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.AI;
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;
namespace Matriks.Lean.Algotrader
{
	public class dyigitus : MatriksAlgo
	{
		[SymbolParameter("BTC_USDT_FBIN")]
			public string Symbol;
		[Parameter(SymbolPeriod.Min5)]
			public SymbolPeriod SymbolPeriod;
		[Parameter(0.003)]
			public decimal BuyOrderQuantity;
		[Parameter(0.003)]
			public decimal SellOrderQuantity;
		[Parameter(13)]
			public int SottPeriodK1;
		[Parameter(142)]
			public int SottPeriodSlowK1;
		[Parameter(10)]
			public int SottOttPeriod1;
		[Parameter(0.6)]
			public decimal SottOttOpt1;
		[Parameter(MovMethod.VAR)]
			public MovMethod SottOttMethod1;
		[Parameter(MovMethod.VAR)]
			public MovMethod SottStosKMethod1;

		[Parameter(0.6)]
			public decimal İz_Suren;
		[Parameter(0.6)]
			public decimal Kar_Al;
		[Parameter(0.6)]
			public decimal Zarar_Durdur;

		SOTT sott;


		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			sott = SOTTIndicator(Symbol, SymbolPeriod, OHLCType.Close, SottPeriodK1, SottPeriodSlowK1, SottOttPeriod1, SottOttOpt1, SottOttMethod1, SottStosKMethod1);

			// Gerekli açığa satış
			WorkWithPermanentSignal(true);
			SendOrderSequential(true, HangiIslemleBaslasin);
			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

		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(sott, sott, 0, 1))
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);

				// #Gerekli açığa satış
			}

			if (CrossBelow(sott, sott, 0, 1))
			{
				// Gerekli açığa satış
				FX_Satis(Symbol, SellOrderQuantity);

				// #Gerekli açığa satış
			}
		}

		// Gerekli açığa satış
		[Parameter(3)]
			public int Kaldirac;
		[Parameter(true)]
			public bool AcigaSatisYapilsin;
		[Parameter(false)]
			public bool AksamSeansiniDahilEt;
		[Parameter(Side.All)]
			public Side HangiIslemleBaslasin;

		public void FX_Alis(string Symbol, decimal quantity)
		{
			if (LastOrderSide.Obj != Side.Buy)
			{
				var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(Symbol, _quantity, OrderSide.Buy, includeAfterSession:AksamSeansiniDahilEt);
				Debug("Alış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSideForShort = LastOrderSide;
				sentetikEmirdenMI = false;
				//sentetikemirler
				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, İz_Suren);
				TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_Al);
				StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur);
			}
		}

		public void FX_Satis(string Symbol, decimal quantity)
		{
			if (LastOrderSide.Obj != Side.Sell)
			{
				var _quantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || sentetikEmirdenMI) ? quantity:(LastOrderSideForShort.Obj == Side.All) ? quantity:quantity * 2; SendMarketOrder(Symbol, _quantity, OrderSide.Sell, includeAfterSession:AksamSeansiniDahilEt);
				Debug("Satış emri gönderildi.[ " + _quantity + " adet ]");
				LastOrderSideForShort = LastOrderSide;
				sentetikEmirdenMI = false;
				//sentetikemirler
				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, İz_Suren);
				TakeProfit(Symbol, SyntheticOrderPriceType.PricePoint, Kar_Al);
				StopLoss(Symbol, SyntheticOrderPriceType.PricePoint, Zarar_Durdur);
			}
		}

		bool sentetikEmirdenMI = false;

		public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
		{
			if (sOrder.EnableOrderSending)
			{
				if (AcigaSatisYapilsin)
				{
					LastOrderSide.Obj = Side.All;
					sentetikEmirdenMI = true;
				} Debug("Sentetik emir tetiklendi");
			}
		}
		// #Gerekli açığa satış 

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

		// #Gerekli
		public override void OnTimer()
		{
			// Gerekli - Timestamp
			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
		}
	}
}

İyi çalışmalar.

(11,069 puan) tarafından
tarafından seçilmiş
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,516 soru
7,519 cevap
4,405 yorum
8,755 kullanıcı