Hello,
I am having troubles making the RateOfChange object work correctly in my classic algorithm. I have tried creating a 'new RateOfChange' object, as well as using ROC(...). Both seem to be return 0's at all times, so I'm not sure if I'm using them incorrectly? I am calling these functions in the OnData method, but it seems like the date of these RateOfChange objects is always showing 01-01-0001? I'll include a complete snippet of my algorithm here.
namespace QuantConnect.Algorithm.CSharp
{
/// <summary>
/// Basic template algorithm simply initializes the date range and cash. This is a skeleton
/// framework you can use for designing an algorithm.
/// </summary>
public class BasicTemplateAlgorithm : QCAlgorithm
{
private const int LOOKBACK = 252;
private const Resolution RESOLUTION = Resolution.Daily;
private Symbol[] _symbols;
/// <summary>
/// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
/// </summary>
public override void Initialize()
{
SetStartDate(2018, 1, 1); //Set Start Date
SetEndDate(2018, 8, 1); //Set End Date
SetCash(20000); //Set Strategy Cash
// The ordering of these symbols matter for portfolio construction.
// The last symbol should be the 'cash'/bonds fall back.
_symbols = new[] {
QuantConnect.Symbol.Create("AAPL", SecurityType.Equity, Market.USA),
QuantConnect.Symbol.Create("MSFT", SecurityType.Equity, Market.USA),
QuantConnect.Symbol.Create("MA", SecurityType.Equity, Market.USA)
};
foreach(var symbol in _symbols)
{
AddEquity(symbol, RESOLUTION);
}
}
/// <summary>
/// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
/// </summary>
/// <param name="data">Slice object keyed by symbol containing the stock data</param>
public override void OnData(Slice data)
{
var stockRoc = _symbols.Select(s => new RateOfChange(s, LOOKBACK)).ToArray();
Debug(stockRoc[0].Current.Value + "," + stockRoc[1].Current.Value + "," + stockRoc[2].Current.Value);
}
}
}
Gurumeher Sawhney
The reason as to why the RateOfChange indicators always return 0 is for two reasons. The first is because the indicators are created in OnData() during every iteration of the algorithm. The indicators should be constructed in Initialize and then saved.
Also, when using the constructor RateOfChange(), you need to update the indicator. Using the ROC helper method is ideal unless you want to use a time span not covered by the Resolution enum. The algorithm below shows the correct implementation.
Taylor Jensen
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!