Warning: session_start(): open(/var/lib/php/sessions/sess_gjk9a4345377715r3qc2evsh7c, 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
persistable sclass ADX extends CandleBasedIndicator {
// ATX is required to calculate ADX
new ATX atx;
// Smoothed moving averages
settable SmoothedMovingAverage smaPlusDM;
settable SmoothedMovingAverage smaMinusDM;
settable SmoothedMovingAverage smaAbsoluteDI;
settable double upMove = Double.NaN;
settable double downMove = Double.NaN;
settable double plusDM = Double.NaN;
settable double minusDM = Double.NaN;
settable double plusDI = Double.NaN;
settable double minusDI = Double.NaN;
// ADX value
settable double adx = Double.NaN;
// ATR values collected as ticker
gettable TickerSequence history = new TickerSequence("ADX");
Double value() { ret atr(); }
*(int *length) {}
{
length = 14;
onCandleAdded((IVF1) candle -> {
atr.add(candle);
if (candles().size() < 2) ret;
var today = candle;
var yesterday = candles().nextToLast();
upMove(today.high()-yesterday.high());
downMove(yesterday.low()-today.low());
plusDM(upMove > downMove && upMove > 0 ? upMove : 0);
minusDM(downMove > upMove && downMove > 0 ? downMove : 0);
if (smaPlusDM == null) smaPlusDM(new SmoothedMovingAverage(length()));
if (smaMinusDM == null) smaMinusDM(new SmoothedMovingAverage(length()));
smaPlusDM.add(plusDM);
smaMinusDM.add(minusDM);
plusDI(100*smaPlusDM!/atr!);
minusDI(100*smaMinusDM!/atr!);
if (smaAbsoluteDI == null) smaAbsoluteDI(new SmoothedMovingAverage(length()));
smaAbsoluteDI.add(absDiff(plusDI, minusDI));
adx(100*smaAbsoluteDI!/(plusDI+minusDI));
long time = candle.endTime().toLong();
history?.addIfPriceChanged(adx, time);
});
}
TickerSequence asTicker(L candles) {
feed(candles);
ret history;
}
void reset :: after {
resetFields(this, "adx history smaPlusDM smaMinusDM smaAbsoluteDI upMove downMove plusDM minusDM plusDI minusDI");
}
}