Warning: session_start(): open(/var/lib/php/sessions/sess_bc09qur3or1b0030t1vg1kgd46, 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 RSI extends CandleBasedIndicator {
settable int smoothingPeriod = 14;
// For first phase
settable double upSum;
settable double downSum;
settable long steps;
// For second phase
settable SmoothedMovingAverage up;
settable SmoothedMovingAverage down;
settable SimpleMovingAverage postSmoother;
// RSI value, unsmoothed
settable double rsi = Double.NaN;
// RSI value, smoothed
settable double rsiSmoothed = Double.NaN;
// RSI values collected as ticker
gettable TickerSequence rsiHistory = new TickerSequence("RSI");
gettable TickerSequence rsiSmoothedHistory = new TickerSequence("RSI Smoothed");
Double value() { ret rsi(); }
// Do we have enough data for a proper value calculation?
bool complete() {
ret steps >= length();
}
{
length = 25;
onCandleAdded((IVF1) candle -> {
var x = candle.move();
var u = max(x, 0.0);
var d = neg(min(x, 0.0));
if (!complete()) {
upSum += u;
downSum += d;
} else {
if (up == null) {
up = new SmoothedMovingAverage(length());
down = new SmoothedMovingAverage(length());
up.add(upSum/steps);
down.add(downSum/steps);
} else {
up().add(u);
down().add(d);
}
var rs = div(up()!, down()!);
rsi(100-100/(1+rs));
long time = candle.endTime().toLong();
rsiHistory?.addIfPriceChanged(rsi, time);
if (postSmoother == null)
postSmoother = new SimpleMovingAverage(smoothingPeriod);
postSmoother.add(rsi);
rsiSmoothed(postSmoother!);
rsiHistory?.addIfPriceChanged(rsiSmoothed, time);
}
++steps;
});
}
TickerSequence asTicker(L candles) {
feed(candles);
ret rsiHistory;
}
}