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

backtest hatası

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

İyi günler;yıllardır metatrader kullanıyorum. matriksiq ilk kez deniyorum.

Sanırım getrealpositions backtestte çalışmıyor. Ayrıca timer ların da simule edilemediğini düşünüyorum. yazdığım koda testing diye bir değişken ekledim. backtestte hata almamak için. test yapacağım zaman bunu true olarak değiştiriyorum.

 bunun dışında kodumda gözünüze çarpan bir hata var ise bildirirseniz sevinirim.

Teşekkürler.

 

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;


		decimal OrderQuantity = 0;
		bool Testing = false;
		Dictionary<string, AlgoTraderPosition> positions;
		public Timer modeTimer;
		enum ProcessMode
		{
			pmFree, pmWait
		};
		ProcessMode mode = ProcessMode.pmFree;

		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);
			if (!Testing)
			{
				positions = GetRealPositions();
				if (positions.ContainsKey(Symbol))
				{
					SendOrderSequential(true, Side.Sell);
					Debug("Açık Emir bulundu. Satış çalışıyor");
				}
				else
				{
					SendOrderSequential(true, Side.Buy);
					Debug("Açık Emir bulunamadı. Alış çalışıyor");
				}
			}
			else
			{
				SendOrderSequential(true, Side.Buy);
				positions = new Dictionary<string, AlgoTraderPosition>();
			}
			modeTimer = new Timer(60000 * 4);
			modeTimer.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)
		{
			if (!Testing)
				positions = GetRealPositions();
			mode = ProcessMode.pmFree;
			modeTimer.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()
		{
		}
		/// <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)
		{
			if (order.OrdStatus.Obj == OrdStatus.Filled)
			{

			}
		}

		private bool SymbolPositionExists()
		{
			return positions.ContainsKey(Symbol);
		}
		private void Buy(BarDataCurrentValues barDataCurrentValues)
		{
			if (mode == ProcessMode.pmWait) return;
			if (SymbolPositionExists()) return;
			if (CheckBuySignal())
			{
				OrderQuantity = IslemHacmi / barDataCurrentValues.LastUpdate.LastPrice;
				SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
				positions.Add(Symbol, null);
				if (!Testing)
				{
					mode = ProcessMode.pmWait;
					modeTimer.Start();
				}
				if (Testing)
					positions.Add(Symbol, null);
			}
		}
		private void Sell(BarDataCurrentValues barDataCurrentValues)
		{
			if (mode == ProcessMode.pmWait) return;
			if (!SymbolPositionExists()) return;
			if (CheckSellSignal())
			{
				SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
				if (!Testing)
				{
					mode = ProcessMode.pmWait;
					modeTimer.Start();
				}
				if (Testing)
					positions.Remove(Symbol);
			}
		}
	}
}

 

 

Paylaş

1 Cevap

0

Merhaba,

Yapı gereği backtestte timer metodu tetiklenmez portföy okuma, yüzeysel, derinlik verileri kullanılmaz.

testing değişkeni yerine gömülü olan livemodu değişkenini kullanabilirsiniz.kullanulabilirsiniz.

 

if (LiveMode)
			{
				positions = GetRealPositions();
				if (positions.ContainsKey(Symbol))
				{
					SendOrderSequential(true, Side.Sell);
					Debug("Açık Emir bulundu. Satış çalışıyor");
				}
				else
				{
					SendOrderSequential(true, Side.Buy);
					Debug("Açık Emir bulunamadı. Alış çalışıyor");
				}
			}
			else
			{
				SendOrderSequential(true, Side.Buy);
				positions = new Dictionary<string, AlgoTraderPosition>();
			}

 

Unblocked Games offering a wide range of experiences: action, puzzle, platform, racing, clicker mechanics, strategy, sports, even horror.
https://unblocked1games.github.io
BağlantıBayraklaKripexMatriks Destek16.499

Cevabınız

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