Warning: session_start(): open(/var/lib/php/sessions/sess_9t7d60vvvtvl9ht965sp19vq5u, 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 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");
int candlesNeeded() { ret 2; }
{
onCandleAdded(candle -> {
atr.add(candle);
var atrValue = atr!;
if (isNaN(atrValue)) ret;
Candle prev = candles().nextToLast();
double hl2 = candle.hl2();
double basicUpperBand = hl2+multiplier*atrValue;
double basicLowerBand = hl2-multiplier*atrValue;
// TODO: These can't be right...
double finalUpperBand = previousBands == null
|| basicUpperBand < previousBands.end
&& prev.close() < previousBands.start
? basicLowerBand
: previousBands.start;
double finalLowerBand = previousBands == null
|| basicLowerBand > previousBands.start
&& prev.close() < previousBands.start
? basicLowerBand
: previousBands.start;
previousBands(bands);
bands(doubleRange(finalLowerBand, finalUpperBand));
supertrend(candle.close() <= finalUpperBand ? finalUpperBand : finalLowerBand);
upperBandHistory?.addIfPriceChanged(finalUpperBand, candle.endTime().toLong());
lowerBandHistory?.addIfPriceChanged(finalLowerBand, 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");
}
}