public void CancelOrder(string orderId, AccountInfo account) { if (State == SignalState.Backtesting) { SimulationBroker.CancelOrder(orderId, account); } else { Broker?.CancelOrder(orderId, account); } }
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); } }
public List <Order> GetOrders(AccountInfo account) => State == SignalState.Backtesting ? SimulationBroker.GetOrders(account).ToList() : Broker?.GetOrders(account);
public List <Position> GetPositions(AccountInfo account, string symbol) => State == SignalState.Backtesting ? SimulationBroker.GetPositions(account, symbol).ToList() : Broker?.GetPositions(account, symbol);
/// <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); }