/// <summary> /// Start code execution or backtest /// </summary> /// <param name="historicalData">Available historical data</param> /// <param name="selectedData">Historical data to use</param> /// <param name="accounts">Available accounts</param> /// <param name="portfolios">Available portfolios</param> /// <param name="state">Signal state to use for signal (Running or Backtesting)</param> public void Start(List <HistoricalData> historicalData, List <HistoricalData> selectedData, List <AccountInfo> accounts, SignalState state) { if (!selectedData.Any()) { RaiseOutput("Failed to start: selected data collection is empty"); return; } _prevExecution = DateTime.MinValue; _selectedData.AddRange(selectedData); _dataProvider = new DataProvider(historicalData); ((DataProvider)_dataProvider).NewBarAppended += OnNewBarAppended; try { var msc = DateTime.UtcNow; var success = Code.SetParameters(CodeParameters.Select(ToExternalCodeParameters).ToList()); if (!success) { RaiseOutput("Failed to set user code parameters"); return; } if (Code is IndicatorBase) { var indicator = Code as IndicatorBase; success = indicator.Init(ToCodeSelection(_selectedData[0]), _dataProvider); if (success) { var seconds = (DateTime.UtcNow - msc); var maxRecords = 0; if (indicator.Series.Count > 0) { indicator.Series.Select(series => series.Length).Max(); } RaiseOutput( $" *** Initialization: {indicator.Series.Count} series, {maxRecords} records, time: {seconds.TotalMilliseconds:0} ms{Environment.NewLine}"); } } else if (Code is SignalBase) { var signal = Code as SignalBase; _backtestProgress = -1; _broker = new SimulationBroker(accounts.Select(a => new SimulationAccount { Balance = a.Balance, Currency = a.Currency, ID = a.ID, Password = a.Password, UserName = a.UserName })); success = signal.Init(_broker, _dataProvider, _selectedData.Select(ToCodeSelection).ToList(), state, new StrategyParams(-1)); if (success) { var span = (DateTime.UtcNow - msc); RaiseOutput($" *** Initialization time: {span.TotalMilliseconds:0} ms{Environment.NewLine}"); _tmrBacktestStatusCheck.Start(); if (state == SignalState.Running) { _tmrPeriodicExecution.Start(); } else if (state == SignalState.Backtesting) { _backtestProgress = 0F; RaiseOutput(DateTime.Now + " > Starting backtest for " + signal.Name); signal.StartBacktest(new CommonObjects.BacktestSettings()); } } } if (!success) { RaiseOutput("Failed to initialize user code instance"); } } catch (Exception ex) { RaiseOutput(ex.ToString()); } }