Error: Heikin Ashi is a forward only indicator.

Using Heikin Ashi candles is crucial to the success of my strategy, but I keep running into this error:

Runtime Error: This is a forward only indicator: HA(EURUSD_min)

Is it simply not possible to use the HA indicator for backtesting? If so, then how could I create custom QuoteBars and feed them to my other indicators?

Here is my Initialize declaration:

def Initialize(self):
# Set the cash we'd like to use for our backtest
# This is ignored in live trading
self.Debug("Cash set to $1000")

#Risk management
risk = 0.05 #%
self.Debug("Risking {} per trade!".format(risk*100))

# Start and end dates for the backtest.
# These are ignored in live trading.

# Set Brokerage model to load OANDA fee structure.
self.SetBrokerageModel(BrokerageName.OandaBrokerage, AccountType.Margin)

# Add assets you'd like to see
self.AddForex(PAIR, Resolution.Minute, Market.Oanda)
self.Debug("Pair set to: {}".format(PAIR))

#Consolidate minute data into X minute blocks
M15 = QuoteBarConsolidator(15)
M15.DataConsolidated += self.OnDataConsolidated
interval = M15
self.Debug("Time interval set to M15")

#Force the manager (listener) to push new data to the stack when a new
#30 min bar exists
self.SubscriptionManager.AddConsolidator(PAIR, interval)

#Declare all the indicators we will be using:
*Heiken Ashi - convert standard candles to Heiken Ashi to improve
*MACD(5,15,1) - Small MACD, or SIGNAL. Techncally not a MACD:
(slowEMA - fastEMA)
*MACD(12,26,1) - Big MACD, or MAIN. This isn't a MACD either. See /\
*SMA(50) - Simple Moving Average (no smoothing)
*EMA(8) - Exponential Moving Average
*ADX(10) - Average Directional Index; provides 3 lines in one:
*RSI(10) - Relative STRENGTH Index; The "big knob" aka.
the indicator that is the most important
self._HA = self.HeikinAshi(PAIR, Resolution.Minute)
self.RegisterIndicator(PAIR, self._HA, M15)
self._MAIN = IndicatorExtensions.Of(self.MACD(PAIR, 12, 26, 1, \
resolution = interval), self._HA)
self._SIGNAL = IndicatorExtensions.Of(self.MACD(PAIR, 5, 15, 1, \
resolution = interval), self._HA)
self._SMA = IndicatorExtensions.SMA(self._HA, 50)
self._EMA = IndicatorExtensions.EMA(self._HA, 8)
self._ADX = self.ADX(PAIR, 10, resolution = interval)
self._RSI = IndicatorExtensions.Of(self.RSI(PAIR, 10, \
resolution = interval), self._HA)

#Setup data storage for indicators that require comparing to
#previous values
self._SIGWindow = RollingWindow[Decimal](2)
self._ADXWindow = RollingWindow[Decimal](3)
self._DIWindow = RollingWindow[Decimal](2)
self._RSIWindow = RollingWindow[Decimal](2)
self._SMAWindow = RollingWindow[Decimal](2)
self._EMAWindow = RollingWindow[Decimal](2)
self._Close = RollingWindow[Decimal](20)
self._Low = RollingWindow[Decimal](20)
self._High = RollingWindow[Decimal](20)

#Make sure the indicators have plenty of data to start with
Update Backtest

Solved my problem. I had to change these two lines:

self._HA = self.HeikinAshi(PAIR, Resolution.Minute)
self.RegisterIndicator(PAIR, self._HA, M15)

To this: still not 100% how to feed consolidated data to an indicator, but this seems correct.

self._HA = self.HeikinAshi(PAIR, resolution = interval)

Update Backtest


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.


This discussion is closed