Fix positions for backtests

This commit is contained in:
2025-11-12 19:45:30 +07:00
parent 57ba32f31e
commit e0d2111553
4 changed files with 33 additions and 88 deletions

View File

@@ -61,7 +61,8 @@ public static class TradingBox
Dictionary<string, LightSignal> previousSignal, int? loopbackPeriod,
Dictionary<IndicatorType, IndicatorsResultBase> preCalculatedIndicatorValues)
{
return GetSignal(newCandles, scenario, previousSignal, _defaultConfig, loopbackPeriod, preCalculatedIndicatorValues);
return GetSignal(newCandles, scenario, previousSignal, _defaultConfig, loopbackPeriod,
preCalculatedIndicatorValues);
}
public static LightSignal GetSignal(HashSet<Candle> newCandles, LightScenario lightScenario,
@@ -75,24 +76,11 @@ public static class TradingBox
Dictionary<IndicatorType, IndicatorsResultBase> preCalculatedIndicatorValues)
{
var signalOnCandles = new List<LightSignal>();
// Optimize list creation - avoid redundant allocations and multiple ordering
List<Candle> limitedCandles;
if (newCandles.Count <= 600)
{
// For small sets, just order once
limitedCandles = newCandles.OrderBy(c => c.Date).ToList();
}
else
{
// For large sets, use more efficient approach: sort then take last
var sorted = newCandles.OrderBy(c => c.Date).ToList();
limitedCandles = sorted.Skip(sorted.Count - 600).ToList();
}
foreach (var indicator in lightScenario.Indicators)
{
IIndicator indicatorInstance = indicator.ToInterface();
// Use pre-calculated indicator values if available (for backtest optimization)
List<LightSignal> signals;
if (preCalculatedIndicatorValues != null && preCalculatedIndicatorValues.ContainsKey(indicator.Type))
@@ -122,10 +110,11 @@ public static class TradingBox
continue;
}
var limitedCandles = newCandles.ToList();
// Optimized: limitedCandles is already ordered, no need to re-order
var loopback = loopbackPeriod.HasValue && loopbackPeriod > 1 ? loopbackPeriod.Value : 1;
var candleLoopback = limitedCandles.Count > loopback
? limitedCandles.Skip(limitedCandles.Count - loopback).ToList()
var candleLoopback = limitedCandles.Count > loopback
? limitedCandles.Skip(limitedCandles.Count - loopback).ToList()
: limitedCandles;
if (!candleLoopback.Any())