Skip to content

Commit 6203674

Browse files
committed
Refactored EngineTestsV2 for improved type safety and readability; updated exception handling in SymbolDataSplitterHeavyTests.
1 parent 96ef2a1 commit 6203674

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

High-Performance Backtest.Net.sln.DotSettings.user

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
22
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACancellationTokenSource_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fa24e12ad3c769dda2069974789f3b97e5250dcb2392b867444b835b79199ff5_003FCancellationTokenSource_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
3+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACollectionsMarshal_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FSourcesCache_003F333c45fb859b4b8879aa166857cffe8a8bbd12ec22c6bb7144c01c4fadbd44_003FCollectionsMarshal_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
4+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADateTime_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FSourcesCache_003Ff8fdff6920a6a186765c356799993ad6972eb8285ca31ea98d157ac4b3d16_003FDateTime_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
35
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExecutionTimer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F3b92f859131bde25d0f7a63de08963e995d1e1426e584dfd4b8e833d2d3dba_003FExecutionTimer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
46
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AICandlestick_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcd2c7eeb21604c27ad8a8d1fc983f9a68400_003Faa_003F64843a2b_003FICandlestick_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
57
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIndex_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F32518f7e8c2ba2c2d56edcbfa986c3d26b7f4765026ea92642a6b10efba5_003FIndex_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
68
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIStrategy_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcd2c7eeb21604c27ad8a8d1fc983f9a68400_003F53_003F13870988_003FIStrategy_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
79
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AISymbolData_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcd2c7eeb21604c27ad8a8d1fc983f9a68400_003F31_003F1ad87b58_003FISymbolData_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
810
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AITimeframe_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcd2c7eeb21604c27ad8a8d1fc983f9a68400_003F4b_003F331937f5_003FITimeframe_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
11+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FSourcesCache_003F1c3f7d5c03bf77051eb8a758fb3549c4e2d4cb3dc6f6d567a94a315044961e_003FList_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
912
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANullable_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F6728f66657329080f0f419df519283a455cdca7d2617a05b18553b02da52fa_003FNullable_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1013
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AReflectionAbstractionExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F3e1d99c4f685d121dd18d8f3adc986ebce7cffe5fbba6559145f724612af18c1_003FReflectionAbstractionExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1114
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARuntimeType_002ECoreCLR_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbaf2eef7c7bbea3742b74ee71fe7168c3a8c2269a1ce22d51333175656840_003FRuntimeType_002ECoreCLR_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
15+
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASpan_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FSourcesCache_003F98ecf4ebd1d9a35e95cb73d6be798c135d5783d7e5ace5ac3b778bf15fed1a_003FSpan_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1216
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F4743f513c7ddc8411223a46f0ca426ed929391acebcff993721dff2f0c6b34_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
1317
<s:String x:Key="/Default/CodeInspection/PencilsConfiguration/ActualSeverity/@EntryValue">INFO</s:String>
1418

tests/Backtest.Net.Tests/EngineTests/EngineTestsV2.cs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
using Backtest.Net.Engines;
1+
using Backtest.Net.Candlesticks;
2+
using Backtest.Net.Engines;
23
using Backtest.Net.Enums;
34
using Backtest.Net.Interfaces;
45
using Backtest.Net.SymbolDataSplitters;
56
using Backtest.Net.SymbolsData;
7+
using Backtest.Net.Timeframes;
68
using Backtest.Tests.EngineTests;
79

810
namespace Backtest.Net.Tests.EngineTests;
@@ -23,12 +25,12 @@ public class EngineTestsV2 : EngineTestsBase
2325
/// </summary>
2426
public EngineTestsV2()
2527
{
28+
WarmupCandlesCount = 2;
2629
EngineV2 = new EngineV8(WarmupCandlesCount, false)
2730
{
2831
OnTick = OnTickMethodV2
2932
};
3033

31-
WarmupCandlesCount = 2;
3234
Trade = new TestTrade();
3335
Strategy = new TestStrategyV2();
3436
}
@@ -122,19 +124,19 @@ public async Task TestWarmupCandlesResultCount()
122124
{
123125
var tokenSource = new CancellationTokenSource();
124126

125-
var allWarmupCandlesResultsAreCorrect = true;
127+
bool allWarmupCandlesResultsAreCorrect = true;
126128

127129
Strategy.ExecuteStrategyDelegateV2 = symbols =>
128130
{
129131
// --- Checking candles order
130132
var symbolsList = symbols.ToList();
131133
if (symbolsList.Count != 0)
132134
{
133-
foreach (var symbol in symbolsList)
135+
foreach (SymbolDataV2 symbol in symbolsList)
134136
{
135-
foreach (var timeframe in symbol.Timeframes)
137+
foreach (TimeframeV2 timeframe in symbol.Timeframes)
136138
{
137-
var candlesCount = timeframe.Candlesticks.Count();
139+
int candlesCount = timeframe.Candlesticks.Count;
138140

139141
allWarmupCandlesResultsAreCorrect = allWarmupCandlesResultsAreCorrect && candlesCount == WarmupCandlesCount + 1;
140142
}
@@ -145,7 +147,7 @@ public async Task TestWarmupCandlesResultCount()
145147
};
146148

147149
// --- Generate fake SymbolData splitter
148-
var data = GenerateSymbolDataList(new DateTime(2023, 1, 1), 500, 1, WarmupCandlesCount);
150+
List<List<SymbolDataV2>> data = GenerateSymbolDataList(new DateTime(2023, 1, 1), 500, 0, WarmupCandlesCount);
149151

150152
await EngineV2.RunAsync(data, tokenSource.Token);
151153

@@ -158,7 +160,7 @@ public async Task TestFirstCandleEqualToStartBacktestingDate()
158160
var tokenSource = new CancellationTokenSource();
159161

160162
var backtestingStartingDate = new DateTime(2023, 1, 1);
161-
var allStartingDatesAreCorrect = true;
163+
bool allStartingDatesAreCorrect = true;
162164

163165
Strategy.ExecuteStrategyDelegateV2 = symbols =>
164166
{
@@ -194,12 +196,12 @@ public async Task TestFirstCandleEqualToStartBacktestingDate()
194196
public virtual async Task TestIfAllIndexesReachedTheEndIndex()
195197
{
196198
// --- Generate fake SymbolData splitter
197-
var data = GenerateSymbolDataList(new DateTime(2023, 1, 1), 500, 0, WarmupCandlesCount);
199+
List<List<SymbolDataV2>> data = GenerateSymbolDataList(new DateTime(2023, 1, 1), 500, 0, WarmupCandlesCount);
198200

199201
// --- Checking that before the EngineRun all the data aren't reached the EndIndex
200202
var dataList = data.ToList();
201203

202-
var allNotReachedEndIndex = dataList.All(
204+
bool allNotReachedEndIndex = dataList.All(
203205
x => x.All(
204206
y => y.Timeframes.All(
205207
k => k.Index < k.EndIndex && k.Index == k.StartIndex + WarmupCandlesCount)));
@@ -234,7 +236,7 @@ public virtual async Task TestCurrentCandleOhlcAreEqual()
234236
{
235237
var tokenSource = new CancellationTokenSource();
236238

237-
var allCurrentCandleOhlcAreEqual = true;
239+
bool allCurrentCandleOhlcAreEqual = true;
238240

239241
Strategy.ExecuteStrategyDelegateV2 = symbols =>
240242
{
@@ -243,16 +245,16 @@ public virtual async Task TestCurrentCandleOhlcAreEqual()
243245

244246
if (symbolsList.Count == 0) Assert.Fail("There is no symbols exist in test data");
245247

246-
foreach (var symbol in symbolsList)
248+
foreach (SymbolDataV2 symbol in symbolsList)
247249
{
248-
var firstTimeframe = symbol.Timeframes.FirstOrDefault();
249-
var firstCandle = firstTimeframe?.Candlesticks.FirstOrDefault();
250+
TimeframeV2? firstTimeframe = symbol.Timeframes.FirstOrDefault();
251+
CandlestickV2? firstCandle = firstTimeframe?.Candlesticks.FirstOrDefault();
250252
if (firstCandle == null) continue;
251253

252-
var openPrice = firstCandle.Open;
253-
var openTime = firstCandle.OpenTime;
254+
decimal openPrice = firstCandle.Open;
255+
DateTime openTime = firstCandle.OpenTime;
254256

255-
var areOhlcEqual = symbol.Timeframes.All(
257+
bool areOhlcEqual = symbol.Timeframes.All(
256258
y => y.Candlesticks.First().Close == openPrice &&
257259
y.Candlesticks.First().High == openPrice &&
258260
y.Candlesticks.First().Low == openPrice &&
@@ -269,7 +271,7 @@ public virtual async Task TestCurrentCandleOhlcAreEqual()
269271
};
270272

271273
// --- Generate fake SymbolData splitter
272-
var data = GenerateSymbolDataList(new DateTime(2023, 1, 1), 500, 1, WarmupCandlesCount);
274+
List<List<SymbolDataV2>> data = GenerateSymbolDataList(new DateTime(2023, 1, 1), 500, 1, WarmupCandlesCount);
273275

274276
await EngineV2.RunAsync(data, tokenSource.Token);
275277

tests/Backtest.Net.Tests/SymbolDataSplitterTests/SymbolDataSplitterHeavyTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ public async Task TestDuplicatedSymbols()
111111
[CandlestickInterval.M5, CandlestickInterval.M15],
112112
new DateTime(2023, 1, 19), 672);
113113

114-
Exception exception = await Assert.ThrowsAsync<Exception>(async () => await SymbolDataSplitter.SplitAsyncV2(duplicatedSymbolsData));
114+
ArgumentException exception = await Assert.ThrowsAsync<ArgumentException>(async () =>
115+
await SymbolDataSplitter.SplitAsyncV2(duplicatedSymbolsData));
115116

116117
Assert.Equal("symbolsData contain duplicated symbols or timeframes", exception.Message);
117118
}
@@ -127,7 +128,7 @@ public async Task TestDuplicatedTimeframes()
127128
[CandlestickInterval.M5, CandlestickInterval.M5, CandlestickInterval.M15],
128129
new DateTime(2023, 1, 19), 672);
129130

130-
Exception exception = await Assert.ThrowsAsync<Exception>(async () =>
131+
ArgumentException exception = await Assert.ThrowsAsync<ArgumentException>(async () =>
131132
await SymbolDataSplitter.SplitAsyncV2(duplicatedSymbolsData));
132133

133134
Assert.Equal("symbolsData contain duplicated symbols or timeframes", exception.Message);

0 commit comments

Comments
 (0)