0 beğenilme 0 beğenilmeme
461 kez görüntülendi
statejimi şu coinden 50 tane al 50 tane sat şeklinde değilde 1000 usdt lik al 1000 usdt lik sat şeklinde kurgulamak istiyorum
Algoritmik Trading kategorisinde (14 puan) tarafından | 461 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Yazmak istediğiniz sistemin şablon kodu aşağıdaki gibidir.

Kendi indikatörünüzü ve al sat noktalarınızı değiştirerek stratejinizi tamamlayabilirsiniz.

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 MostBakiyeyeGoreAlSatStrategy : 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;

		// Gerekli başla

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

		// Başlangıçta elinde olan adet
		[Parameter(0)]
		public decimal BaslangıctakiEnstrumanAdedi;

		[Parameter(true)]
		public bool KomisyonuDahilEt;

		[Parameter(0.001)]
		public decimal KomisyonOranı;

		// Kripto için geçerli
		public decimal MinSize;

		// Tutar
		public decimal Tutar;

		// Al sat adedi
		[Output]
		public decimal Adet;

		// Bakiye kontrolü-sil
		public bool BakiyeKontrolu = true;

		// #Gerekli bitti

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

			most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential);

			WorkWithPermanentSignal(true);

			SendOrderSequential(true, Side.All);
		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			if (CrossAbove(most, most, 1, 0))
			{
				FX_Alis();
			}

			if (CrossBelow(most, most, 1, 0))
			{
				FX_Satis();
			}
		}

		// Gerekli başla
		public override void OnInitComplated()
		{
			var SymbolDetail = GetSymbolDetail(Symbol);
			MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction);


			FX_PiyasaTipi();
		}

		// 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 if (SymbolDetail.ExchangeDetail.ExchangeCode == "")
			{
				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];
			}
		}

		bool ? AlisMI = null;

		public void FX_Alis()
		{
			decimal _close = FX_Sonfiyat();

			if (FX_BalanceKontrolu() && AlisMI != true)
			{
				// Alabileceği adet
				if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
				{
					Adet = Math.Floor(Bakiye / _close);
				}else
				{
					Adet = FX_MinSize(Bakiye / _close);
				}

				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)) && AlisMI != false)
			{
				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);
			}

		}

		decimal _fiyat;

		public override void OnOrderUpdate(IOrder order)
		{
			_fiyat = order.Price;

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy)
			{
				// Tutar
				Tutar = Adet * _fiyat; ;

				// Güncel Bakiye
				Bakiye -= Tutar;

				BaslangıctakiEnstrumanAdedi = 0;
				Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + "- Tutar: " + Tutar + " - Bakiye: " + Bakiye);
				Adet += BaslangıctakiEnstrumanAdedi;

				if (KomisyonuDahilEt)
				{
					if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP)
					{
						Bakiye -= (Bakiye * KomisyonOranı);
					}else
					{
						Adet = FX_MinSize(Adet - Adet * KomisyonOranı);
					}
				}

				AlisMI = true;
			}

			if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell)
			{
				// Tutar
				Tutar = Adet * _fiyat;

				// Güncel Bakiye
				Bakiye += Tutar;

				Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + _fiyat + " - Adet: " + Adet + " - Tutar: " + Tutar + " - Kalan bakiye: " + Bakiye);
				Adet = 0;
				BaslangıctakiEnstrumanAdedi = 0;
				if (KomisyonuDahilEt)
				{
					Bakiye -= (Bakiye * KomisyonOranı);
				}

				AlisMI = false;
			}
		}

		// # Gerekli bitti

	}
}


 

Backtest yaparken, stratejide, Bakiye kısmına lütfen işlem yapmak istediğiniz miktarı giriniz.

Elinizde alıp satmak istediğiniz enstrümandan varsa lütfen miktarını giriniz, yoksa 0 (sıfır) yazabilirsiniz.

Dilerseniz Komisyon dahil edebilirsiniz. Eğer komisyon dahil etmek istemiyorsanız mavi işareti kaldırmanız yeterlidir. BINANCE üzerinden işlem yapıyor ve komisyonlarınız BNB üzerinden kesiliyor ise işaretlemenize gerek yoktur.

Son olarak ise Hisse Senedi Mi diye bir seçenek karşımıza çıkıyor. Eğer Hisse Senedi ile çalışıyorsanız işaretleyiniz, Coin ile çalışıyorsanız işareti kaldırınız.

İleri dediğinizde bar sayısı ve başlangıç bakiyesi girmeniz gerekmektedir. Bu kısımdaki başlangıç bakiyesi kısmına da kullanmak istediğiniz miktarı giriniz.

İyi çalışmalar.

(11,059 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.



8,635 soru
8,589 cevap
4,821 yorum
19,782 kullanıcı