0 beğenilme 0 beğenilmeme
539 kez görüntülendi
Bu stratejinize Kar al ve zarar durdur ekleyemedim o şekilde bir örnek paylaşabilir misiniz?
Algoritmik Trading kategorisinde (143 puan) tarafından | 539 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme

Merhaba,

Kar al ve zarar durdur eklenmiş hali aşağıdadır.

İyi çalışmalar

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 KriptoBakiye : 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("BTC_USDT_BIN")]
		public string Symbol;

		[Parameter(SymbolPeriod.Min15)]
		public SymbolPeriod SymbolPeriod;

		[Parameter(100)]
		public decimal Bakiye;

		[Parameter(20)]
		public int BolPeriod;
		[Parameter(2)]
		public decimal StandartDeviation;
		
		[Parameter(3)]
		public decimal Kar_AL_Yuzde;
		[Parameter(5)]
		public decimal Stop_Yuzde;
		
		BOLLINGER bollinger;

		[Output]
		public decimal SonBakiye;

		/// <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()
		{
			bollinger = BollingerIndicator(Symbol, SymbolPeriod, OHLCType.Close, BolPeriod, StandartDeviation, MovMethod.Simple);
			//	stochasticRSI = StochasticRSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, RsiPeriod, StocPeriod, DPeriod, KPeriod, MovMethod.E);

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

		int pozisyon = 0;
		bool firstrun = true;
		decimal Adet = 0;
		/// <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 bardata = GetBarData();
			var SonFiyat = barDataCurrentValues.LastUpdate.Close;

			if (firstrun) SonBakiye = Bakiye;
			var IslemAdedi = SonBakiye / SonFiyat;
			IslemAdedi = Math.Truncate(IslemAdedi * 10000) / 10000;

			if (CrossAbove(bardata, bollinger.BollingerDown, OHLCType.Close))
			{
				Debug("Alış emri verildi.");
				if (pozisyon == 0 && IslemAdedi >= 0.0001m)
				{
					pozisyon = 1;
					SonBakiye = 0;
					Adet = IslemAdedi;
					SendMarketOrder(Symbol, IslemAdedi, OrderSide.Buy);
					TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
					StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
				}else if (pozisyon == -1)
				{
					pozisyon = 0;
					SonBakiye = Bakiye;
					SendMarketOrder(Symbol, Adet, OrderSide.Buy);
					TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
					StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
					Adet = 0;

				}
			}
			if (CrossBelow(bardata, bollinger.BollingerDown, OHLCType.Close))
			{
				Debug("Satış emri verildi.");
				if (pozisyon == 0 && IslemAdedi >= 0.0001m)
				{
					pozisyon = -1;
					SonBakiye = 0;
					Adet = IslemAdedi;
					SendMarketOrder(Symbol, IslemAdedi, OrderSide.Sell);
					TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
					StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
				}else if (pozisyon == 1)
				{
					pozisyon = 0;
					SonBakiye = Bakiye;
					SendMarketOrder(Symbol, Adet, OrderSide.Sell);
					TakeProfit(Symbol, SyntheticOrderPriceType.Percent, Kar_AL_Yuzde);
					StopLoss(Symbol, SyntheticOrderPriceType.Percent, Stop_Yuzde);
					Adet = 0;
				}
			}
			firstrun = false;
		}

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

		}
	}
}

 

(4,555 puan) tarafından
0 0
Orçun bey stratejiyi backtest ettim ve arka arkaya birkaç defa AL ve SAT sinyalleri verdiğini gözlemledim. Bunun için SendOrderSequential(true, Side.All) denedim ama yinede sıralı göndermiyor gibi geldi backteste göre.
0 0
Merhaba, Stratejiye SendOrderSequential(true, Side.All) satırını eklediyseniz böyle bir durum oluşmamalı. Tekrar detaylı test ettikten sonra sorun varsa backtestte kullandığınız parametreleri yazar mısınız?
8,636 soru
8,590 cevap
4,821 yorum
19,786 kullanıcı