0 beğenilme 0 beğenilmeme
891 kez görüntülendi
macd stratejisi oluşturuyorum ama örneğin 500 barlık 4 saatlikte test yapıcam. 500 bar önceki ipeke hissesi 9.85 tl. ben 100.000 tl bakiye ile test yapıcam. alış satış emri ilk bakiye ve fiyata uygun olarak 100.000/9.85=50.761 lot çıkıyor. test ekranında 50.761 lot emir yazdığım zaman, bakiye arttığı zaman maksimum alabileceği lotu değilde ilk başta yazdığım 50.761 lot alış işlemi yapıyor. buda testlerde doğru sonuç elde etmemi engelliyor. ya da tam tersi durumda bakiye eksi olursa ilk baştan, hesapta 50.761 lot almaya yetecek para olmamasına rağmen sanki alabiliyormuş gibi test sonucu veriyor.
Algoritmik Trading kategorisinde (46 puan) tarafından | 891 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar, bakiyeye göre al/sat işlemlerini sağlayan örnek kodu aşağıdaki linkte bulabilirsiniz.

https://destek.matriksdata.com/?qa=1144/stratejide-bakiyeye-göre-al-sat-yaptırmak&show=1144#q1144

 

(4,555 puan) tarafından
0 0
bu verdiğiniz örnek içindeki strateji most. benim için macd stratejili olani paylaşabilirmisiniz acaba. iyi günler.
1 0

Merhaba,

Linkteki stratejiyi MACD indikatörü için uyarladık. Macd çizgisi Trigger çizgisini yukarı kırarsa al aşağı kırarsa sat sinyali üretiyor.

Paylaştığımız strateji sizin elle gireceğiniz bakiye değerine göre al/sat işlemleri yapar. Örneğin bakiyeniz 100 ve almak istediğiniz hissenin bedeli 10 ise 10 adet alış yapacaktır. 

NOT : Stratejinizi test ortamında test edip sonuçlardan emin olmadıkça gerçek hesapla işle yapmayınız. Stratejiyi çalıştırmak için oluşturduğunuz stratejinin adını " BakiyeyeGoreAlSat " olarak ayarlamalısınız.

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(26)]
		public int LongPeriod;

		[Parameter(12)]
		public int ShortPeriod;

		[Parameter(9)]
		public int TriggerPeriod;

		// 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;

		MACD macd;

		/// <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()
		{
			macd = MACDIndicator(Symbol, SymbolPeriod, OHLCType.Close, LongPeriod, ShortPeriod, TriggerPeriod);

			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 (CrossAbove(macd, macd.MacdTrigger) && 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);
				Debug("Macd : " + Math.Round(macd.CurrentValue, 3));
				Debug("Trigger : " + Math.Round(macd.MacdTrigger.CurrentValue, 3));

			}else if (CrossAbove(macd, macd.MacdTrigger) && (BalanceControl == false || Bakiye == 0))
			{
				Debug("Alış sinyali oluştu. Bakiyeniz yetersiz. Kalan Bakiye: " + Bakiye);
			}

			if (CrossBelow(macd, macd.MacdTrigger) && (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);
				Debug("Macd : " + Math.Round(macd.CurrentValue, 3));
				Debug("Trigger : " + Math.Round(macd.MacdTrigger.CurrentValue, 3));
				Quantity = 0;
				StartQuantity = 0;
			}else if (CrossBelow(macd, macd.MacdTrigger) && Quantity == 0)
			{
				Debug("Satış sinyali oluştu. Satılacak enstrüman yok. Kalan Bakiye: " + Bakiye);
			}

		}
	}
}

 

0 0
çok teşekkür ederim yardımlarınız için.
7,511 soru
7,515 cevap
4,405 yorum
8,751 kullanıcı