0 beğenilme 0 beğenilmeme
471 kez görüntülendi
Bir stratejinin içerisinde ELİS indikatörü koyuldu ve kaldıracı otomatik ayarlıyor ama başlangıç bakiyesi kaldıraç oranına göre vadeli piyasada değiştiği için bu işin içinden çıkamadım.Bu durumu çözebilen var mı ? varsa nasıl başardığını anlatabilir mi ?
Algoritmik Trading kategorisinde (406 puan) tarafından | 471 kez görüntülendi

1 cevap

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

Merhabalar,

Dilerseniz aşağıdaki örneği inceleyebilirsiniz.

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;

namespace Matriks.Lean.Algotrader
{
	public class ElisOrnek : 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("BTC_USDT_FBIN")]
		public string Symbol;

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

		[Parameter(0.005)]
		public decimal BuyOrderQuantity;

		[Parameter(0.005)]
		public decimal SellOrderQuantity;

		[Parameter(5)]
		public int MovPeriod;

		[Parameter(22)]
		public int MovPeriod2;

		// indikator tanımları.
		MOV mov;
		MOV mov2;

		// Gerekli Elis
		MatriksIndicator ELIS_IQ;

		[Parameter(Gears.Standard)]
		public Gears Gear;

		public enum Gears
		{
			Conservative = 1, Standard = 2, Average = 3, Risky = 4, Agressive = 5
		}

		[Output]
		public int KaldiracOrani = 3;
		// #Gerekli Elis

		public override void OnInit()
		{
			ELIS_IQ = new ELIS_IQ();
			ELIS_IQ.SetIndicatorParameters("Gear", Gear);
			ELIS_IQ.SetIndicatorParameters("Period", 50);

			RegisterUserIndicator(ELIS_IQ, Symbol, SymbolPeriod.Min60, OHLCType.Close, 5);

			AddSymbol(Symbol, SymbolPeriod);
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);
			mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Exponential);

			SendOrderSequential(true);
			WorkWithPermanentSignal(true);

			// kaldıraç tipi - true isolated, false cross
			SetLeverageType(Symbol, true);
		}

		public void FX_KaldiracAyarla()
		{
			if (KaldiracOrani != ELIS_IQ.CurrentValue)
			{
				KaldiracOrani = (int) ELIS_IQ.CurrentValue;
				SetLeverage(Symbol, KaldiracOrani);
				Debug("Kaldıraç oranı düzenlendi. " + KaldiracOrani);
			}
		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (barData.PeriodInfo == SymbolPeriod.ToPeriodInfo())
			{
				if (CrossAbove(mov, mov2) && LastOrderSide.Obj != Side.Buy)
				{
					FX_KaldiracAyarla();
					SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
					Debug("Alış Emri Gönderildi");
				}

				if (CrossBelow(mov, mov2) && LastOrderSide.Obj != Side.Sell)
				{
					FX_KaldiracAyarla();
					SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
					Debug("Satış Emri Gönderildi");
				}
			}
		}
	}
}

İyi çalışmalar.

(11,059 puan) tarafından
tarafından seçilmiş
0 0

Soru tam anlaşılamamış sanırım. (Ya da ben gönderdiğiniz ELIS örneğini anlayamadım.) Şöyle ki, siz order quantity'yi belirli bir değer girdikten sonra (örn. 1 BNB) ELİS kaldıracı ne yaparsa yapsın sistem 1 BNB alıp satacaktır. Kaldıraç 2x ise 0.5 BNB kadar bakiye kullanacaktır, kaldıraç 10x ise 0.1 BNB kadar bakiye kullanacaktır. Ama 1 BNB alıp satacaktır. Yani pozisyon büyüklüğünde bir değişiklik olmayacaktır. (BNB fiyatındaki değişim hariç.)

Benim aklıma şu geldi: Buy/sell order quantity'deki değeri 1x için yani kaldıraç olmadığı durum için girip, SendMarketOrder içindeki OrderQuantity'yi kaldıraç ile çarpmak? Aşağıda yaptım ama backtest falan yapıp denemedim ona göre. :D

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;

namespace Matriks.Lean.Algotrader
{
	public class I_ELIS : 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("BTC_USDT_FBIN")]
		public string Symbol;

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

		[Parameter(0.005)]
		public decimal BuyOrderQuantity;

		[Parameter(0.005)]
		public decimal SellOrderQuantity;

		[Parameter(5)]
		public int MovPeriod;

		[Parameter(22)]
		public int MovPeriod2;

		// indikator tanımları.
		MOV mov;
		MOV mov2;

		// Gerekli Elis
		MatriksIndicator ELIS_IQ;

		[Parameter(Gears.Standard)]
		public Gears Gear;

		public enum Gears
		{
			Conservative = 1, Standard = 2, Average = 3, Risky = 4, Agressive = 5
		}

		[Output]
		public int KaldiracOrani = 3;

		ELIS elis;

		public override void OnInit()
		{
			elis = ELISIndicator(Symbol, SymbolPeriod, OHLCType.Close, 50, ElisGear.Standard);

			AddSymbol(Symbol, SymbolPeriod);
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);
			mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Exponential);

			SendOrderSequential(true);
			WorkWithPermanentSignal(true);

			// kaldıraç tipi - true isolated, false cross
			SetLeverageType(Symbol, true);
		}

		public void FX_KaldiracAyarla()
		{
			if (KaldiracOrani != ELIS_IQ.CurrentValue)
			{
				KaldiracOrani = (int) ELIS_IQ.CurrentValue;
				SetLeverage(Symbol, KaldiracOrani);
				Debug("Kaldıraç oranı düzenlendi. " + KaldiracOrani);
			}
		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (barData.PeriodInfo == SymbolPeriod.ToPeriodInfo())
			{
				if (CrossAbove(mov, mov2) && LastOrderSide.Obj != Side.Buy)
				{
					FX_KaldiracAyarla();
					SendMarketOrder(Symbol, BuyOrderQuantity*KaldiracOrani, OrderSide.Buy);
					Debug("Alış Emri Gönderildi");
				}

				if (CrossBelow(mov, mov2) && LastOrderSide.Obj != Side.Sell)
				{
					FX_KaldiracAyarla();
					SendMarketOrder(Symbol, SellOrderQuantity*KaldiracOrani, OrderSide.Sell);
					Debug("Satış Emri Gönderildi");
				}
			}
		}
	}
}

 

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,636 soru
8,590 cevap
4,821 yorum
19,786 kullanıcı