|
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 | { |
@@ -193,6 +194,102 @@ public void SecurityServiceShouldNotThrowWhenAlgorithmIsNull() |
193 | 194 | }); |
194 | 195 | } |
195 | 196 |
|
| 197 | + [Test] |
| 198 | + public void RandomDataGeneratorGeneratesDataSuccessfully() |
| 199 | + { |
| 200 | + var tempFolder = Path.Combine(Path.GetTempPath(), $"LeanTest_{Guid.NewGuid()}"); |
| 201 | + var originalDataFolder = Config.Get("data-folder"); |
| 202 | + try |
| 203 | + { |
| 204 | + Directory.CreateDirectory(tempFolder); |
| 205 | + Config.Set("data-folder", tempFolder); |
| 206 | + Globals.Reset(); |
| 207 | + |
| 208 | + var hourPath = Path.Combine(tempFolder, "equity", "usa", "hour"); |
| 209 | + var dailyPath = Path.Combine(tempFolder, "equity", "usa", "daily"); |
| 210 | + var factorFilesPath = Path.Combine(tempFolder, "equity", "usa", "factor_files"); |
| 211 | + var mapFilesPath = Path.Combine(tempFolder, "equity", "usa", "map_files"); |
| 212 | + |
| 213 | + // Create the required folders |
| 214 | + Directory.CreateDirectory(hourPath); |
| 215 | + Directory.CreateDirectory(dailyPath); |
| 216 | + Directory.CreateDirectory(factorFilesPath); |
| 217 | + Directory.CreateDirectory(mapFilesPath); |
| 218 | + |
| 219 | + var settings = new RandomDataGeneratorSettings |
| 220 | + { |
| 221 | + Start = new DateTime(2024, 1, 1, 9, 30, 0), |
| 222 | + End = new DateTime(2024, 1, 2, 16, 0, 0), |
| 223 | + SymbolCount = 1, |
| 224 | + Market = "usa", |
| 225 | + SecurityType = SecurityType.Equity, |
| 226 | + Resolution = Resolution.Hour, |
| 227 | + DataDensity = DataDensity.Dense, |
| 228 | + IncludeCoarse = false, |
| 229 | + QuoteTradeRatio = 1.0, |
| 230 | + RandomSeed = 123456, |
| 231 | + HasDividendsPercentage = 0, |
| 232 | + HasSplitsPercentage = 0, |
| 233 | + HasIpoPercentage = 0, |
| 234 | + HasRenamePercentage = 0, |
| 235 | + Tickers = new List<string>() { "AAPL" } |
| 236 | + }; |
| 237 | + |
| 238 | + var generator = GetGenerator(settings); |
| 239 | + |
| 240 | + Assert.DoesNotThrow(() => generator.Run()); |
| 241 | + |
| 242 | + var allFiles = Directory.GetFiles(tempFolder, "*", SearchOption.AllDirectories); |
| 243 | + Assert.Greater(allFiles.Length, 0); |
| 244 | + |
| 245 | + var hourFiles = Directory.GetFiles(hourPath, "*.zip"); |
| 246 | + Assert.Greater(hourFiles.Length, 0); |
| 247 | + } |
| 248 | + finally |
| 249 | + { |
| 250 | + Config.Set("data-folder", originalDataFolder); |
| 251 | + Globals.Reset(); |
| 252 | + Directory.Delete(tempFolder, true); |
| 253 | + } |
| 254 | + } |
| 255 | + |
| 256 | + private static QuantConnect.ToolBox.RandomDataGenerator.RandomDataGenerator GetGenerator(RandomDataGeneratorSettings settings) |
| 257 | + { |
| 258 | + var securityManager = new SecurityManager(new TimeKeeper(settings.Start, new[] { TimeZones.Utc })); |
| 259 | + |
| 260 | + var securityService = new SecurityService( |
| 261 | + new CashBook(), |
| 262 | + MarketHoursDatabase.FromDataFolder(), |
| 263 | + SymbolPropertiesDatabase.FromDataFolder(), |
| 264 | + new SecurityInitializerProvider(new FuncSecurityInitializer(security => |
| 265 | + { |
| 266 | + // init price |
| 267 | + security.SetMarketPrice(new Tick(settings.Start, security.Symbol, 100, 100)); |
| 268 | + security.SetMarketPrice(new OpenInterest(settings.Start, security.Symbol, 10000)); |
| 269 | + |
| 270 | + // from settings |
| 271 | + security.VolatilityModel = new StandardDeviationOfReturnsVolatilityModel(settings.VolatilityModelResolution); |
| 272 | + |
| 273 | + // from settings |
| 274 | + if (security is Option option) |
| 275 | + { |
| 276 | + option.PriceModel = OptionPriceModels.Create(settings.OptionPriceEngineName, |
| 277 | + _interestRateProvider.GetRiskFreeRate(settings.Start, settings.End)); |
| 278 | + } |
| 279 | + })), |
| 280 | + RegisteredSecurityDataTypesProvider.Null, |
| 281 | + new SecurityCacheProvider( |
| 282 | + new SecurityPortfolioManager(securityManager, new SecurityTransactionManager(null, securityManager), new AlgorithmSettings())), |
| 283 | + new MapFilePrimaryExchangeProvider(Composer.Instance.GetExportedValueByTypeName<IMapFileProvider>(Config.Get("map-file-provider", "LocalDiskMapFileProvider"))) |
| 284 | + ); |
| 285 | + |
| 286 | + securityManager.SetSecurityService(securityService); |
| 287 | + |
| 288 | + var generator = new QuantConnect.ToolBox.RandomDataGenerator.RandomDataGenerator(); |
| 289 | + generator.Init(settings, securityManager); |
| 290 | + return generator; |
| 291 | + } |
| 292 | + |
196 | 293 | private static readonly IRiskFreeInterestRateModel _interestRateProvider = new InterestRateProvider(); |
197 | 294 |
|
198 | 295 | private static SecurityService GetSecurityService(RandomDataGeneratorSettings settings, SecurityManager securityManager) |
|
0 commit comments