|
29 | 29 | using static QuantConnect.ToolBox.RandomDataGenerator.RandomDataGenerator; |
30 | 30 | using QuantConnect.Algorithm; |
31 | 31 | using System.Linq; |
| 32 | +using System.IO; |
32 | 33 |
|
33 | 34 | namespace QuantConnect.Tests.ToolBox.RandomDataGenerator |
34 | 35 | { |
@@ -162,6 +163,102 @@ public void GetProgressAsPercentageShouldLogWhenProgressExceedsThreshold(Resolut |
162 | 163 | Assert.IsTrue(logs.All(p => p >= 0 && p <= 100)); |
163 | 164 | } |
164 | 165 |
|
| 166 | + [Test] |
| 167 | + public void RandomDataGeneratorCompletesSuccessfully() |
| 168 | + { |
| 169 | + var tempFolder = Path.Combine(Path.GetTempPath(), $"LeanTest_{Guid.NewGuid()}"); |
| 170 | + var originalDataFolder = Config.Get("data-folder"); |
| 171 | + try |
| 172 | + { |
| 173 | + Directory.CreateDirectory(tempFolder); |
| 174 | + Config.Set("data-folder", tempFolder); |
| 175 | + Globals.Reset(); |
| 176 | + |
| 177 | + var hourPath = Path.Combine(tempFolder, "equity", "usa", "hour"); |
| 178 | + var dailyPath = Path.Combine(tempFolder, "equity", "usa", "daily"); |
| 179 | + var factorFilesPath = Path.Combine(tempFolder, "equity", "usa", "factor_files"); |
| 180 | + var mapFilesPath = Path.Combine(tempFolder, "equity", "usa", "map_files"); |
| 181 | + |
| 182 | + // Create the required folders |
| 183 | + Directory.CreateDirectory(hourPath); |
| 184 | + Directory.CreateDirectory(dailyPath); |
| 185 | + Directory.CreateDirectory(factorFilesPath); |
| 186 | + Directory.CreateDirectory(mapFilesPath); |
| 187 | + |
| 188 | + var settings = new RandomDataGeneratorSettings |
| 189 | + { |
| 190 | + Start = new DateTime(2024, 1, 1, 9, 30, 0), |
| 191 | + End = new DateTime(2024, 1, 2, 16, 0, 0), |
| 192 | + SymbolCount = 1, |
| 193 | + Market = "usa", |
| 194 | + SecurityType = SecurityType.Equity, |
| 195 | + Resolution = Resolution.Hour, |
| 196 | + DataDensity = DataDensity.Dense, |
| 197 | + IncludeCoarse = false, |
| 198 | + QuoteTradeRatio = 1.0, |
| 199 | + RandomSeed = 123456, |
| 200 | + HasDividendsPercentage = 0, |
| 201 | + HasSplitsPercentage = 0, |
| 202 | + HasIpoPercentage = 0, |
| 203 | + HasRenamePercentage = 0, |
| 204 | + Tickers = new List<string>() { "AAPL" } |
| 205 | + }; |
| 206 | + |
| 207 | + var generator = GetGenerator(settings); |
| 208 | + |
| 209 | + Assert.DoesNotThrow(() => generator.Run()); |
| 210 | + |
| 211 | + var allFiles = Directory.GetFiles(tempFolder, "*", SearchOption.AllDirectories); |
| 212 | + Assert.Greater(allFiles.Length, 0); |
| 213 | + |
| 214 | + var hourFiles = Directory.GetFiles(hourPath, "*.zip"); |
| 215 | + Assert.Greater(hourFiles.Length, 0); |
| 216 | + } |
| 217 | + finally |
| 218 | + { |
| 219 | + Config.Set("data-folder", originalDataFolder); |
| 220 | + Globals.Reset(); |
| 221 | + Directory.Delete(tempFolder, true); |
| 222 | + } |
| 223 | + } |
| 224 | + |
| 225 | + private static QuantConnect.ToolBox.RandomDataGenerator.RandomDataGenerator GetGenerator(RandomDataGeneratorSettings settings) |
| 226 | + { |
| 227 | + var securityManager = new SecurityManager(new TimeKeeper(settings.Start, new[] { TimeZones.Utc })); |
| 228 | + |
| 229 | + var securityService = new SecurityService( |
| 230 | + new CashBook(), |
| 231 | + MarketHoursDatabase.FromDataFolder(), |
| 232 | + SymbolPropertiesDatabase.FromDataFolder(), |
| 233 | + new SecurityInitializerProvider(new FuncSecurityInitializer(security => |
| 234 | + { |
| 235 | + // init price |
| 236 | + security.SetMarketPrice(new Tick(settings.Start, security.Symbol, 100, 100)); |
| 237 | + security.SetMarketPrice(new OpenInterest(settings.Start, security.Symbol, 10000)); |
| 238 | + |
| 239 | + // from settings |
| 240 | + security.VolatilityModel = new StandardDeviationOfReturnsVolatilityModel(settings.VolatilityModelResolution); |
| 241 | + |
| 242 | + // from settings |
| 243 | + if (security is Option option) |
| 244 | + { |
| 245 | + option.PriceModel = OptionPriceModels.Create(settings.OptionPriceEngineName, |
| 246 | + _interestRateProvider.GetRiskFreeRate(settings.Start, settings.End)); |
| 247 | + } |
| 248 | + })), |
| 249 | + RegisteredSecurityDataTypesProvider.Null, |
| 250 | + new SecurityCacheProvider( |
| 251 | + new SecurityPortfolioManager(securityManager, new SecurityTransactionManager(null, securityManager), new AlgorithmSettings())), |
| 252 | + new MapFilePrimaryExchangeProvider(Composer.Instance.GetExportedValueByTypeName<IMapFileProvider>(Config.Get("map-file-provider", "LocalDiskMapFileProvider"))) |
| 253 | + ); |
| 254 | + |
| 255 | + securityManager.SetSecurityService(securityService); |
| 256 | + |
| 257 | + var generator = new QuantConnect.ToolBox.RandomDataGenerator.RandomDataGenerator(); |
| 258 | + generator.Init(settings, securityManager); |
| 259 | + return generator; |
| 260 | + } |
| 261 | + |
165 | 262 | private static readonly IRiskFreeInterestRateModel _interestRateProvider = new InterestRateProvider(); |
166 | 263 |
|
167 | 264 | private static SecurityService GetSecurityService(RandomDataGeneratorSettings settings, SecurityManager securityManager) |
|
0 commit comments