Exemple #1
0
        /// <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());
            }
        }