MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
2 beğenilme 0 beğenilmeme
2,308 kez görüntülendi
Merhaba,

Strateji başlangıcında alış ve satış miktarı girmemizi istiyor. Sürekli aynı miktardan al sat yapmasını istemiyorum elimdeki bakiyeye göre al sat yaptırmak istiyorum. Rica etsem yardımcı olabilir misiniz?
Algoritmik Trading kategorisinde (1,654 puan) tarafından | 2,308 kez görüntülendi

2 Cevaplar

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

Merhaba,

Stratejide kullanmak istediğiniz enstrüman adedini ve bakiyeyi belirterek strateji çalıştırıp alış satışlara göre güncel bakiyenizi hesaplatıp al sat yaptırmak için aşağıdaki stratejiyi deneyebilirsiniz.

 

using System;
using System.Collections.Generic;
using System.Linq;
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;

//===========================================ACIKLAMA============================================//
// Başlangıçta belirlenen bakiyeye ve elinizdeki estrüman adetine göre strateji çalışmaya başlar.//
// Alış sinyali oluştuysa bakiye varsa bakiye kadar alış yapar.                                  //
// Satış sinyali oluştuysa pozisyonunuz varsa hepsini satar.                                     //
// Backtest yapıp test hesablarından denedikten sonra küçük miktarlarla gerçek hesapta deneyiniz //

namespace Matriks.Lean.Algotrader
{
	public class BakiyeyeGoreAlSat : MatriksAlgo
	{
		[SymbolParameter("BTC_USDT_BIN")]
		public string Symbol;

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

		[Parameter(3)]
		public int Period;

		[Parameter(2)]
		public decimal Percentage;

		MOST most;

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(most, most, 1, 0))
			{
				FX_Alis();
			}

			if (CrossBelow(most, most, 1, 0))
			{
				FX_Satis();
			}
		}

		public override void OnInit()
		{
			AddSymbol(Symbol, SymbolPeriod);

			most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);

			WorkWithPermanentSignal(true);

			SendOrderSequential(true, Side.All);
		}

		// Gerekli başla		
		public override void OnInitComplated()
		{
			var SymbolDetail = GetSymbolDetail(Symbol);
			MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);
			FX_PiyasaTipi();
		}

		[Output][Parameter(50)]
		public decimal Bakiye;

		[Parameter(0)]
		public decimal BaslangıctakiEnstrumanAdedi;

		[Parameter(true)]
		public bool KomisyonuDahilEt;

		[Parameter(0.001)]
		public decimal KomisyonOranı;

		public decimal MinSize;

		public decimal Adet;

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

		// hisse 
		public bool FX_BalanceKontrolu()
		{
			if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
			{
				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;
		}

		[Output]
		public string Sembol1 = "";

		[Output]
		public string Sembol2 = "";

		enum PiyasaTipleri
		{
			BISTPP,
			BISTVIOP,
			KRIPTOBINANCE,
			KRIPTOBINANCEFUTURE,
			KRIPTOBITMEX,
			KRIPTOBTCTURK
		}

		PiyasaTipleri piyasaTipleri = PiyasaTipleri.BISTPP;

		public void FX_PiyasaTipi()
		{
			Sembol1 = Symbol;

			var SymbolDetail = GetSymbolDetail(Symbol);

			if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTPP.ToString())
			{
				piyasaTipleri = PiyasaTipleri.BISTPP;
			}else if (SymbolDetail.ExchangeDetail.ExchangeCode == PiyasaTipleri.BISTVIOP.ToString())
			{
				piyasaTipleri = PiyasaTipleri.BISTVIOP;
			}else
			{
				var _split = Symbol.Split('_');
				if (_split.Count() == 3)
				{
					if (Symbol.Split('_')[2].Contains("BIN"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCE;
					} else if (Symbol.Split('_')[2].Contains("FBIN"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBINANCEFUTURE;
					}else if (Symbol.Split('_')[2].Contains("BMEX"))
					{
						piyasaTipleri = PiyasaTipleri.KRIPTOBITMEX;
					}
				}else
				{
					piyasaTipleri = PiyasaTipleri.KRIPTOBTCTURK;
				}
				Sembol1 = Symbol.Split('_')[0];
				Sembol2 = Symbol.Split('_')[1];
			}
		}

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

			if (FX_BalanceKontrolu() && LastOrderSide.Obj != Side.Buy)
			{
				// Alabileceği adet
				if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
				{
					Adet = Math.Floor(Bakiye / _close);
				}else
				{
					Adet = FX_MinSize(Bakiye / _close);
				}

				if (Adet != 0)
				{
					SendMarketOrder(Symbol, 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)) && LastOrderSide.Obj != Side.Sell)
			{
				Adet += BaslangıctakiEnstrumanAdedi;

				SendMarketOrder(Symbol, 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);
			}
		}


		public override void OnOrderUpdate(IOrder order)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				var tutar = order.OrderQty * order.Price;

				Bakiye -= tutar;

				BaslangıctakiEnstrumanAdedi = 0;
				Adet += BaslangıctakiEnstrumanAdedi;

				if (KomisyonuDahilEt)
				{
					if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
					{
						Bakiye -= (Bakiye * KomisyonOranı);
					}else
					{
						Adet = FX_MinSize(Adet - Adet * KomisyonOranı);
					}
				}
				Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + order.OrderQty + "- Tutar: " + tutar + " - Bakiye: " + Bakiye);

			}

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				var tutar = order.OrderQty * order.Price;

				Bakiye += tutar;

				Adet = 0;
				BaslangıctakiEnstrumanAdedi = 0;
				if (KomisyonuDahilEt)
				{
					Bakiye -= (Bakiye * KomisyonOranı);
				}

				Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + order.OrderQty + " - Tutar: " + tutar + " - Kalan bakiye: " + Bakiye);

			}
		}
		// # Gerekli bitti

	}
}


 

(6,848 puan) tarafından
tarafından seçilmiş
0 0
Peki bakiyenin 3'te biri, ya da yüzde olarak %40'ı kadar alım yap diye komut verebiliyor muyuz?
0 0
Yukardaki örnek kod ile bakiye takibi mümkün olmayacaktır. Çünkü emir gönderildiğinde bakiye değiştiriliyor. Emir gerçekleşmeyebilir.

Portfoy bilgilerimize neden ulaşamıyoruz? Araştırmama göre GetPortfolio() fonksiyonu mevcut. ancak çalışmıyor. Bu çalışır hale getirilse iyi olur.

Teşekkürler
0 0

Aşağıdaki kod yapısını kullanarak overall ve işlem limitine ulaşabilirsiniz. Daha sonra işlem limitini hangi oranda kullanmak isterseniz hesaplatıp Bakiye değişkenine atayabilirsiniz.

aşağıdaki linki de inceleyebilirsiniz.

https://destek.matriksdata.com/?qa=95/portf%C3%B6y-penceresinde-g%C3%B6r%C3%BClen-bilgileri-strateji-edit%C3%B6r%C3%BCne&show=95#q95

var overall = BistOverall;         //Hesaptaki toplam para(hesap Overall)

var islemLimiti = BistAvailableMargin;  //Margin trading hesabi varsa

		

Debug("overall: " + overall + " islemLimiti " + islemLimiti);

 

0 0
Merhaba,

Hem yukardaki cevabınızı hemde linkini verdiğiniz kodları denedim.

Aşağıda yaptığım testlere ait kodlar mevcut. Ancak GetPortfolio() dan değer gelmiyor. Neden olabilir? Yatırım firmasına göre değişkenlik gösterir mi?

 

Teşekkürler

 

 

 

 

 

Debug("OnInitComplated");

var overall = GetOverall();      //Islem limiti

var para1 = BistOverall;         //Hesaptaki toplam para(hesap Overall)

 

var para = BistAvailableMargin;  //Margin trading hesabi varsa

 

Debug($"overall:{overall}, para1:{para1}, para:{para}");

 

decimal stock=0;

IDictionary<string, decimal> portfolio = GetPortfolio();

var positionflag = portfolio.ContainsKey(Symbol) && portfolio[Symbol] != 0;

if (positionflag) stock = portfolio[Symbol];

Debug($"hisse:{Symbol}, stock:{stock}");

foreach(var str in portfolio.Keys)

{

Debug($"str:{str}, {portfolio[str]}");

}

 

var tradeUser = GetTradeUser();

var account = tradeUser.Accounts.FirstOrDefault();

var overall2 = account.Overall;

var PnL = account.ProfitLoss;

 

Debug($"acc:{account}, overall2:{overall2}, pnl:{PnL}");
0 0
selam belirttiğiniz kodu kopyalayıp yapıştırdığımda

CS0246 hatası alıyorum nerede yanlış yapıyorum bu örnek kodu tam olarak nereye yapıştırmam gerekli ?
0 0

Merhaba,

Lütfen strateji isminizin BakiyeyeGoreAlSat olduğundan emin olunuz.

Farklı bir isim ile kaydedip derlemeye çalıştırıyorsanız bu hata mesajı ile karşılaşabilirsiniz.

İyi çalışmalar.

stratejiye ekleme
0 0
sorunu hallettim teşekkür ederim.
0 beğenilme 0 beğenilmeme
Düzenleme yapıldı 11.01.2022

HisseSenediMI, MinSize gibi değişkenler kullanılan sembole göre otomatik çekildi.
(6,848 puan) tarafından
0 0
Merhaba, bu yapıda kaldıraç oranı belirleyemiyor muyuz?

İkinci sorum, açığa satış yapacak şekilde de kullanamıyor muyuz? (Çift yönlü çalışmasına gerek yok, sadece açığa satış yapıp pozisyonu kapaması yeterli.) FX_Alis ve FX_Satis'in public void satırlarını ve orderside'larını yer değiştirip sendordersequential'ı Side.Sell yapsak açığa satan yapıya dönüşür mü kripto tarafı için?

Üçüncü sorum da, Binance Futures için bunu sadeleştirsek (başlangıç bakiyesini kaldırsak, hisse ile ilgili olan şeyleri silsek falan) sistem performasını arttırıcı etkisi olur mu?

Teşekkürler şimdiden.
1 0

Merhabalar,

bu yapıda kaldıraç oranı belirleyemiyor muyuz?

Maalesef kaldıraç oranı belirleyemiyorsunuz.

İkinci sorum, açığa satış yapacak şekilde de kullanamıyor muyuz? (Çift yönlü çalışmasına gerek yok, sadece açığa satış yapıp pozisyonu kapaması yeterli.) FX_Alis ve FX_Satis'in public void satırlarını ve orderside'larını yer değiştirip sendordersequential'ı Side.Sell yapsak açığa satan yapıya dönüşür mü kripto tarafı için?

Açığa satış yapacak şekilde çift taraflı kullanamazsınız. Fakat bahsettiğiniz gibi satış ile başlayacak şekilde sistemi ayarlarsanız (SendOrderSequential(true,Side.Sell) açığa satış gibi çalışır.

Üçüncü sorum da, Binance Futures için bunu sadeleştirsek (başlangıç bakiyesini kaldırsak, hisse ile ilgili olan şeyleri silsek falan) sistem performasını arttırıcı etkisi olur mu?

Performansı çok etkileyen yapılar değildir, fakat dilerseniz test edebilirsiniz.

İ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,011 soru
3,963 cevap
2,797 yorum
2,962 kullanıcı