/// <summary> /// Builds a container for Backtesting. /// </summary> /// <param name="config">The algorithm configuration to use.</param> /// <typeparam name="T">The algorithm type.</typeparam> /// <returns>ExchangeProviderContainer.</returns> public ExchangeProvidersContainer BuildBacktestingContainer <T>(AlgorithmConfiguration config) where T : IBaseAlgorithm { var backtestTimer = new BacktestTimerProvider(_loggerFactory, Configuration.Instance.BacktestSettings); var dataImplementation = new BacktestDataProvider(_loggerFactory, _databaseContext, backtestTimer); var tradingImplementation = new BacktestTradingProvider(_loggerFactory, backtestTimer, dataImplementation); var dataProvider = new DataProvider(_loggerFactory, dataImplementation, config); var tradingProvider = new TradingProvider(_loggerFactory, tradingImplementation, dataProvider, _allocationManager); // Doubly linked inheritance for backtesting edge case dataImplementation.ParentImplementation = dataProvider; tradingImplementation.ParentImplementation = tradingProvider; return(new ExchangeProvidersContainer(_loggerFactory, dataProvider, backtestTimer, tradingProvider, typeof(T))); }
/// <summary> /// Run timer provider until finished. /// </summary> /// <param name="backtestTimer">Active timer of the backtest.</param> /// <returns>Whether the backtest is finished.</returns> private ResponseObject WaitTillBacktestFinished(BacktestTimerProvider backtestTimer) { while (!backtestTimer.Finished) { Thread.Sleep(10); } (bool hasErrored, var error) = backtestTimer.ErrorRegister; if (hasErrored) { backtestTimer.LogOutput(); _logger.LogError(error, "Exception during backtesting"); return(new ResponseObject(ResponseCode.Error, error.ToString())); } return(new ResponseObject(ResponseCode.Success)); }