0 beğenilme 0 beğenilmeme
1,851 kez görüntülendi
Stratejileri test yaparken, elimdeki bütün para ile kripto ve ya hisse senedini alma emrini otomatik nasıl verilir?
Algoritmik Trading kategorisinde (12 puan) tarafından | 1,851 kez görüntülendi

1 cevap

7 beğenilme 0 beğenilmeme
BuyOrderQuantity - SellOrderQuantity tam olarak lot adeti.

Stratejide kullanırken;

Alış:

GetOverall() -> Bakiyenizin toplamı
barData.BarData.Close -> Kapanış fiyatı

BuyOrderQuantity = GetOverall() / barData.BarData.Close;

Şeklinde mevcut tüm bakiye ile alım yapmış olursunuz.

Satış:

IDictionary<string, decimal> portfolio = GetPortfolio(); // Mevcut portföy bilgileri
var positionflag = portfolio.ContainsKey(Symbol) && portfolio[Symbol] != 0; // Portföyde miktar mevcut mu?

if (positionflag)
{
    SellOrderQuantity = portfolio[Symbol];
}

Elinizdeki tüm lotları satmış olursunuz.

Paylaştığım kodlar backtest için uygundur. Gerçek işlemler için komisyon tutarları, ondalık hane sayıları ve minimum emir miktarları hesaba katılmalıdır.

https://destek.matriksdata.com/?qa=2071/hisse-miktarı
(725 puan) tarafından
0 0
Ellerinize sağlık Görkem bey ;
Keşke Basit bi strateji içinde kullanarak verseydiniz, benim gibi yazılım bilgisi olamayanlar Puzzle gibi birleştirek yapmaya çalışıyoruz çünkü kodları.

Musaid olduğunuzda 2 MOV kesişimi ile bütün bir strateji olarak paylaşabilirseniz kodları nereye ekleyeceğimizi daha iyi anlarız.
2 0

Doğru söylüyorsunuz. 

Strateji adı: OverallStrateji
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using System.Windows.Media;
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;

namespace Matriks.Lean.Algotrader
{
	public class OverallStrateji : 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;

		// **** gorkemsari -> Alım satım adetlerini strateji içinde kendimiz hesaplatacağımız için dışarıdan bir parametre olarak girmeyeceğiz.
		// [Parameter(5)] -> Kapatıldı.
		public decimal BuyOrderQuantity;

		// [Parameter(5)] -> Kapatıldı.
		public decimal SellOrderQuantity;

		[Parameter(5)]
		public int MovPeriod;

		[Parameter(22)]
		public int MovPeriod2;

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

		/// <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(Symbol, SymbolPeriod);
			mov = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod, MovMethod.Exponential);
			mov2 = MOVIndicator(Symbol, SymbolPeriod, OHLCType.Close, MovPeriod2, MovMethod.Exponential);

			// 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 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(true);
			//Alttaki fonksiyon açıldıktan sonra parametre olarak verilen saniyede bir OnTimer fonksiyonu tetiklenir.
			//SetTimerInterval(3);

			//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(BarDataCurrentValues barDataCurrentValues)
		{
			if (CrossAbove(mov, mov2))
			{
				// **** gorkemsari -> Alış emri için miktar bilgisi hesapta bulunan tutara göre hesaplanıyor.
				// GetOverall() -> Bakiyenizin toplamı
				// barData.BarData.Close -> Kapanış fiyatı

				BuyOrderQuantity = GetOverall() / barDataCurrentValues.LastUpdate.Close; // **** gorkemsari -> Toplam bakiyeyi, kapanış fiyatına bölerek alış adedini hesaplıyoruz.
				SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
				Debug("Alış Emri Gönderildi");
			}

			if (CrossBelow(mov, mov2))
			{
				// **** gorkemsari -> Satış emri için miktar, portföydeki lot adedi getirilecek.
				IDictionary<string, decimal> portfolio = GetPortfolio(); // Mevcut portföy bilgileri
				var positionflag = portfolio.ContainsKey(Symbol) && portfolio[Symbol] != 0; // Portföyde miktar mevcut mu?

				if (positionflag) // Portföyde mevcut ise
				{
					SellOrderQuantity = portfolio[Symbol]; // Portföydeki miktar kadar sat.
				}
				
				SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
				Debug("Satış Emri Gönderildi");
			}
		}

		/// <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)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{

			}
		}
	}
}

 

0 0

Görkem hocam zihnine, eline sağlık. Değer katıyorsunuz, sağolun. yes

0 0
Tam olarak nereye nasıl bu kodları eklememiz gerekiyor hata alıyorum sürekli görkem bey
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ı