sclass Supertrend extends CandleBasedIndicator { replace Candle with TradingCandle. // length parameter is in base class // We need ATR for the calculation new ATR atr; settable double multiplier = 3; settable DoubleRange previousBands; settable DoubleRange bands; // The final value settable double supertrend = Double.NaN; // Final bands collected as tickers gettable TickerSequence upperBandHistory = new TickerSequence("Final upper band"); gettable TickerSequence lowerBandHistory = new TickerSequence("Final lower band"); gettable TickerSequence supertrendHistory = new TickerSequence("Supertrend"); { onCandleAdded(candle -> { atr.add(candle); if (l(candles()) >= length) { var bCandles = candles().asList(); //var prices = mapToDoubleArray(bCandles, ->.endPrice()); //as = averageAndStandardDeviation(prices); as = welford!; range(bollingerRange(as, deviation)); upperBand?.addIfPriceChanged(range.end(), candle.endTime().toLong()); lowerBand?.addIfPriceChanged(range.start(), candle.endTime().toLong()); change(); } }); } L bandsAsTickers(L candles) { feed(candles); ret ll(upperBandHistory, lowerBandHistory); } DoubleRange value() { ret supertrend(); } void reset :: after { resetFields(this, "previousBands bands upperBandHistory lowerBandHistory supertrendHistory supertrend atr"); } }