// 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); event candleDropped(Candle candle); // get current indicator value abstract A value aka get(); 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(Iterable candles) { fOr (candle : candles) add(candle); } void add aka feed(TradingCandle candle) { if (candle.ongoing()) ret; if (lastCandle() != null && lessOrEq(candle.startTime, lastCandle().startTime)) ret; while (candles().size() > max(length-1, 0)) candleDropped(candles().remove()); candles().add(candle); candleAdded(candle); } }