hi,
I am trying to build a simple algo that uses indicators on Futures.
I keep getting this error at runtime:
During the algorithm initialization, the following exception has occurred: Please register to receive data for symbol ' ' using the AddSecurity() function.
Any idea what am I doing wrong here ?
namespace QuantConnect
{
/*
* QuantConnect University: Bollinger Bands Example:
*/
public class BollingerBandsAlgorithm : QCAlgorithm
{
string _symbol = "ZN";
BollingerBands _bb;
RelativeStrengthIndex _rsi;
AverageTrueRange _atr;
ExponentialMovingAverage _ema;
SimpleMovingAverage _sma;
MovingAverageConvergenceDivergence _macd;
decimal _price;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Initialize
SetStartDate(2018, 1, 1);
SetEndDate(2018, 2, 1);
SetCash(25000);
//Add as many securities as you like. All the data will be passed into the event handler:
AddSecurity(SecurityType.Future, _symbol, Resolution.Minute);
//Set up Indicators:
_bb = BB(_symbol, 20, 1, MovingAverageType.Simple, Resolution.Daily);
_rsi = RSI(_symbol, 14, MovingAverageType.Simple, Resolution.Daily);
_atr = ATR(_symbol, 14, MovingAverageType.Simple, Resolution.Daily);
_ema = EMA(_symbol, 14, Resolution.Daily);
_sma = SMA(_symbol, 14, Resolution.Daily);
_macd = MACD(_symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Daily);
}
public void OnData(TradeBars data)
{
if (!_bb.IsReady || !_rsi.IsReady) return;
_price = data["ZN"].Close;
if (!Portfolio.HoldStock)
{
int quantity = (int)Math.Floor(Portfolio.Cash / data[_symbol].Close);
//Order function places trades: enter the string symbol and the quantity you want:
Order(_symbol, quantity);
//Debug sends messages to the user console: "Time" is the algorithm time keeper object
Debug("Purchased ZN on " + Time.ToShortDateString());
}
}
// Fire plotting events once per day:
public override void OnEndOfDay() {
if (!_bb.IsReady) return;
Plot("BB", "Price", _price);
Plot("BB", _bb.UpperBand, _bb.MiddleBand, _bb.LowerBand);
Plot("RSI", _rsi);
Plot("ATR", _atr);
Plot("MACD", "Price", _price);
Plot("MACD", _macd.Fast, _macd.Slow);
Plot("Averages", _ema, _sma);
}
}
}
Jack Simonson
Hi Yuval,
"ZN" will subscribe to Futures data but dealing with Futures requires that you define a filter for contract expiration dates, and when Futures data gets passed into OnData it is passed Slice objects that contain Futures Chains, which in turn are made up of specific Futures Contracts -- this means that data['ZN'] won't return any sort of data object, and this is the cause of the error you are seeing. Additionally, indicators will need to be made for each specific contract rather than for "ZN". The best place to look to familiarize yourself with these would be to look here and here, and hopefully, this and other posts in the forum will provide helpful guidance.
Amulya Jitendra Agarwal
If I use the slices and get my indicators on every contract, then I am not getting any order mostly.
from QuantConnect.Data.Market import * class MovingAverageCrossAlgorithm(QCAlgorithm): '''In this example we look at the canonical 20/30 day moving average cross. This algorithm will go long when the 20 crosses above the 30 and will liquidate when the 20 crosses back below the 30.''' def __init__(self): # self.symbol = "SPY" self.previous = None self.fast = None self.slow = None self.stopMarketTicket = None self.spy = None def Initialize(self): '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.''' self.SetStartDate(2020, 1, 15) #Set Start Date self.SetEndDate(2020, 5, 15) #Set End Date self.SetCash(100000) #Set Strategy Cash # Find more symbols here: http://quantconnect.com/data self.spy = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Hour) self.spy.SetFilter(0, 90) # self.Securities[self.symbol].FeeModel = ConstantFeeModel(0) def OnData(self, slice): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: TradeBars IDictionary object with your stock data ''' # a couple things to notice in this method: # 1. We never need to 'update' our indicators with the data, the engine takes care of this for us # 2. We can use indicators directly in math expressions # 3. We can easily plot many indicators at the same time for chain in slice.FutureChains: self.popularContracts = [contract for contract in chain.Value if contract.OpenInterest > 1000] if len(self.popularContracts) == 0: continue sortedByOIContracts = sorted(self.popularContracts, key=lambda k : k.OpenInterest, reverse=True) self.liquidContract = sortedByOIContracts[0] # create a 20 day exponential moving average self.fast = self.EMA(self.liquidContract.Symbol, 20, Resolution.Hour) # create a 30 day exponential moving average self.slow = self.EMA(self.liquidContract.Symbol, 30, Resolution.Hour) # wait for our slow ema to fully initialize if not self.slow.IsReady: return holdings = self.Portfolio[self.liquidContract.Symbol].Quantity # we only want to go long if we're currently short or flat if holdings <= 0: # if the fast is greater than the slow, we'll go long if self.fast.Current.Value > self.slow.Current.Value: self.Log("BUY >> {0}".format(self.Securities[self.liquidContract.Symbol].Price)) self.stopMarketTicket = self.StopMarketOrder(self.liquidContract.Symbol, self.CalculateOrderQuantity(self.liquidContract.Symbol, 1.0), 0.995*self.Securities[self.liquidContract.Symbol].Price) # self.SetHoldings(self.symbol, 0.67) # we only want to liquidate if we're currently long # if the fast is less than the slow we'll liquidate our long if holdings > 0 and self.fast.Current.Value < self.slow.Current.Value: self.Log("SELL >> {0}".format(self.Securities[self.liquidContract.Symbol].Price)) self.Liquidate(self.liquidContract.Symbol) def OnOrderEvent(self, orderEvent): if orderEvent.Status != OrderStatus.Filled: return #2. Check if we hit our stop loss (Compare the orderEvent.Id with the stopMarketTicket.OrderId) # It's important to first check if the ticket isn't null (i.e. making sure it has been submitted) if self.stopMarketTicket is not None and self.stopMarketTicket.OrderId == orderEvent.OrderId: self.Log("Asset Price >> {0}".format(self.Portfolio[self.liquidContract.Symbol].Price))
Jack Simonson
Hey Amulya,
Can you elaborate on what you mean by not getting and orders mostly? There appear to be a lot of conditions for a contract to meet in order to place an order, so I'm not sure if you're experiencing a bug or simply that this strategy trades infrequently. Can you attach a backtest so we can help investigate further?
Yuval Roth
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!