MatriksIQ Destek
Matriks Destek
Matriks Web Destek
Matriks Mobile Destek
2 beğenilme 0 beğenilmeme
1,715 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,648 puan) tarafından | 1,715 kez görüntülendi

2 Cevaplar

3 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

	}
}


 

(7,398 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 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.
(7,398 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.



3,017 soru
2,908 cevap
2,264 yorum
2,196 kullanıcı