0 beğenilme 0 beğenilmeme
986 kez görüntülendi
Merhabalar;

Rsi-Ema kesişimi için bakiyenin tamamı kadar al sat kodlarını paylaşabilirmisiniz, mesela 10000 tl ile hisse alımı yapacak veya 1000 usd lik btc alımı yapacak sonra bakiyenin tamamını satacak oluşan bakiyenin tamamı kadar da alım işlemi yapacak, benzer bir kod paylaşmışsınız most indikatörü için ama buna uyarlıyamadım, yardımcı olursanız sevinirim. Algoritma sihirbazında yaptığım kod aşağıdadır, bunu bakiyenin tamamı şeklinde yazabilirseniz sevinirim.

 

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 RSIEMA1 : 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_BIN")]

public string Symbol1;

 

 

[Parameter(SymbolPeriod.Min60)]

public SymbolPeriod SymbolPeriod1;

 

 

[Parameter(14)]

public int RsiPeriod1;

 

[Parameter(13)]

public int EmaPeriod1;

 

[Parameter(0.017)]

public decimal OrderQuantity1;

 

[Parameter(0.017)]

public decimal OrderQuantity2;

 

RSI rsi;

EMA ema;

 

 

 

public override void OnInit()

{

 

rsi = RSIIndicator(Symbol1, SymbolPeriod1, OHLCType.WClose, RsiPeriod1);

ema = EMAIndicator(rsi, EmaPeriod1);

 

SendOrderSequential(false);

WorkWithPermanentSignal(true);

 

//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.

// SetTimerInterval(3600);

 

//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsSymbol(Symbol);

 

//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

//AddNewsKeyword("KAP");

}

 

/// <summary>

/// Init islemleri tamamlaninca, bardatalar kullanmaya hazir hale gelince bu fonksiyon tetiklenir. Data uzerinde bir defa yapilacak islemler icin kullanilir

/// </summary>

public override void OnInitComplated()

{

 

}

 

/// <summary>

/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.

/// </summary>

public override void OnTimer()

{

 

}

 

/// <summary>

/// AddNewsSymbol ve AddNewsKeyword ile haberlere kayit olunmuşsa bu fonksiyon tetiklenir.

/// </summary>

/// <param name="newsId">Gelen haberin id'si</param>

/// <param name="relatedSymbols">Gelen haberin ilişkili sembolleri</param>

public override void OnNewsReceived(int newsId, List<string> relatedSymbols)

{

 

}

 

/// <summary>

/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir.

/// </summary>

/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>

public override void OnDataUpdate(BarDataEventArgs barData)

{

if (CrossAbove(rsi, ema, 0, 0))

{

SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false);

}

if (CrossBelow(rsi, ema, 0, 0))

{

SendMarketOrder(Symbol1, OrderQuantity2, OrderSide.Sell, includeAfterSession:false);

}

 

}

 

/// <summary>

/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.

/// </summary>

/// <param name="barData">Emrin son durumu</param>

public override void OnOrderUpdate(IOrder order)

{

}

 

}

}
Algoritmik Trading kategorisinde (24 puan) tarafından | 986 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Stratejinizin bakiyeye göre çevrilmiş hali aşağıda mevcuttur.

  • Lütfen coin üzerinde mi yoksa hisse senedi ile mi çalıştığınıza dikkat ediniz.
  • Eğer Binance'dekş komisyonlarınız BNB üzerinden kesiliyorsa KomisyonuDahilEt butonunu işaretlemenize gerek yoktur.
  • Stratejideki MinSize Binance’de geçerli bir değişkendir. İşlem yaptığınız sembole göre giriş yapınız. (https://www.binance.com/tr/trade-rule

           Mesela ADA_USDT_BIN sembolü için MinSize değerini 0.01 girmelisiniz. 

  • Stratejinizdeki SendOrderSequential(false); ibaresi,

           SendOrderSequential(true,Side.All); şeklinde değiştirilmiştir.

Dilerseniz aşağıdaki linkten bu satırın hangi anlama geldiğini inceleyip tekrar değiştirebilirsiniz.

https://destek.matriksdata.com/?qa=5332/emirleri-sirali-g%C3%B6nder-se%C3%A7imi-%C3%B6zellikleri-sonu%C3%A7lari 

 

Hayırlı bayramlar.

İyi çalışmalar.

***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.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 RSIEMA1 : 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_BIN")]

        public string Symbol1;


		[Parameter(SymbolPeriod.Min60)]

        public SymbolPeriod SymbolPeriod1;


		[Parameter(14)]

		public int RsiPeriod1;

		[Parameter(13)]

        public int EmaPeriod1;

		[Parameter(0.017)]

        public decimal OrderQuantity1;

		[Parameter(0.017)]

        public decimal OrderQuantity2;



		RSI rsi;

		EMA ema;
		
		// Gerekli

		// Başlangıç bakiyesi
		[Output][Parameter(1000)]
		public decimal Bakiye;

		// Başlangıçta elinde olan adet
		[Parameter(0)]
		public decimal BaslangıctakiEnstrumanAdedi;

		[Parameter(true)]
		public bool KomisyonuDahilEt;

		[Parameter(0.001)]
		public decimal Komisyon;

		// strateji hisse senedi ile mi coin ile mi kullanılacak
		[Parameter(true)]
		public bool HisseSenediMI;

		// Kripto için geçerli
		[Parameter(1)]
		public decimal MinSize;

		// Tutar
		public decimal Tutar;

		// Al sat adedi
		[Output]
		public decimal Adet;

		// Bakiye kontrolü-sil
		public bool BakiyeKontrolu = true;

		// #Gerekli

		/// <summary>
		/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,
		/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır. 
		/// </summary>

		public override void OnInit()
		{


			AddSymbol(Symbol1, SymbolPeriod1);

			rsi = RSIIndicator(Symbol1, SymbolPeriod1, OHLCType.WClose, RsiPeriod1);

			ema = EMAIndicator(rsi, EmaPeriod1);



			SendOrderSequential(true, Side.All);

			WorkWithPermanentSignal(true);



			//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.

			// SetTimerInterval(3600);



			//Alttaki fonksiyon ile tanımlanan sembol ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

			//AddNewsSymbol(Symbol);



			//Alttaki fonksiyon ile tanımlanan anahtar kelime ile ilgili haber geldiğinde OnNewsReceived fonksiyonu tetiklenir.

			//AddNewsKeyword("KAP");

		}

	    /// <summary>
		/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
		public override void OnDataUpdate(BarDataEventArgs barData)
		{

			if (CrossAbove(rsi, ema, 0, 0))
			{

				FX_Alis();

			}

			if (CrossBelow(rsi, ema, 0, 0))
			{

				FX_Satis();
			}



		}

// Gerekli

		// Sonfiyat çekilir.
		public decimal FX_Sonfiyat()
		{
			var barDataModel = GetBarData();
			decimal _close = Ref(barDataModel, OHLCType.Close, 0);
			return _close;
		}

		// hisse 
		public bool FX_BalanceKontrolu()
		{
			if (HisseSenediMI)
			{
				return (Math.Floor(Bakiye / FX_Sonfiyat()) >0) ? true: false;
			}
			else
			{
				return true;
			}
		}

		// kriptolar için minimum değişim miktarı		
		public decimal FX_MinSize(decimal quantity)
		{
			return Math.Truncate((quantity - (quantity % MinSize)) / MinSize) * MinSize;
		}

		bool ? AlisMI = null;


		public void FX_Alis()
		{
			decimal _close = FX_Sonfiyat();

			if (FX_BalanceKontrolu() && AlisMI != true)
			{
				// Alabileceği adet
				if (HisseSenediMI)
				{
					Adet = Math.Floor(Bakiye / _close);
				}

				else
				{
					Adet = FX_MinSize(Bakiye / _close);
				}

				SendMarketOrder(Symbol1, Adet, (OrderSide.Buy));



				Debug("Alış sinyali oluştu. Sinyal fiyatı: " + _close + " - Adet: " + Adet);
			}else
			{
				Debug("Alış sinyali oluştu. Bakiyeniz yetersiz. Bakiye: " + Bakiye);
			}
		}

		public void FX_Satis()
		{
			if (((Adet != 0 || BaslangıctakiEnstrumanAdedi != 0)) && AlisMI != false)
			{
				Adet += BaslangıctakiEnstrumanAdedi;

				SendMarketOrder(Symbol1, Adet, (OrderSide.Sell));
				Debug("Satış sinyali oluştu. Sinyal fiyatı: " + FX_Sonfiyat() + " - Adet: " + Adet);
			}else
			{
				Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Bakiye: " + Bakiye);
			}

		}

		decimal _fiyat;
		/// <summary>
		/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
		/// </summary>
		/// <param name="barData">Emrin son durumu</param>
		public override void OnOrderUpdate(IOrder order)
		{
			_fiyat = order.Price;

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				// Tutar
				Tutar = Adet * _fiyat; ;

				// Güncel Bakiye
				Bakiye -= Tutar;

				Adet += BaslangıctakiEnstrumanAdedi;
				BaslangıctakiEnstrumanAdedi = 0;
				Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + "- Tutar: " + Tutar + " - Bakiye: " + Bakiye);

				if (KomisyonuDahilEt)
				{
					if (HisseSenediMI)
					{
						Bakiye -= (Bakiye * Komisyon);
					}else
					{
						Adet = FX_MinSize(Adet - Adet * Komisyon);
					}
				}
				AlisMI = true;
			}

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				// Tutar
				Tutar = Adet * _fiyat;

				// Güncel Bakiye
				Bakiye += Tutar;

				Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + " - Tutar: " + Tutar + " - Kalan bakiye: " + Bakiye);
				Adet = 0;
				BaslangıctakiEnstrumanAdedi = 0;
				if (KomisyonuDahilEt)
				{
					Bakiye -= (Bakiye * Komisyon);
				}

				AlisMI = false;
			}
		}

		// # Gerekli

	}
}


 

(11,059 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,635 soru
8,589 cevap
4,821 yorum
19,782 kullanıcı