money.rave.common.backend.expression.indicator.UpperBolingerBand.kt Maven / Gradle / Ivy
package money.rave.common.backend.expression
import money.rave.common.backend.expression.EvaluationContext
import money.rave.common.backend.expression.Expression
import money.rave.common.backend.scaledBigDecimal
import java.math.BigDecimal
import java.math.MathContext
class UpperBolingerBand(
private val candleCount: Int = 20,
private val multiplyFactor: BigDecimal = 2.scaledBigDecimal(),
private val defaultCandleIndex: Int = 0,
) : Expression {
private val name = "${javaClass.simpleName}:$candleCount:$multiplyFactor"
override fun evaluate(context: EvaluationContext, candleIndex: Int): BigDecimal {
val index = defaultCandleIndex + candleIndex
if (!context.candleDatas[index].data.has(name)) {
val close = Close()
val ma = Ma(candleCount, close)
val closes = (0 until candleCount).map { close.evaluate(context, index + it).scaledBigDecimal() }
val avg = ma.evaluate(context, index)
val std = (closes.sumOf { (it - avg).pow(2) } / candleCount.scaledBigDecimal()).sqrt(MathContext(8)).scaledBigDecimal()
context.candleDatas[index].data.addProperty(name, avg + std * multiplyFactor)
}
return context.candleDatas[index].data.getAsJsonPrimitive(name).asBigDecimal.scaledBigDecimal()
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy