0 beğenilme 0 beğenilmeme
502 kez görüntülendi
Merhaba, iki adet indikatör ile 5 dakikalık grafikte Binance Futures için strateji oluşturmak istiyorum. İndikatörlerden biri MACDAS diğeri Stokastik RSI.

Stokastik RSI'da K değeri, D değerini YUKARI kestiğinde ve aynı zamanda MACDAS'da MACD çizgisi yönünü yukarı verdiğinde LONG girecek.

Stokastik RSI'da D değeri, K değerini AŞAĞI kestiğinde ve aynı zamanda MACDAS'da MACD çizgisi yönünü aşağı verdiğinde SHORT girecek.

Ve tabii pozisyona girmeden önce mevcut pozisyondan çıkış yapacak.

Bu konuda yardımcı olursanız sevinirim.
Indikator Builder kategorisinde (14 puan) tarafından | 502 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

 Merhabalar,

İstediğiniz strateji aşağıda verilmiştir.

Lütfen inceleyiniz.

***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***

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 macdas1 : 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(26)]
			public int MacdasLongPeriod1;

		[Parameter(12)]
			public int MacdasShortPeriod1;

		[Parameter(9)]
			public int MacdasTriggerPeriod1;

		[Parameter(14)]
			public int StochasticrsiRsiPeriod1;

		[Parameter(14)]
			public int StochasticrsiStochasticPeriod1;

		[Parameter(3)]
			public int StochasticrsiKPeriod1;

		[Parameter(3)]
			public int StochasticrsiDPeriod1;

		[Parameter(MovMethod.E)]
			public MovMethod StochasticrsiSmoothMethod1;



		MACDAS macdas;
		StochasticRSI stochasticRSI;

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);
			macdas = MACDASIndicator(Symbol, SymbolPeriod, OHLCType.Close, MacdasLongPeriod1, MacdasShortPeriod1, MacdasTriggerPeriod1);
			stochasticRSI = StochasticRSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, StochasticrsiRsiPeriod1, StochasticrsiStochasticPeriod1, StochasticrsiKPeriod1, StochasticrsiDPeriod1, StochasticrsiSmoothMethod1);

			// 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(stochasticRSI, stochasticRSI, 0, 1) && macdas.Value[0][macdas.CurrentIndex] > macdas.Value[1][macdas.CurrentIndex])
			{
				// Gerekli açığa satış
				FX_Alis(Symbol, BuyOrderQuantity);
	
				// #Gerekli açığa satış
			}

				if (CrossBelow(stochasticRSI, stochasticRSI, 0, 1) && macdas.Value[0][macdas.CurrentIndex] < macdas.Value[1][macdas.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 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 = 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 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			
		}
	}
}

İyi çalışmalar.

(11,059 puan) tarafından
8,724 soru
8,668 cevap
4,862 yorum
20,483 kullanıcı