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.");
}
}
}
}
Yuval sss
To my understanding, a consolidator works for a single symbol only.
Try creating a consolidator for each symbol, and registering your indicators on these.
Also, notice that the RegisterIndicator method also adds the consolidator to the subscription manager, so you could skip doing it your explicitly.
Alexandre Catarino
Consolidators work for multiple symbols. We need to create a consolidator to every symbol.
Please checkout the attached project.
In this algorithm, the event handler (FiveMinuteHandler) was only subcribed to one symbol, because we do not want duplicate Console.WriteLine output. If we want more information about the consolidated bars, we need to write some logics to save the last bars values (maybe a RollingWindow) to use it latter.
Roberto Terpilowski
That did the trick. Thanks a lot guys for your help.
Roberto Terpilowski
The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by QuantConnect. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. QuantConnect makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances. All investments involve risk, including loss of principal. You should consult with an investment professional before making any investment decisions.
To unlock posting to the community forums please complete at least 30% of Boot Camp.
You can continue your Boot Camp training progress from the terminal. We hope to see you in the community soon!