@@ -149,7 +149,7 @@ public void DailySampleValueBasedOnMarketHour(bool extendedMarketHoursEnabled)
149149 using var messagging = new QuantConnect . Messaging . Messaging ( ) ;
150150 var referenceDate = new DateTime ( 2020 , 11 , 25 ) ;
151151 var resultHandler = new LiveTradingResultHandler ( ) ;
152- resultHandler . Initialize ( new ( new LiveNodePacket ( ) , messagging , api , new BacktestingTransactionHandler ( ) , null ) ) ;
152+ resultHandler . Initialize ( new ( new LiveNodePacket ( ) , messagging , api , new BacktestingTransactionHandler ( ) , null ) ) ;
153153
154154 try
155155 {
@@ -190,6 +190,62 @@ public void DailySampleValueBasedOnMarketHour(bool extendedMarketHoursEnabled)
190190 }
191191 }
192192
193+ [ Test ]
194+ public void TrimChartsUsesLongerWindowForPerformanceCharts ( )
195+ {
196+ var handler = new TestableLiveTradingResultHandler ( ) ;
197+ var utcNow = new DateTime ( 2020 , 11 , 25 , 12 , 0 , 0 , DateTimeKind . Utc ) ;
198+
199+ var benchmarkChart = new Chart ( BaseResultsHandler . BenchmarkKey ) ;
200+ benchmarkChart . Series . Add ( BaseResultsHandler . BenchmarkKey , new Series ( BaseResultsHandler . BenchmarkKey ) ) ;
201+ handler . Charts [ BaseResultsHandler . BenchmarkKey ] = benchmarkChart ;
202+
203+ // Add a custom user chart to verify it still uses the 2 day window
204+ var customChart = new Chart ( "MyCustomChart" ) ;
205+ customChart . Series . Add ( "MyMetric" , new Series ( "MyMetric" ) ) ;
206+ handler . Charts [ "MyCustomChart" ] = customChart ;
207+
208+ var returnSeries = handler . Charts [ BaseResultsHandler . StrategyEquityKey ] . Series [ BaseResultsHandler . ReturnKey ] ;
209+ var equitySeries = handler . Charts [ BaseResultsHandler . StrategyEquityKey ] . Series [ BaseResultsHandler . EquityKey ] ;
210+ var benchmarkSeries = benchmarkChart . Series [ BaseResultsHandler . BenchmarkKey ] ;
211+ var customSeries = customChart . Series [ "MyMetric" ] ;
212+
213+ // performance charts: 15 daily samples covering well beyond both trim windows
214+ for ( var i = 15 ; i >= 1 ; i -- )
215+ {
216+ var t = utcNow . AddDays ( - i ) ;
217+ returnSeries . Values . Add ( new ChartPoint ( t , i ) ) ;
218+ benchmarkSeries . Values . Add ( new ChartPoint ( t , i ) ) ;
219+ equitySeries . Values . Add ( new Candlestick ( t , 100 , 110 , 90 , 105 ) ) ;
220+ }
221+
222+ // custom chart: 5 samples to verify it uses the 2-day window
223+ for ( var i = 5 ; i >= 1 ; i -- )
224+ {
225+ customSeries . Values . Add ( new ChartPoint ( utcNow . AddDays ( - i ) , i ) ) ;
226+ }
227+
228+ handler . PublicTrimCharts ( utcNow ) ;
229+
230+ // performance charts keep 10 day window
231+ var performanceChartsCutoff = utcNow . AddDays ( - 10 ) ;
232+ Assert . IsTrue ( returnSeries . Values . All ( v => v . Time > performanceChartsCutoff ) ) ;
233+ Assert . IsTrue ( benchmarkSeries . Values . All ( v => v . Time > performanceChartsCutoff ) ) ;
234+ Assert . IsTrue ( equitySeries . Values . All ( v => v . Time > performanceChartsCutoff ) ) ;
235+ Assert . AreEqual ( 9 , returnSeries . Values . Count ) ;
236+ Assert . AreEqual ( 9 , benchmarkSeries . Values . Count ) ;
237+
238+ // other charts keep 2 day window
239+ var otherChartsCutoff = utcNow . AddDays ( - 2 ) ;
240+ Assert . IsTrue ( customSeries . Values . All ( v => v . Time > otherChartsCutoff ) ) ;
241+ Assert . AreEqual ( 1 , customSeries . Values . Count ) ;
242+ }
243+
244+ private class TestableLiveTradingResultHandler : LiveTradingResultHandler
245+ {
246+ public void PublicTrimCharts ( DateTime utcNow ) => TrimCharts ( utcNow ) ;
247+ }
248+
193249 private class TestDataFeed : IDataFeed
194250 {
195251 public bool IsActive { get ; }
0 commit comments