All Downloads are FREE. Search and download functionalities are using the official Maven repository.

money.rave.common.backend.expression.indicator.LowerBolingerBand.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 LowerBolingerBand(
    private val day: Int = 20,
    private val multiplyFactor: BigDecimal = 2.scaledBigDecimal(),
    private val defaultCandleIndex: Int = 0,
) : Expression {

    private val name = "${javaClass.simpleName}:$day:$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(day, close)
            val closes = (0 until day).map { close.evaluate(context, index + it).scaledBigDecimal() }
            val avg = ma.evaluate(context, index)
            val std = (closes.sumOf { (it - avg).pow(2) } / day.scaledBigDecimal()).sqrt(MathContext(8)).scaledBigDecimal()

            context.candleDatas[index].data.addProperty(name, ma.evaluate(context, index) - std * multiplyFactor)
        }
        return context.candleDatas[index].data.getAsJsonPrimitive(name).asBigDecimal.scaledBigDecimal()
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy