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

1 cevap

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ıçtaki bakiyenize ve pozisyonunuza göre strateji çalışmaya başlar.                     //
// Alış sinyali oluştuysa bakiyeniz varsa bakiyeniz 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
	{
		// 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("GARAN")]
		public string Symbol;

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

		[Parameter(3)]
		public int Period;

		[Parameter(2)]
		public decimal Percentage;

		MOST most;

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

		// Başlangıç adet
		[Parameter(0)]
		public decimal StartQuantity;

		// Tutar
		public decimal Amount;

		// Al sat adedi
		public decimal Quantity;

		// Bakiye kontrolü
		public bool BalanceControl = true;

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

		/// <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()
		{
			most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);

			AddSymbol(Symbol, SymbolPeriod);

			// Algoritmanın kalıcı veya geçici sinyal ile çalışıp çalışmayacağını belirleyen fonksiyondur.
			// true geçerseniz algoritma sadece yeni bar açılışlarında çalışır, bu fonksiyonu çağırmazsanız veya false geçerseniz her işlem olduğunda algoritma tetiklenir.
			WorkWithPermanentSignal(true);

			//Eger backtestte emri bir al bir sat seklinde gonderilmesi isteniyor bu true set edilir. 
			//Alttaki satırı silerek veya false geçerek emirlerin sirayla gönderilmesini engelleyebilirsiniz. 
			SendOrderSequential(false);
		}


		/// <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)
		{
			// Bardata verileri
			var barDataModel = GetBarData();

			// Son fiyat
			var Close = barData.BarData.Close;

			// Güncel bakiye ile alış yapıp yapamayacağınız kontrolü ediliyor. true ise alış yapabilir
			if (HisseSenedi)
			{
				BalanceControl = (Math.Floor(Bakiye / Close) >0) ? true: false;
			}

			if (Close>Ref(barDataModel, OHLCType.Close, 1) && BalanceControl == true && Bakiye > 0.00000001m)
			{
				// Alabileceği adet
				if (HisseSenedi)
				{
					Quantity = Math.Floor(Bakiye / Close);
				}else
				{
					Quantity = Bakiye / Close;
				}


				// Tutar
				Amount = Quantity * Close;

				// Güncel bakiye
				Bakiye -= Amount;

				SendMarketOrder(Symbol, Quantity, (OrderSide.Buy));
				Quantity += StartQuantity;
				StartQuantity = 0;
				Debug("Alış Sinayli Oluştu. Fiyat: " + Close + " - Adet: " + Quantity + " - Tutar: " + Amount + " -  Kalan Bakiye: " + Bakiye);
			}else if (Close>Ref(barDataModel, OHLCType.Close, 1) && (BalanceControl == false || Bakiye == 0))
			{
				Debug("Alış sinyali oluştu. Bakiyeniz yetersiz. Kalan Bakiye: " + Bakiye);
			}

			if (Close<Ref(barDataModel, OHLCType.Close, 1) && (Quantity != 0 || StartQuantity != 0))
			{
				Quantity += StartQuantity;

				// Tutar
				Amount = Quantity * Close;

				// Güncel bakiye
				Bakiye += Amount;

				SendMarketOrder(Symbol, Quantity, (OrderSide.Sell));
				Debug("Satış sinyali oluştu. Fiyat: " + Close + " - Adet: " + Quantity + " - Tutar: " + Amount + " - Kalan Bakiye: " + Bakiye);
				Quantity = 0;
				StartQuantity = 0;
			}else if (Close<Ref(barDataModel, OHLCType.Close, 1) && Quantity == 0)
			{
				Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Kalan Bakiye: " + Bakiye);
			}

		}
	}
}

 

(2,717 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}");
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.



562 soru
636 cevap
832 yorum
353 kullanıcı