25.12.2021
0
3
245
100

Merhaba,

Belli bir bakiyeye göre başlayıp, alıp sattıkça oluşacak bakiyeye göre alıp satmaya devam eden bir örnek algoritma.



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);
			}

		}
	}
}


0 Yorum