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

İyi günler;

Aşağıda gönderdiğim kod normal çalıştırıldığında hata vermezken, backtest ile çalıştırdığımda initialization sırasında hata veriyor. Yardımcı olursanız sevinirim.

using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using System.Windows.Media;
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;
using System.Timers;

//===========================================ACIKLAMA=======================================//
// MOST indikatöründe, ExMOV bandının MOST bandını yukarı doğru kesmesi al sinyali,  		//
// aşağı doğru kesmesi ise sat sinyali olarak kabul edilir.									//
// Emirler piyasa fiyatından gönderilecektir.                                            	//
// Kenan Karagöz-09/12/2023


namespace Matriks.Lean.Algotrader
{
	public class myMost : 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("TTKOM")]
		public string Symbol;

		[Parameter(SymbolPeriod.Min5)]
		public SymbolPeriod SymbolPeriod;
		[Parameter(1000)]
		public decimal IslemHacmi;

		[Parameter(3)]
		public int MostPeriod;

		[Parameter(2)]
		public decimal MostPercentage;

		[Parameter(true)]
		public bool TrailingStopKullan;

		[Parameter(2)]
		public decimal TrailingStopYuzdesi;

		decimal OrderQuantity = 0;

		Dictionary<string, AlgoTraderPosition> positions;
		public Timer ProtectionTimer;
		enum ProtectionType
		{
			prNone, prDontBuy, prDontSell
		};
		ProtectionType protection = ProtectionType.prNone;

		MOST most;

		private bool CheckBuySignal()
		{
			return (most.Value[0][most.CurrentIndex] < most.Value[1][most.CurrentIndex]);
		}

		private bool CheckSellSignal()
		{
			return (most.Value[0][most.CurrentIndex] > most.Value[1][most.CurrentIndex]);
		}
		/// <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, MostPeriod, MostPercentage, MovMethod.Exponential);
			AddSymbol(Symbol, SymbolPeriod);
			WorkWithPermanentSignal(false);
			positions = GetRealPositions();
			if (positions.ContainsKey(Symbol))
				SendOrderSequential(true, Side.Sell);
			else
				SendOrderSequential(true, Side.Buy);
			ProtectionTimer = new Timer(60000 * 4);
			ProtectionTimer.Elapsed += OnCustomTimer;
			OrderQuantity = 0;
			if (SymbolPositionExists())
			{
				OrderQuantity = positions[Symbol].QtyAvailable;
			}
		}


		/// <summary>
		/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
		/// </summary>
		private void OnCustomTimer(object sender, ElapsedEventArgs e)
		{
			positions = GetRealPositions();
			protection = ProtectionType.prNone;
			ProtectionTimer.Stop();
			positions.Clear();
		}

		/// <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)
		{
			Buy(barDataCurrentValues);
			Sell(barDataCurrentValues);
		}


		/// <summary>
		/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
		/// </summary>
		public override void OnStopped()
		{
		}

		private bool SymbolPositionExists()
		{
			return positions.ContainsKey(Symbol);
		}
		private void Buy(BarDataCurrentValues barDataCurrentValues)
		{
			if (protection == ProtectionType.prDontBuy) return;
			if (SymbolPositionExists()) return;
			if (CheckBuySignal())
			{
				OrderQuantity = IslemHacmi / barDataCurrentValues.LastUpdate.LastPrice;
				SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
				if (TrailingStopKullan)
					TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, TrailingStopYuzdesi);
				positions.Add(Symbol, null);
				protection = ProtectionType.prDontBuy;
				ProtectionTimer.Start();
			}
		}
		private void Sell(BarDataCurrentValues barDataCurrentValues)
		{
			if (protection == ProtectionType.prDontSell) return;
			if (!SymbolPositionExists()) return;
			if (CheckSellSignal())
			{
				SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
				protection = ProtectionType.prDontSell;
				ProtectionTimer.Start();
			}
		}
	}
}

 

 

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

1 cevap

0 beğenilme 0 beğenilmeme
Genelde bu tip hata ile karşılaştığımda backtestteki değer aralıklarından birinin başlangıcı uygunsuz oluyor. tarama aralığı başlangıç değeri 0 yaptığını 0.1 veya 1 vb "0" olmayan bir değerle değiştir düzelir muhtemelen.
(108 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.



7,673 soru
7,673 cevap
4,460 yorum
11,249 kullanıcı