I'm sure I'm missing something simple here, but just can't figure out how to get indicator values for 2 symbols in a consolidated handler.  The Console.WriteLine method in the FiveMinuteHandler prints out the value of SPY's average for uvxyAverage, and the value of SPY's atr for the value of uvxyAtr.  Wny aren't the values of UVXY's indicators in those variables?

 

using System; using QuantConnect.Algorithm; using QuantConnect.Data; using QuantConnect.Data.Market; using QuantConnect.Indicators; namespace QuantConnect { /* * QuantConnect University: Full Basic Template: * * The underlying QCAlgorithm class is full of helper methods which enable you to use QuantConnect. * We have explained some of these here, but the full algorithm can be found at: * https://github.com/QuantConnect/QCAlgorithm/blob/master/QuantConnect.Algorithm/QCAlgorithm.cs */ public class BasicTemplateAlgorithm : QCAlgorithm { private AverageTrueRange spyAtr; private AverageTrueRange uvxyAtr; private SimpleMovingAverage uvxyAverage; //Initialize the data and resolution you require for your strategy: public override void Initialize() { //Start and End Date range for the backtest: SetStartDate(2016, 12, 1); SetEndDate(DateTime.Now.Date.AddDays(-1)); //Cash allocation SetCash(50000); //Add as many securities as you like. All the data will be passed into the event handler: AddSecurity(SecurityType.Equity, "SPY", Resolution.Minute); AddSecurity(SecurityType.Equity, "UVXY", Resolution.Minute); var fiveMinuteConsolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(5)); fiveMinuteConsolidator.DataConsolidated += FiveMinuteHandler; spyAtr = new AverageTrueRange(5, MovingAverageType.Simple); uvxyAtr = new AverageTrueRange(5, MovingAverageType.Simple); uvxyAverage = new SimpleMovingAverage(5); RegisterIndicator("SPY", spyAtr, fiveMinuteConsolidator); RegisterIndicator("UVXY", uvxyAtr, fiveMinuteConsolidator); RegisterIndicator("UVXY", uvxyAverage, fiveMinuteConsolidator); SubscriptionManager.AddConsolidator("SPY", fiveMinuteConsolidator); SubscriptionManager.AddConsolidator("UVXY", fiveMinuteConsolidator); } private void FiveMinuteHandler(object sender, TradeBar consolidatedBar) { if( spyAtr.IsReady && uvxyAtr.IsReady && uvxyAverage.IsReady) { Console.WriteLine( "Time: " + consolidatedBar.EndTime + " Price: " + Securities["UVXY"].Price + " average: " + uvxyAverage + " SPY: " + Securities["SPY"].Price + " SPY ATR: " + spyAtr + " uvxyATR: " + uvxyAtr); var holdings = Portfolio["UVXY"].Quantity; Plot("UVXY", uvxyAverage); } else { Console.WriteLine("Warming up"); } } //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol. public void OnData(TradeBars data) { // "TradeBars" object holds many "TradeBar" objects: it is a dictionary indexed by the symbol: // // e.g. data["MSFT"] data["GOOG"] if (!Portfolio.HoldStock) { // int quantity = (int)Math.Floor(Portfolio.Cash / data["SPY"].Close); //Order function places trades: enter the string symbol and the quantity you want: // Order("SPY", quantity); //Debug sends messages to the user console: "Time" is the algorithm time keeper object //Debug("Purchased SPY on " + Time.ToShortDateString()); //You can also use log to send longer messages to a file. You are capped to 10kb //Log("This is a longer message send to log."); } } } }

 

Author