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

 

Strateji calistirildi
23.11.2023 13:20:00 : System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
   at Matriks.Data.Series.ListDictionary.get_Item(Int32 key)
   at Matriks.Lean.Algotrader.bolrsi.OnDataUpdate(BarDataEventArgs barData)
   at Matriks.Lean.Algotrader.AlgoBase.MatriksAlgo.TriggerUserCode(BarDataEventArgs e)

Programı öğrenmek için basit şeyler yazmaya çalışıyorum, aşağıdaki kodu backtestte 01/01/2023 - 31/12/2023 arası için çalıştırdığımda yukarıdaki uyarıyı alıyorum. Sebebini çözemedim.

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;
using Matriks.Data.Tick;
using Matriks.Enumeration;
using Matriks.IntermediaryInstitutionAnalysis.Enums;

namespace Matriks.Lean.Algotrader
{
	public class rsi : MatriksAlgo
	{
		[SymbolParameter("SISE")]
		public string Sembol;

		[SymbolParameter("USDTRY")]
		public string Doviz;

		[Parameter(SymbolPeriod.Min10)]
		public SymbolPeriod SembolPeriyodu;

		[Parameter(10)]
		public decimal SatinAlimSayisi;

		[Parameter(10)]
		public decimal SatisSayisi;

		[Parameter(14)]
		public int RsiPeriodu;

		[Parameter(70)]
		public decimal RsiYuksek;

		[Parameter(25)]
		public decimal RsiDusuk;

		[Output]
		public decimal RSI;

		decimal AlisFiyati = 0;

		int alsat = 1;

		RSI rsi;


		public override void OnInit()
		{

			rsi = RSIIndicator(Sembol, SembolPeriyodu, OHLCType.Close, RsiPeriodu);

			AddSymbol(Sembol, SembolPeriyodu);

			AddSymbol(Doviz, SembolPeriyodu);

			WorkWithPermanentSignal(true);
		}

		public override void OnDataUpdate(BarDataEventArgs barData)
		{
			var hisse_data = GetBarData(Sembol, SembolPeriyodu);
			var USD_data = GetBarData(Doviz, SembolPeriyodu);
			var hisse = hisse_data.Close[hisse_data.BarDataIndexer.LastBarIndex];
			var USD = USD_data.Close[USD_data.BarDataIndexer.LastBarIndex];
			Debug(hisse);
			if (rsi.CurrentValue < RsiDusuk && alsat == 1)
			{
				SendMarketOrder(Sembol, SatinAlimSayisi, (OrderSide.Buy));
				AlisFiyati = Math.Round(hisse / USD, 4);
				alsat = 0;
				Debug("RSİ verisi (" + rsi.CurrentValue + ") " +RsiDusuk +"dan küçük");
				Debug("-----------------------------------------------");
			}
			if (rsi.CurrentValue > RsiYuksek && (hisse / USD) > (AlisFiyati * 1.01m) && alsat == 0)
			{
				SendMarketOrder(Sembol, SatisSayisi, (OrderSide.Sell));
				alsat = 1;
				Debug("RSİ verisi (" + rsi.CurrentValue + ") " + RsiYuksek + "ten büyük");
				Debug("Bar Datası (" + barData.BarData.Close + ") Alış fiyatından (" + AlisFiyati + ") büyük olduğu için satıldı");
				Debug("-----------------------------------------------");
			}
			Debug("---------------Beklemede-------------------");
			Debug("RSI: " + rsi.CurrentValue);
			Debug("Fiyat " + barData.BarData.Close);
			Debug("Alış Fyatı : " + AlisFiyati);
			Debug("---------------Beklemede-------------------");
		}

		public override void OnStopped()
		{
		}
	}
}

 

Algoritmik Trading kategorisinde (250 puan) tarafından
tarafından düzenlendi | 280 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme
En İyi Cevap

Merhaba,

Kullandığınız indeks aralık dışında olduğunu için hata oluşuyor.

var hisse_data = GetBarData(Sembol, SembolPeriyodu);
var USD_data = GetBarData(Doviz, SembolPeriyodu);
var hisse = hisse_data.Close[hisse_data.BarDataIndexer.LastBarIndex];
var USD = USD_data.Close[USD_data.BarDataIndexer.LastBarIndex];

SISE 10DK için 15.12.2023 tarihine kadar giderken USDTRY 10DK grafik verileri 14.02.2024 tarihine kadar gitmektedir grafikten kontrol edebilirsiniz. tarih aralığını iki sembol içinde uygun bir şekilde girip deneyebilirsiniz.

Ayrıca çoklu sembol ya da periyot kullanıldığında istenmeyen sinyallerin oluşmaması adına ek kontroller eklenmesi gerekir.

Çoklu sembol kontrolü

public override void OnDataUpdate(BarDataEventArgs barData)
{
	if (barData.SymbolId == GetSymbolId(SinyalOlusturanSembol))
	{
        if (CrossBelow(alphaTrend, alphaTrend, 0, 1))
		{
			SendMarketOrder(IslemYapilacakSembol, BuyOrderQuantity, OrderSide.Buy, includeAfterSession:false);
		}
		if (CrossAbove(alphaTrend, alphaTrend, 0, 1))
		{
			SendMarketOrder(IslemYapilacakSembol, SellOrderQuantity, OrderSide.Sell, includeAfterSession:false);
		}		
	}
}

Çoklu periyot kontrolü

public override void OnDataUpdate(BarDataEventArgs barData)
{
	if (barData.PeriodInfo == GrafikPeriod.ToPeriodInfo())
	{
		if (CrossAbove(mov, mov2))
		{
			SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
		}

		if (CrossBelow(mov, mov2))
		{
			SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
		}
	}
}

 

(15,892 puan) tarafından
tarafından seçilmiş
0 0
Cevabınız için teşekkürler. Sadece bir kaç hafta geriye gidebilen veriler ile backtest çok manasız olmuş.
8,635 soru
8,589 cevap
4,821 yorum
19,782 kullanıcı