MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
0 beğenilme 0 beğenilmeme
74 kez görüntülendi

Merhabalar, Aşağıda paylaştığım strateji için binans vadelide açığa satış yapması için açığa satmak ve kaldıraç ayarları eklenebilir mi?

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

namespace Matriks.Lean.Algotrader
{
	public class asdasd : MatriksAlgo
	{
		// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
		// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.


		[SymbolParameter("GARAN")]
		public string Symbol;


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


		[Parameter(10)]
		public int EmaOpenPeriod1;

		[Parameter(10)]
		public int EmaClosePeriod2;

		[Parameter(1)]
		public decimal BuyOrderQuantity;

		[Parameter(1)]
		public decimal SellOrderQuantity;

		EMA ema;
		EMA ema2;



		public override void OnInit()
		{
			var periodInfo = GetHeikinAshiPeriodInfo(SymbolPeriod);

			ema = EMAIndicator(Symbol, periodInfo, OHLCType.Open, EmaOpenPeriod1);
			ema2 = EMAIndicator(Symbol, periodInfo, OHLCType.Close, EmaClosePeriod2);

			SendOrderSequential(true, Side.Buy);
			WorkWithPermanentSignal(true);
		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (ema.Value[0][ema.CurrentIndex] < ema2.Value[0][ema2.CurrentIndex] && LastOrderSide.Obj!=Side.Buy)
			{
				SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:false);
				Debug("Alış emri gönderildi.");
			}
			
			if (ema.Value[0][ema.CurrentIndex] > ema2.Value[0][ema2.CurrentIndex] && LastOrderSide.Obj!=Side.Sell)
			{				
				SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:false);
				Debug("Satış emri gönderildi.");
			}			
		}
	}
}

 

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

1 cevap

0 beğenilme 0 beğenilmeme

 Merhabalar,

Lütfen aşağıdaki sistemi inceleyiniz.

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 dy : 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(10)]
		public int EmaOpenPeriod1;

		[Parameter(10)]
		public int EmaClosePeriod2;



		EMA ema;
		EMA ema2;


		public override void OnInit()
		{
			var periodInfo = GetHeikinAshiPeriodInfo(SymbolPeriod);

			ema = EMAIndicator(Symbol, periodInfo, OHLCType.Open, EmaOpenPeriod1);
			ema2 = EMAIndicator(Symbol, periodInfo, OHLCType.Close, EmaClosePeriod2);
			// 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 (ema.Value[0][ema.CurrentIndex] < ema2.Value[0][ema2.CurrentIndex])
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);

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

			if (ema.Value[0][ema.CurrentIndex] > ema2.Value[0][ema2.CurrentIndex])
			{
				// 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

			}
		}

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

		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.

(4,369 puan) tarafından
0 0
Çok teşekkürler.

Yanlız bir sıkıntı var. Testlerde çok mükemmel çıkmasına rağmen realde çokta iyi gitmiyor. Testlerle karşılaştırdığımda işlemleri hep 1 bar sonra açıyor ve kapatıyor. Buda beklenen sonucu vermiyor. Acaba ben mi bi yerde yanlış yapıyorum bilemedim.
0 0

Merhabalar,

Bizler kalıcı sinyal ile çalıştığımız için reel de sinyal oluştuktan bir bar sonra işlem yapar. 

Bu sebeple bir bar sonra işlem olması doğrudur. Dilerseniz aşağıdaki linki inceleyiniz.

https://destek.matriksdata.com/?qa=6696/ge%C3%A7ici-sinyal-nedir-ne-de%C4%9Fildir&show=6696#q6696

İyi çalışmalar.

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.



4,536 soru
4,524 cevap
3,050 yorum
3,370 kullanıcı