0 beğenilme 0 beğenilmeme
426 kez görüntülendi
BolRsiStrategy stratejisini binance'de vadeli işlemlerde kullanmak istiyorum. Stratejiye kaldıraçla kullanıma uygun hale nasıl getirebilirim ?
Algoritmik Trading kategorisinde (14 puan) tarafından | 426 kez görüntülendi

2 Cevaplar

0 beğenilme 0 beğenilmeme

Merhabalar,
Aşağıda yer alan bağlantıya tıklayınız. Daha sonra dosya üzerine çift tıklayıp IQ içerisine alınız.
Lütfen düşük lotlarda test ortamında ve gerçek hesapta emir gönderimi yapınız.
Emin olmadan, beklediğiniz sonuçları almadan gerçek hesapta işlemlere girmeyiniz.
Dosya: https://destek.matriksdata.com/?qa=blob&qa_blobid=5183470001464294149

İyi çalışmalar.

(3,041 puan) tarafından
0 beğenilme 0 beğenilmeme
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 BolRsi : MatriksAlgo
	{
		[SymbolParameter("SOL_USDT_FBIN")]
		public string Symbol;

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

		[Parameter(14)]
		public int RsiPeriod;

		[Parameter(MovMethod.Variable)]
		public MovMethod MovMethod;

		[Parameter(20)]
		public int BolPeriod;

		[Parameter(2.2)]
		public decimal StandartDeviation;

		[Parameter(26)]
		public int DownLevel;

		[Parameter(72)]
		public int UpLevel;

		[Parameter(1)]
		public decimal BuyOrderQuantity;

		[Parameter(1)]
		public decimal SellOrderQuantity;

		[Parameter(8)]
		public decimal İzSuren;

		//[Parameter(10)]
		public decimal KarAl;


		[Output]
		public decimal Kapanis;
		[Output]
		public decimal Bollinger_Ust_Bant;
		[Output]
		public decimal Bollinger_Alt_Bant;
		[Output]
		public decimal RSI;

		BOLLINGER bollinger;
		RSI rsi;


		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, RsiPeriod);
			bollinger = BollingerIndicator(Symbol, SymbolPeriod, OHLCType.Close, BolPeriod, StandartDeviation, MovMethod);

			// Gerekli açığa satış
			WorkWithPermanentSignal(true);
			SendOrderSequential(true);
			SendOrderSequential(true, HangiIslemleBaslasin);
			SendOrderSequentialForShort(false, 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(rsi, DownLevel) && bollinger.BollingerDown.CurrentValue > barData.BarData.Close)
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);

				//TakeProfit(Symbol, SyntheticOrderPriceType.Percent, KarAl);
				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, İzSuren);
				// #Gerekli açığa satış
			}

			if (CrossBelow(rsi, UpLevel) && bollinger.Bollingerup.CurrentValue < barData.BarData.Close)
			{
				// Gerekli açığa satış
				FX_Satis(Symbol, SellOrderQuantity);

				//TakeProfit(Symbol, SyntheticOrderPriceType.Percent, KarAl);
				TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, İzSuren);
				// #Gerekli açığa satış
			}

			Kapanis = barData.BarData.Close;
			Bollinger_Ust_Bant = Math.Round(bollinger.Bollingerup.CurrentValue, 2);
			Bollinger_Alt_Bant = Math.Round(bollinger.BollingerDown.CurrentValue, 2);
			RSI = Math.Round(rsi.CurrentValue, 2);
		}

		// Gerekli açığa satış
		[Parameter(1)]
		public int Kaldirac;

		[Parameter(true)]
		public bool AcigaSatisYapilsin;

		[Parameter(false)]
		public bool AksamSeansiniDahilEt;

		[Parameter(Side.All)]
		public Side HangiIslemleBaslasin;

		public void FX_Alis(string sembol, decimal quantity)
		{
			if (LastOrderSide.Obj != Side.Buy)
			{
				if (sentetikEmirdenMI)
					LastOrderSide.Obj = Side.All;

				sentetikEmirdenMI = false;

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

		public void FX_Satis(string sembol, decimal quantity)
		{
			if (LastOrderSide.Obj != Side.Sell)
			{
				if (sentetikEmirdenMI)
					LastOrderSide.Obj = Side.All;

				sentetikEmirdenMI = false;

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

		bool sentetikEmirdenMI = true;

		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 Sembol;
			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 - Timestamp

		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.Sembol, 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.Sembol, 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.Sembol = 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			
		}
	}
}

 

(406 puan) tarafından
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.



8,639 soru
8,593 cevap
4,826 yorum
19,831 kullanıcı