@@ -29,15 +29,12 @@ public class SymbolDataSplitterV2(
2929 /// <returns></returns>
3030 public Task < List < List < SymbolDataV2 > > > SplitAsyncV2 ( List < SymbolDataV2 > symbolsData )
3131 {
32- // --- Enumerating Symbols Data
33- var symbolsDataList = symbolsData . ToList ( ) ;
34-
3532 // --- Quick Symbol Data validation
36- if ( ! QuickSymbolDataValidationV2 ( symbolsDataList ) )
33+ if ( ! QuickSymbolDataValidationV2 ( symbolsData ) )
3734 throw new ArgumentException ( "symbolsData argument contains invalid or not properly sorted data" ) ;
3835
3936 // --- Symbol or timeframe duplicates validation
40- if ( IsThereSymbolTimeframeDuplicatesV2 ( symbolsDataList ) )
37+ if ( IsThereSymbolTimeframeDuplicatesV2 ( symbolsData ) )
4138 throw new ArgumentException ( "symbolsData contain duplicated symbols or timeframes" ) ;
4239
4340 // --- Creating Result Split Symbols Data
@@ -65,19 +62,19 @@ public Task<List<List<SymbolDataV2>>> SplitAsyncV2(List<SymbolDataV2> symbolsDat
6562 }
6663
6764 // --- Getting the correct warmup timeframe
68- WarmupTimeframe = GetWarmupTimeframeV2 ( symbolsDataList ) ;
65+ WarmupTimeframe = GetWarmupTimeframeV2 ( symbolsData ) ;
6966
7067 DateTime ongoingBacktestingTime = BacktestingStartDateTime ;
71- while ( ! AreAllSymbolDataReachedHistoryEndV2 ( symbolsDataList ) )
68+ while ( ! AreAllSymbolDataReachedHistoryEndV2 ( symbolsData ) )
7269 {
7370 var symbolsDataPart = new List < SymbolDataV2 > ( ) ;
74- foreach ( SymbolDataV2 symbol in symbolsDataList )
71+ foreach ( SymbolDataV2 symbol in symbolsData )
7572 {
7673 // --- Checking if there is any symbol with no more history
7774 if ( symbol . Timeframes . Any ( x => x . NoMoreHistory ) )
7875 {
7976 // --- Adding days per split to ongoing backtesting time
80- ongoingBacktestingTime = AddDaysToOngoingBacktestingTime ( ongoingBacktestingTime , symbol == symbolsDataList . Last ( ) ) ;
77+ ongoingBacktestingTime = AddDaysToOngoingBacktestingTime ( ongoingBacktestingTime , symbol == symbolsData . Last ( ) ) ;
8178
8279 continue ;
8380 }
@@ -127,8 +124,8 @@ public Task<List<List<SymbolDataV2>>> SplitAsyncV2(List<SymbolDataV2> symbolsDat
127124 // --- Deleting source candles and readjusting indexes
128125 if ( timeframe . StartIndex > 0 )
129126 {
130- // --- Note that candles readjusting is corrupting source candles perform readjusting
131- timeframe . Candlesticks = timeframe . Candlesticks . Skip ( timeframe . StartIndex ) . ToList ( ) ;
127+ // --- Remove source candles in-place (more efficient than Skip().ToList())
128+ timeframe . Candlesticks . RemoveRange ( 0 , timeframe . StartIndex ) ;
132129
133130 // --- Perform reindexing
134131 timeframe . Index -= timeframe . StartIndex ;
@@ -159,7 +156,7 @@ public Task<List<List<SymbolDataV2>>> SplitAsyncV2(List<SymbolDataV2> symbolsDat
159156 symbolsDataPart . Add ( symbolDataPart ) ;
160157
161158 // --- Adding days per split to ongoing backtesting time
162- ongoingBacktestingTime = AddDaysToOngoingBacktestingTime ( ongoingBacktestingTime , symbol == symbolsDataList . Last ( ) ) ;
159+ ongoingBacktestingTime = AddDaysToOngoingBacktestingTime ( ongoingBacktestingTime , symbol == symbolsData . Last ( ) ) ;
163160 }
164161
165162 // --- Append symbolsDataPart if it contains any record
@@ -218,10 +215,9 @@ private static bool QuickSymbolDataValidationV2(List<SymbolDataV2> symbolsData)
218215 /// <returns></returns>
219216 private static bool IsThereSymbolTimeframeDuplicatesV2 ( List < SymbolDataV2 > symbolsData )
220217 {
221- var symbolDataList = symbolsData . ToList ( ) ;
222- bool symbolDuplicatesExist = symbolDataList . GroupBy ( x => x . Symbol ) . Any ( symbol => symbol . Count ( ) > 1 ) ;
218+ bool symbolDuplicatesExist = symbolsData . GroupBy ( x => x . Symbol ) . Any ( symbol => symbol . Count ( ) > 1 ) ;
223219 bool timeframeDuplicatesExist = false ;
224- foreach ( SymbolDataV2 symbol in symbolDataList )
220+ foreach ( SymbolDataV2 symbol in symbolsData )
225221 {
226222 // Validating
227223 if ( timeframeDuplicatesExist ) continue ;
@@ -242,8 +238,7 @@ private static bool IsThereSymbolTimeframeDuplicatesV2(List<SymbolDataV2> symbol
242238 /// <returns></returns>
243239 private static int GetCandlesticksIndexByOpenTimeV2 ( List < CandlestickV2 > candlesticks , DateTime targetDateTime )
244240 {
245- var candlesticksList = candlesticks . ToList ( ) ;
246- int index = candlesticksList . FindIndex ( candle => candle . OpenTime >= targetDateTime ) ;
241+ int index = candlesticks . FindIndex ( candle => candle . OpenTime >= targetDateTime ) ;
247242
248243 if ( index < 0 ) index = 0 ;
249244
@@ -263,10 +258,9 @@ private CandlestickInterval GetWarmupTimeframeV2(List<SymbolDataV2> symbolsData)
263258 return WarmupTimeframe . Value ;
264259
265260 // --- Setting the lowest symbolsData timeframe
266- var symbolDataList = symbolsData . ToList ( ) ;
267- CandlestickInterval potentialWarmupTimeframe = symbolDataList . Min ( x => x . Timeframes . Min ( y => y . Timeframe ) ) ;
261+ CandlestickInterval potentialWarmupTimeframe = symbolsData . Min ( x => x . Timeframes . Min ( y => y . Timeframe ) ) ;
268262
269- foreach ( SymbolDataV2 symbol in symbolDataList )
263+ foreach ( SymbolDataV2 symbol in symbolsData )
270264 {
271265 foreach ( TimeframeV2 timeframe in symbol . Timeframes )
272266 {
@@ -305,7 +299,6 @@ private static bool AreAllSymbolDataReachedHistoryEndV2(List<SymbolDataV2> symbo
305299 /// <returns></returns>
306300 private static int GetCandlesticksIndexByCloseTimeV2 ( List < CandlestickV2 > candlesticks , DateTime targetDateTime )
307301 {
308- var candlesticksList = candlesticks . ToList ( ) ;
309- return candlesticksList . FindIndex ( candle => candle . CloseTime >= targetDateTime ) ;
302+ return candlesticks . FindIndex ( candle => candle . CloseTime >= targetDateTime ) ;
310303 }
311304}
0 commit comments