// A is the value type we get for each candle asclass CandleBasedIndicator { replace Candle with TradingCandle. // Number of candles we need to look back to settable int length = 20; event candleAdded(Candle candle); // get current indicator value abstract A value(); simplyCached CircularFifoBuffer candles() { ret new CircularFifoBuffer(length); } Candle lastCandle() { ret candles().last(); } void feed(TradingCandleMaker candleMaker) { if (candleMaker != null) for (candle : candleMaker.candles()) add(candle); } void add aka feed(TradingCandle candle) { if (candle.ongoing()) ret; if (lastCandle() != null && lessOrEq(candle.startTime, lastCandle().startTime)) ret; candles().removeToSize(length-1); candles().add(candle); candleAdded(candle); } }