Пример #1
0
 public void CancelOrder(string orderId, AccountInfo account)
 {
     if (State == SignalState.Backtesting)
     {
         SimulationBroker.CancelOrder(orderId, account);
     }
     else
     {
         Broker?.CancelOrder(orderId, account);
     }
 }
Пример #2
0
        public void PlaceOrder(OrderParams order, AccountInfo account, bool skipAnalyzer = false)
        {
            var processed = skipAnalyzer ? order : AnalyzePreTrade(order);

            if (processed == null || processed.Quantity == 0M)
            {
                return;
            }

            if (State == SignalState.Backtesting)
            {
                SimulationBroker.PlaceOrder(order, account);
            }
            else
            {
                Broker?.PlaceOrder(order, account);
            }
        }
Пример #3
0
 public List <Order> GetOrders(AccountInfo account) => State == SignalState.Backtesting
     ? SimulationBroker.GetOrders(account).ToList()
     : Broker?.GetOrders(account);
Пример #4
0
 public List <Position> GetPositions(AccountInfo account, string symbol) => State == SignalState.Backtesting
     ? SimulationBroker.GetPositions(account, symbol).ToList()
     : Broker?.GetPositions(account, symbol);
Пример #5
0
        /// <summary>
        /// Runs backtest for single instrument and a set of parameter values
        /// </summary>
        /// <param name="instruments">Instruments to be backtested</param>
        /// <param name="parameters">Set of parameter values to use for backtest</param>
        /// <returns>List of generated trades</returns>
        protected override List <TradeSignal> BacktestSlotItem(IEnumerable <Selection> instruments,
                                                               IEnumerable <object> parameters)
        {
            // Get data for all provided instruments
            var data = new Dictionary <Selection, List <Bar> >(instruments.Count());

            if (BacktestSettings == null)
            {
                BacktestSettings = new BacktestSettings();
            }

            if (BacktestSettings?.BarData != null && BacktestSettings.BarData.Any()) //provided with backtest settings
            {
                foreach (var item in instruments)
                {
                    var bars = BacktestSettings.BarData
                               .FirstOrDefault(b => b.Key.Symbol == item.Symbol &&
                                               b.Key.TimeFactor == item.TimeFactor &&
                                               b.Key.Timeframe == item.Timeframe).Value;
                    if (bars != null && bars.Count > 0)
                    {
                        data.Add(item, bars);
                    }
                }
            }
            else //need to request from data provider
            {
                foreach (var item in instruments)
                {
                    var btInstrument = (Selection)item.Clone();
                    if (BacktestSettings.BarsBack > 0)
                    {
                        btInstrument.BarCount = BacktestSettings.BarsBack;
                    }
                    if (BacktestSettings.StartDate.Year > 2000)
                    {
                        btInstrument.From = BacktestSettings.StartDate;
                    }
                    if (BacktestSettings.EndDate > BacktestSettings.StartDate)
                    {
                        btInstrument.To = BacktestSettings.EndDate;
                    }
                    var bars = DataProvider.GetBars(btInstrument);
                    if (bars != null && bars.Count > 0)
                    {
                        data.Add(btInstrument, bars);
                    }
                }
            }

            int batchSize = GetBacktestBatchSize(parameters);

            if (data.Count == 0 || batchSize < 1)
            {
                return(new List <TradeSignal>(0));
            }

            // Scan all data collections
            var result  = new List <TradeSignal>();
            var indices = data.ToDictionary(k => k.Key, v => 0);

            while (true)
            {
                // Get instrument with oldest/earliest data
                var time = DateTime.MaxValue;
                foreach (var item in data)
                {
                    var idx = indices[item.Key];
                    if (idx >= 0 && idx < item.Value.Count && item.Value[idx].Date < time)
                    {
                        time = item.Value[idx].Date;
                    }
                }

                if (time == DateTime.MaxValue)
                {
                    break;
                }

                var selectionsToUse = new List <Selection>();
                foreach (var item in data)
                {
                    var idx = indices[item.Key];
                    if (idx >= 0 && idx < item.Value.Count && item.Value[idx].Date == time)
                    {
                        selectionsToUse.Add(item.Key);
                    }
                }

                // Get necessary data frame to scan
                var dataFrames = new Dictionary <Selection, IEnumerable <Bar> >(selectionsToUse.Count);
                foreach (var item in data)
                {
                    if (selectionsToUse.Contains(item.Key))
                    {
                        dataFrames.Add(item.Key, item.Value.GetRange(indices[item.Key], batchSize));
                        indices[item.Key]++;
                    }
                }

                // Evaluate current batch
                if (dataFrames.Count > 0)
                {
                    var trades = Evaluate(dataFrames, parameters);

                    var barData       = dataFrames.Keys.FirstOrDefault();
                    var barToProccess = dataFrames.Values.FirstOrDefault()?.FirstOrDefault();
                    SimulationBroker.ProcessBar(barData?.Symbol, barToProccess);

                    foreach (var account in BrokerAccounts)
                    {
                        foreach (var orderInfo in GenerateOrderParams(trades))
                        {
                            PlaceOrder(orderInfo, account);
                        }
                    }

                    if (trades != null && trades.Count > 0)
                    {
                        result.AddRange(trades);
                    }
                }

                // Break if backtest has been aborted
                if (State != SignalState.Backtesting && State != SignalState.BacktestingPaused)
                {
                    break;
                }
            }

            return(result);
        }