Warning: session_start(): open(/var/lib/php/sessions/sess_5dcsmcc1249apr5qdp998vrkef, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass BollingerBands extends CandleBasedIndicator {
replace Candle with TradingCandle.
// length parameter is in base class
// The magic average + standard deviation generator
new Welford welford;
// Probably wrong word. Defines how many times the standard deviation
// we use as the tunnel size (well, twice that, actually)
settable double deviation = 2;
// result
settable DoubleRange range;
// Bands collected as tickers
gettable TickerSequence upperBand = new TickerSequence("Upper Bollinger Band");
gettable TickerSequence lowerBand = new TickerSequence("Lower Bollinger Band");
gettable AverageAndStandardDeviation as;
{
onCandleRemoved(candle -> welford.remove(candle.endPrice()));
onCandleAdded(candle -> {
if (l(candles()) >= length) {
var bCandles = candles().asList();
//var prices = mapToDoubleArray(bCandles, ->.endPrice());
//as = averageAndStandardDeviation(prices);
welford.add(candle.endPrice());
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(upperBand, lowerBand);
}
DoubleRange value() { ret range(); }
}