Matriks Destek ve Yardım Platformu

Matriks Ürünleri ile ilgili tüm sorularınız için bizlere buradan ulaşabilirsiniz. Daha önce sorulan soruları ve verilen cevapları ilgili sekmelerden ve arama üzerinden inceleyebilirsiniz. Sağ taraftaki kategoriler üzerinden İlgilendiğiniz özelliklerle ilgili soruları filtreleyebilirsiniz. Soru ve cevapları sosyal medyada paylaşabilirsiniz. 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.

0

Matriksiq backtest hatası

Soruldu
Görüntülenme
700 görüntülenme
Durum
Cevaplandı

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

 

 

Paylaş

1 Cevap

0
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.
BağlantıBayraklasmookeus110

Cevabınız

Cevap yazmak için giriş yapın.Giriş yapKayıt ol