MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
0 beğenilme 0 beğenilmeme
84 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 (52 puan) tarafından | 84 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.

(3,714 puan) tarafından
tarafından seçilmiş
4,248 soru
4,218 cevap
2,915 yorum
3,152 kullanıcı