0 beğenilme 0 beğenilmeme
902 kez görüntülendi

Merhaba aşağıda sizin oluşturduğunuz most için olan bakiyeye göre al sat stratejisini benim için super trende uyarlayabilir misiniz lütfen ? 

 

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 BakiyeyeGoreAlSat : MatriksAlgo { [SymbolParameter("BTC_USDT_BIN")] public string Symbol; [Parameter(SymbolPeriod.Min5)] public SymbolPeriod SymbolPeriod; [Parameter(3)] public int Period; [Parameter(2)] public decimal Percentage; MOST most; public override void OnDataUpdate(BarDataEventArgs barData) { if (CrossAbove(most, most, 1, 0)) { FX_Alis(); } if (CrossBelow(most, most, 1, 0)) { FX_Satis(); } } public override void OnInit() { AddSymbol(Symbol, SymbolPeriod); most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period, Percentage, MovMethod.Exponential); WorkWithPermanentSignal(true); SendOrderSequential(true, Side.All); } // Gerekli başla public override void OnInitComplated() { var SymbolDetail = GetSymbolDetail(Symbol); MinSize = 1 / (decimal) Math.Pow(10, SymbolDetail.TradeFraction); FX_PiyasaTipi(); } [Output][Parameter(50)] public decimal Bakiye; [Parameter(0)] public decimal BaslangıctakiEnstrumanAdedi; [Parameter(true)] public bool KomisyonuDahilEt; [Parameter(0.001)] public decimal KomisyonOranı; public decimal MinSize; public decimal Adet; // 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 { 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]; } } public void FX_Alis() { decimal _close = FX_Sonfiyat(); if (FX_BalanceKontrolu() && LastOrderSide.Obj != Side.Buy) { // Alabileceği adet if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP) { Adet = Math.Floor(Bakiye / _close); }else { Adet = FX_MinSize(Bakiye / _close); } if (Adet != 0) { 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)) && LastOrderSide.Obj != Side.Sell) { 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); } } public override void OnOrderUpdate(IOrder order) { if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Buy) { var tutar = order.OrderQty * order.Price; Bakiye -= tutar; BaslangıctakiEnstrumanAdedi = 0; Adet += BaslangıctakiEnstrumanAdedi; if (KomisyonuDahilEt) { if (piyasaTipleri == PiyasaTipleri.BISTPP || piyasaTipleri == PiyasaTipleri.BISTVIOP) { Bakiye -= (Bakiye * KomisyonOranı); }else { Adet = FX_MinSize(Adet - Adet * KomisyonOranı); } } Debug("Alış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + order.OrderQty + "- Tutar: " + tutar + " - Bakiye: " + Bakiye); } if (order.OrdStatus.Obj == OrdStatus.Filled && order.Side.Obj == Side.Sell) { var tutar = order.OrderQty * order.Price; Bakiye += tutar; Adet = 0; BaslangıctakiEnstrumanAdedi = 0; if (KomisyonuDahilEt) { Bakiye -= (Bakiye * KomisyonOranı); } Debug("Satış gerçekleşti. Gerçekleşen fiyat: " + order.Price + " - Adet: " + order.OrderQty + " - Tutar: " + tutar + " - Kalan bakiye: " + Bakiye); } } // # Gerekli bitti } }

Algoritmik Trading kategorisinde (70 puan) tarafından | 902 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,

Lütfen aşağıdaki stratejiyi test ediniz.

***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
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 SuperTrendBakiyeStrategy : 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.Day)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(10)]
		public int Period;

		[Parameter(3)]
		public decimal Coeff;

		SuperTrend superTrend;

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

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

		// 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()
		{
			superTrend = SuperTrendIndicator(Symbol, SymbolPeriod, Period, Coeff);

			AddSymbol(Symbol, SymbolPeriod);

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

		/// <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)
		{
			var barData1 = GetBarData(Symbol, SymbolPeriod);

			if (CrossBelow(superTrend, barData1, OHLCType.Close, 0))
			{
				Debug("Alış emri verildi.");
				FX_Alis();


			}
			if (CrossAbove(superTrend, barData1, OHLCType.Close, 0))
			{
				Debug("Satış emri verildi.");
				FX_Satis();

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

		// Sonfiyat çekilir.
		public decimal FX_Sonfiyat()
		{
			var barDataModel = GetBarData();
			decimal _close = Ref(barDataModel, OHLCType.Close, 0);
			return _close;
		}

		// hisse 
		public bool FX_BalanceKontrolu()
		{
			if (HisseSenediMI)
			{
				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;
		}

		bool ? AlisMI = null;

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

			if (FX_BalanceKontrolu() && AlisMI != true)
			{
				// Alabileceği adet
				if (HisseSenediMI)
				{
					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;
		/// <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)
		{
			_fiyat = order.Price;

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

				// Güncel Bakiye
				Bakiye -= Tutar;

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

				if (KomisyonuDahilEt)
				{
					if (HisseSenediMI)
					{
						Bakiye -= (Bakiye * Komisyon);
					}else
					{
						Adet = FX_MinSize(Adet - Adet * Komisyon);
					}
				}

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

				AlisMI = false;
			}
		}

		// # Gerekli bitti

	}
}

İyi çalışmalar.

(11,069 puan) tarafından
0 0
Teşekkürler dostum. iyi çalışmalar.
0 0
başlangıçta ki enstürman adedi ilk alışı yaparken ne kadar miktar almak istediğimiz mi  yoksa o emtiyanın hesabımızda ki olan miktarı mı ? bu parametreleri doldurduktan sonra optimizasyon da ikinci sekmeye geçince orada da başlangıç fiyatı ve komisyon oranını girmemiz gerekiyor mu ? Ve bu stratejiyi vadeli de kullanabiliyor muyuz ?
0 0
Merhabalar,

Başlangıçtaki enstrüman adedi elinizde olan miktardır. Eğer alıp satmak istediğiniz enstrüman öncesinde portföyünüzde bulunuyor ise o miktarı girmelisiniz.

Başlangıç fiyatı için birinci ve ikinci sayfadaki seçeneklere aynı miktarı girmeniz daha sağlıklıdır.

Komisyonunuz Kripto tarafında BNB'den alınıyor ise belirtmenize gerek yoktur.

Strateji çift yönlü işlem yapmaz, içerisinde açığa sat ya da pozisyon kapat emirleri yoktur.

İyi çalışmalar.
0 0
teşekkür ederim aynı stratejiyi total bakiye ile vadelide yapamıyoruz sanırım başka sayfalarda sorulmuş öyle okudum. Bu şekilde de çok başarılı en azından IQ da yapıyor olabilmemiz güzel.

İyi çalışmalar.
0 0
Merhaba,

Doğrudur total bakiye yapamıyoruz.

Dilekleriniz için teşekkür ederiz..

İyi çalışmalar.
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.



7,509 soru
7,511 cevap
4,405 yorum
8,748 kullanıcı