diff --git a/src/Managing.Domain/Indicators/Context/StDevContext.cs b/src/Managing.Domain/Indicators/Context/StDevContext.cs index 4a62ca1d..53637f0e 100644 --- a/src/Managing.Domain/Indicators/Context/StDevContext.cs +++ b/src/Managing.Domain/Indicators/Context/StDevContext.cs @@ -33,7 +33,7 @@ public class StDevContext : IndicatorBase ProcessStDevSignals(stDev, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -60,7 +60,6 @@ public class StDevContext : IndicatorBase // Filter pre-calculated StdDev values to match the candles we're processing stDev = preCalculatedValues.StdDev .Where(s => candles.Any(c => c.Date == s.Date)) - .OrderBy(s => s.Date) .ToList(); } @@ -72,7 +71,7 @@ public class StDevContext : IndicatorBase ProcessStDevSignals(stDev, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/ChandelierExitIndicatorBase.cs b/src/Managing.Domain/Indicators/Signals/ChandelierExitIndicatorBase.cs index c0a04bd5..11400b56 100644 --- a/src/Managing.Domain/Indicators/Signals/ChandelierExitIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Signals/ChandelierExitIndicatorBase.cs @@ -32,7 +32,7 @@ public class ChandelierExitIndicatorBase : IndicatorBase { ProcessChandelierSignals(candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -61,11 +61,9 @@ public class ChandelierExitIndicatorBase : IndicatorBase // Filter pre-calculated Chandelier values to match the candles we're processing chandelierLong = preCalculatedValues.ChandelierLong .Where(c => c.ChandelierExit.HasValue && candles.Any(candle => candle.Date == c.Date)) - .OrderBy(c => c.Date) .ToList(); chandelierShort = preCalculatedValues.ChandelierShort .Where(c => c.ChandelierExit.HasValue && candles.Any(candle => candle.Date == c.Date)) - .OrderBy(c => c.Date) .ToList(); } @@ -77,7 +75,7 @@ public class ChandelierExitIndicatorBase : IndicatorBase ProcessChandelierSignalsWithPreCalculated(chandelierLong, chandelierShort, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -127,7 +125,8 @@ public class ChandelierExitIndicatorBase : IndicatorBase ProcessChandelierSignalsForType(chandelier, chandelierType, candles); } - private void GetSignalsWithPreCalculated(ChandelierType chandelierType, List chandelier, HashSet candles) + private void GetSignalsWithPreCalculated(ChandelierType chandelierType, List chandelier, + HashSet candles) { ProcessChandelierSignalsForType(chandelier, chandelierType, candles); } @@ -139,7 +138,8 @@ public class ChandelierExitIndicatorBase : IndicatorBase /// Chandelier calculation results /// Type of Chandelier (Long or Short) /// Candles to process - private void ProcessChandelierSignalsForType(List chandelier, ChandelierType chandelierType, HashSet candles) + private void ProcessChandelierSignalsForType(List chandelier, ChandelierType chandelierType, + HashSet candles) { var chandelierCandle = MapChandelierToCandle(chandelier, candles.TakeLast(MinimumHistory)); if (chandelierCandle.Count == 0) diff --git a/src/Managing.Domain/Indicators/Signals/DualEmaCrossIndicatorBase.cs b/src/Managing.Domain/Indicators/Signals/DualEmaCrossIndicatorBase.cs index 04e53f8c..859a8369 100644 --- a/src/Managing.Domain/Indicators/Signals/DualEmaCrossIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Signals/DualEmaCrossIndicatorBase.cs @@ -47,7 +47,7 @@ public class DualEmaCrossIndicatorBase : EmaBaseIndicatorBase ProcessDualEmaCrossSignals(fastEma, slowEma, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -76,11 +76,9 @@ public class DualEmaCrossIndicatorBase : EmaBaseIndicatorBase // Filter pre-calculated EMA values to match the candles we're processing fastEma = preCalculatedValues.FastEma .Where(e => candles.Any(c => c.Date == e.Date)) - .OrderBy(e => e.Date) .ToList(); slowEma = preCalculatedValues.SlowEma .Where(e => candles.Any(c => c.Date == e.Date)) - .OrderBy(e => e.Date) .ToList(); } @@ -92,7 +90,7 @@ public class DualEmaCrossIndicatorBase : EmaBaseIndicatorBase ProcessDualEmaCrossSignals(fastEma, slowEma, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/EmaCrossIndicator.cs b/src/Managing.Domain/Indicators/Signals/EmaCrossIndicator.cs index 31e48cc2..93eea26e 100644 --- a/src/Managing.Domain/Indicators/Signals/EmaCrossIndicator.cs +++ b/src/Managing.Domain/Indicators/Signals/EmaCrossIndicator.cs @@ -41,7 +41,7 @@ public class EmaCrossIndicator : EmaBaseIndicatorBase ProcessEmaCrossSignals(ema, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -79,7 +79,7 @@ public class EmaCrossIndicator : EmaBaseIndicatorBase ProcessEmaCrossSignals(ema, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/EmaCrossIndicatorBase.cs b/src/Managing.Domain/Indicators/Signals/EmaCrossIndicatorBase.cs index 82842a2d..4eb4157c 100644 --- a/src/Managing.Domain/Indicators/Signals/EmaCrossIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Signals/EmaCrossIndicatorBase.cs @@ -41,7 +41,7 @@ public class EmaCrossIndicatorBase : EmaBaseIndicatorBase ProcessEmaCrossSignals(ema, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -68,7 +68,6 @@ public class EmaCrossIndicatorBase : EmaBaseIndicatorBase // Filter pre-calculated EMA values to match the candles we're processing ema = preCalculatedValues.Ema .Where(e => candles.Any(c => c.Date == e.Date)) - .OrderBy(e => e.Date) .ToList(); } @@ -80,7 +79,7 @@ public class EmaCrossIndicatorBase : EmaBaseIndicatorBase ProcessEmaCrossSignals(ema, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/LaggingSTC.cs b/src/Managing.Domain/Indicators/Signals/LaggingSTC.cs index b0004474..a0fd1c65 100644 --- a/src/Managing.Domain/Indicators/Signals/LaggingSTC.cs +++ b/src/Managing.Domain/Indicators/Signals/LaggingSTC.cs @@ -43,7 +43,7 @@ public class LaggingSTC : IndicatorBase ProcessLaggingStcSignals(stc, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -70,7 +70,6 @@ public class LaggingSTC : IndicatorBase // Filter pre-calculated STC values to match the candles we're processing stc = preCalculatedValues.Stc .Where(s => candles.Any(c => c.Date == s.Date)) - .OrderBy(s => s.Date) .ToList(); } @@ -82,7 +81,7 @@ public class LaggingSTC : IndicatorBase ProcessLaggingStcSignals(stc, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/MacdCrossIndicatorBase.cs b/src/Managing.Domain/Indicators/Signals/MacdCrossIndicatorBase.cs index 2f6183db..eeb65e91 100644 --- a/src/Managing.Domain/Indicators/Signals/MacdCrossIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Signals/MacdCrossIndicatorBase.cs @@ -36,7 +36,7 @@ public class MacdCrossIndicatorBase : IndicatorBase ProcessMacdSignals(macd, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -63,7 +63,6 @@ public class MacdCrossIndicatorBase : IndicatorBase // Filter pre-calculated MACD values to match the candles we're processing macd = preCalculatedValues.Macd .Where(m => candles.Any(c => c.Date == m.Date)) - .OrderBy(m => m.Date) .ToList(); } @@ -75,7 +74,7 @@ public class MacdCrossIndicatorBase : IndicatorBase ProcessMacdSignals(macd, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/RsiDivergenceConfirmIndicatorBase.cs b/src/Managing.Domain/Indicators/Signals/RsiDivergenceConfirmIndicatorBase.cs index 4471367c..f11fd9da 100644 --- a/src/Managing.Domain/Indicators/Signals/RsiDivergenceConfirmIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Signals/RsiDivergenceConfirmIndicatorBase.cs @@ -37,7 +37,7 @@ public class RsiDivergenceConfirmIndicatorBase : IndicatorBase ProcessRsiDivergenceConfirmSignals(rsiResult, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -65,7 +65,6 @@ public class RsiDivergenceConfirmIndicatorBase : IndicatorBase var relevantCandles = candles.TakeLast(10 * Period.Value); rsiResult = preCalculatedValues.Rsi .Where(r => relevantCandles.Any(c => c.Date == r.Date)) - .OrderBy(r => r.Date) .ToList(); } @@ -77,7 +76,7 @@ public class RsiDivergenceConfirmIndicatorBase : IndicatorBase ProcessRsiDivergenceConfirmSignals(rsiResult, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/StcIndicatorBase.cs b/src/Managing.Domain/Indicators/Signals/StcIndicatorBase.cs index bbf16f9d..2655d682 100644 --- a/src/Managing.Domain/Indicators/Signals/StcIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Signals/StcIndicatorBase.cs @@ -39,7 +39,7 @@ public class StcIndicatorBase : IndicatorBase ProcessStcSignals(stc, candles); } - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -66,7 +66,6 @@ public class StcIndicatorBase : IndicatorBase // Filter pre-calculated STC values to match the candles we're processing stc = preCalculatedValues.Stc .Where(s => candles.Any(c => c.Date == s.Date)) - .OrderBy(s => s.Date) .ToList(); } @@ -78,7 +77,7 @@ public class StcIndicatorBase : IndicatorBase ProcessStcSignals(stc, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Signals/SuperTrendCrossEma.cs b/src/Managing.Domain/Indicators/Signals/SuperTrendCrossEma.cs index c2809e65..18bbe6a3 100644 --- a/src/Managing.Domain/Indicators/Signals/SuperTrendCrossEma.cs +++ b/src/Managing.Domain/Indicators/Signals/SuperTrendCrossEma.cs @@ -48,10 +48,10 @@ public class SuperTrendCrossEma : IndicatorBase .Where(a => a.Adx.HasValue && a.Pdi.HasValue && a.Mdi.HasValue) // Ensure all values exist .ToList(); - ProcessSuperTrendCrossEmaSignals(superTrend, ema50, adxResults, candles, minimumRequiredHistory, adxThreshold); + ProcessSuperTrendCrossEmaSignals(superTrend, ema50, adxResults, candles, minimumRequiredHistory, + adxThreshold); return Signals.Where(s => s.Confidence != Confidence.None) - .OrderBy(s => s.Date) .ToList(); } catch (RuleException) @@ -111,7 +111,6 @@ public class SuperTrendCrossEma : IndicatorBase // Filter pre-calculated SuperTrend values to match the candles we're processing superTrend = preCalculatedValues.SuperTrend .Where(s => s.SuperTrend.HasValue && candles.Any(c => c.Date == s.Date)) - .OrderBy(s => s.Date) .ToList(); } @@ -132,10 +131,10 @@ public class SuperTrendCrossEma : IndicatorBase .Where(a => a.Adx.HasValue && a.Pdi.HasValue && a.Mdi.HasValue) .ToList(); - ProcessSuperTrendCrossEmaSignals(superTrend, ema50, adxResults, candles, minimumRequiredHistory, adxThreshold); + ProcessSuperTrendCrossEmaSignals(superTrend, ema50, adxResults, candles, minimumRequiredHistory, + adxThreshold); return Signals.Where(s => s.Confidence != Confidence.None) - .OrderBy(s => s.Date) .ToList(); } catch (RuleException) diff --git a/src/Managing.Domain/Indicators/Signals/SuperTrendIndicatorBase.cs b/src/Managing.Domain/Indicators/Signals/SuperTrendIndicatorBase.cs index dcfd673b..0bba3b48 100644 --- a/src/Managing.Domain/Indicators/Signals/SuperTrendIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Signals/SuperTrendIndicatorBase.cs @@ -37,7 +37,7 @@ public class SuperTrendIndicatorBase : IndicatorBase ProcessSuperTrendSignals(superTrend, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { @@ -64,7 +64,6 @@ public class SuperTrendIndicatorBase : IndicatorBase // Filter pre-calculated SuperTrend values to match the candles we're processing superTrend = preCalculatedValues.SuperTrend .Where(s => s.SuperTrend.HasValue && candles.Any(c => c.Date == s.Date)) - .OrderBy(s => s.Date) .ToList(); } @@ -76,7 +75,7 @@ public class SuperTrendIndicatorBase : IndicatorBase ProcessSuperTrendSignals(superTrend, candles); - return Signals.Where(s => s.Confidence != Confidence.None).OrderBy(s => s.Date).ToList(); + return Signals.Where(s => s.Confidence != Confidence.None).ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Trends/EmaTrendIndicatorBase.cs b/src/Managing.Domain/Indicators/Trends/EmaTrendIndicatorBase.cs index a2cf0244..3de2c984 100644 --- a/src/Managing.Domain/Indicators/Trends/EmaTrendIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Trends/EmaTrendIndicatorBase.cs @@ -33,7 +33,7 @@ public class EmaTrendIndicatorBase : EmaBaseIndicatorBase ProcessEmaTrendSignals(ema, candles); - return Signals.OrderBy(s => s.Date).ToList(); + return Signals.ToList(); } catch (RuleException) { @@ -60,7 +60,6 @@ public class EmaTrendIndicatorBase : EmaBaseIndicatorBase // Filter pre-calculated EMA values to match the candles we're processing ema = preCalculatedValues.Ema .Where(e => candles.Any(c => c.Date == e.Date)) - .OrderBy(e => e.Date) .ToList(); } @@ -72,7 +71,7 @@ public class EmaTrendIndicatorBase : EmaBaseIndicatorBase ProcessEmaTrendSignals(ema, candles); - return Signals.OrderBy(s => s.Date).ToList(); + return Signals.ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Indicators/Trends/StochRsiTrendIndicatorBase.cs b/src/Managing.Domain/Indicators/Trends/StochRsiTrendIndicatorBase.cs index 35574362..372ad996 100644 --- a/src/Managing.Domain/Indicators/Trends/StochRsiTrendIndicatorBase.cs +++ b/src/Managing.Domain/Indicators/Trends/StochRsiTrendIndicatorBase.cs @@ -44,7 +44,7 @@ public class StochRsiTrendIndicatorBase : IndicatorBase ProcessStochRsiTrendSignals(stochRsi, candles); - return Signals.OrderBy(s => s.Date).ToList(); + return Signals.ToList(); } catch (RuleException) { @@ -71,7 +71,6 @@ public class StochRsiTrendIndicatorBase : IndicatorBase // Filter pre-calculated StochRsi values to match the candles we're processing stochRsi = preCalculatedValues.StochRsi .Where(s => s.Signal.HasValue && candles.Any(c => c.Date == s.Date)) - .OrderBy(s => s.Date) .ToList(); } @@ -83,7 +82,7 @@ public class StochRsiTrendIndicatorBase : IndicatorBase ProcessStochRsiTrendSignals(stochRsi, candles); - return Signals.OrderBy(s => s.Date).ToList(); + return Signals.ToList(); } catch (RuleException) { diff --git a/src/Managing.Domain/Shared/Helpers/TradingBox.cs b/src/Managing.Domain/Shared/Helpers/TradingBox.cs index 62720c3b..d5b09517 100644 --- a/src/Managing.Domain/Shared/Helpers/TradingBox.cs +++ b/src/Managing.Domain/Shared/Helpers/TradingBox.cs @@ -82,16 +82,16 @@ public static class TradingBox // Validate required parameters if (lightScenario == null) throw new ArgumentNullException(nameof(lightScenario), "Scenario cannot be null"); - + if (newCandles == null) throw new ArgumentNullException(nameof(newCandles), "Candles cannot be null"); - + // Empty candles or no indicators is a valid business case - return null if (!newCandles.Any() || lightScenario.Indicators == null || !lightScenario.Indicators.Any()) { return null; } - + var signalOnCandles = new List(); foreach (var indicator in lightScenario.Indicators) @@ -189,19 +189,19 @@ public static class TradingBox { // Only one strategy, return the single signal if it meets minimum confidence var signal = signalOnCandles.Single(); - + // Check if signal meets minimum confidence threshold // None confidence should always be rejected regardless of threshold if (signal.Confidence == Confidence.None || signal.Confidence < config.MinimumConfidence) { return null; // Below minimum confidence threshold or None } - + return signal; } // Optimized: Sort only if needed, then convert to HashSet - var orderedSignals = signalOnCandles.OrderBy(s => s.Date).ToList(); + var orderedSignals = signalOnCandles.ToList(); signalOnCandles = new HashSet(orderedSignals); // Check if all strategies produced signals - this is required for composite signals @@ -246,7 +246,8 @@ public static class TradingBox // Calculate confidence based on the average confidence of all signals var averageConfidence = CalculateAverageConfidence(allDirectionalSignals); - if (finalDirection == TradeDirection.None || averageConfidence == Confidence.None || averageConfidence < config.MinimumConfidence) + if (finalDirection == TradeDirection.None || averageConfidence == Confidence.None || + averageConfidence < config.MinimumConfidence) { return null; // No valid signal, None confidence, or below minimum confidence } @@ -465,12 +466,13 @@ public static class TradingBox { var stopLoss = 0M; var takeProfit = 0M; - + // Filter candles after the position's opening trade was filled, up to the next position var candlesBeforeNextPosition = candles.Where(c => - c.Date >= position.Open.Date && c.Date <= (nextPosition == null ? candles.Last().Date : nextPosition.Open.Date)) + c.Date >= position.Open.Date && + c.Date <= (nextPosition == null ? candles.Last().Date : nextPosition.Open.Date)) .ToList(); - + // If no candles after position opened, return zeros if (!candlesBeforeNextPosition.Any()) { @@ -585,8 +587,8 @@ public static class TradingBox public static AgentSummaryMetrics CalculateAgentSummaryMetrics(List positions) { var validPositions = positions? - .Where(p => p.IsValidForMetrics()) - .ToList() ?? new List(); + .Where(p => p.IsValidForMetrics()) + .ToList() ?? new List(); if (!validPositions.Any()) { @@ -613,7 +615,8 @@ public static class TradingBox /// List of all positions to analyze /// Previous total volume to ensure cumulative volume never decreases /// PlatformSummaryMetrics with all calculated values - public static PlatformSummaryMetrics CalculatePlatformSummaryMetrics(List positions, decimal previousTotalVolume = 0m) + public static PlatformSummaryMetrics CalculatePlatformSummaryMetrics(List positions, + decimal previousTotalVolume = 0m) { if (positions == null || !positions.Any()) { @@ -660,12 +663,14 @@ public static class TradingBox if (position.TakeProfit1?.Status == TradeStatus.Filled) { - closingVolume += position.TakeProfit1.Price * position.TakeProfit1.Quantity * position.TakeProfit1.Leverage; + closingVolume += position.TakeProfit1.Price * position.TakeProfit1.Quantity * + position.TakeProfit1.Leverage; } if (position.TakeProfit2?.Status == TradeStatus.Filled) { - closingVolume += position.TakeProfit2.Price * position.TakeProfit2.Quantity * position.TakeProfit2.Leverage; + closingVolume += position.TakeProfit2.Price * position.TakeProfit2.Quantity * + position.TakeProfit2.Leverage; } } @@ -683,6 +688,7 @@ public static class TradingBox { volumeByAsset[ticker] = 0; } + volumeByAsset[ticker] += positionVolume; // Position count breakdown by asset - update state directly @@ -690,6 +696,7 @@ public static class TradingBox { positionCountByAsset[ticker] = 0; } + positionCountByAsset[ticker]++; // Calculate fees and PnL for all positions @@ -709,6 +716,7 @@ public static class TradingBox { positionCountByDirection[direction] = 0; } + positionCountByDirection[direction]++; } } @@ -1183,10 +1191,11 @@ public static class TradingBox /// The leverage multiplier /// The trade direction (Long or Short) /// The calculated PnL - public static decimal CalculatePnL(decimal entryPrice, decimal exitPrice, decimal quantity, decimal leverage, TradeDirection direction) + public static decimal CalculatePnL(decimal entryPrice, decimal exitPrice, decimal quantity, decimal leverage, + TradeDirection direction) { var positionSize = CalculatePositionSize(quantity, leverage); - + if (direction == TradeDirection.Long) { return (exitPrice - entryPrice) * positionSize; @@ -1301,7 +1310,8 @@ public static class TradingBox /// Maximum allowed loss streak (0 or negative means no limit) /// The direction of the signal for the new position /// True if position can be opened, false if blocked by loss streak - public static bool CheckLossStreak(List recentPositions, int maxLossStreak, TradeDirection signalDirection) + public static bool CheckLossStreak(List recentPositions, int maxLossStreak, + TradeDirection signalDirection) { // If MaxLossStreak is 0, there's no limit if (maxLossStreak <= 0) diff --git a/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv b/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv index b508c964..40c0b26d 100644 --- a/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv +++ b/src/Managing.Workers.Tests/performance-benchmarks-two-scenarios.csv @@ -20,3 +20,4 @@ DateTime,TestName,CandlesCount,ExecutionTimeSeconds,ProcessingRateCandlesPerSec, 2025-11-14T12:46:43Z,Telemetry_ETH_RSI_EMACROSS,5760,3.86,1491.9,29.05,20.88,36.27,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,b60295fc,dev,development 2025-11-15T06:46:21Z,Telemetry_ETH_RSI_EMACROSS,5760,12.58,457.8,28.82,21.79,35.28,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,e814eb74,dev,development 2025-11-15T06:50:04Z,Telemetry_ETH_RSI_EMACROSS,5760,4.84,1190.4,29.01,19.10,35.17,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,e814eb74,dev,development +2025-11-15T07:11:55Z,Telemetry_ETH_RSI_EMACROSS,5760,5.44,1059.4,28.81,18.07,33.80,0.0,0,0.0,0.0,0.0,0.0,-35450.45,20,-49.76,0.00,bed25e72,dev,development diff --git a/src/Managing.Workers.Tests/performance-benchmarks.csv b/src/Managing.Workers.Tests/performance-benchmarks.csv index 219c5fa8..e18d13ac 100644 --- a/src/Managing.Workers.Tests/performance-benchmarks.csv +++ b/src/Managing.Workers.Tests/performance-benchmarks.csv @@ -65,3 +65,4 @@ DateTime,TestName,CandlesCount,ExecutionTimeSeconds,ProcessingRateCandlesPerSec, 2025-11-14T12:46:43Z,Telemetry_ETH_RSI,5760,3.44,1669.8,28.85,20.34,35.90,0.00,0,0.0,3304.34,0.00,0.57,-30689.97,24,-51.70,0.00,b60295fc,dev,development 2025-11-15T06:46:21Z,Telemetry_ETH_RSI,5760,4.83,1191.0,29.02,20.22,37.20,4105.51,0,0.0,499.39,0.00,0.09,-30689.97,24,-51.70,0.00,e814eb74,dev,development 2025-11-15T06:50:04Z,Telemetry_ETH_RSI,5760,4.47,1286.2,28.81,20.58,34.89,3324.75,0,0.0,965.71,0.00,0.17,-30689.97,24,-51.70,0.00,e814eb74,dev,development +2025-11-15T07:11:55Z,Telemetry_ETH_RSI,5760,3.365,1707.1,29.06,20.43,36.29,2872.29,0,0.0,371.33,0.00,0.06,-30689.97,24,-51.70,0.00,bed25e72,dev,development