Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.emfxe.utils
- import com.bmfn.extensions.scaleDown
- import com.bmfn.extensions.scaleUp
- import com.emfxe.model.position.ProfitAndInvested
- import java.math.BigDecimal
- import java.math.BigDecimal.*
- import java.math.MathContext
- fun maxQTY(balance: BigDecimal, crossBid: BigDecimal?, nav: BigDecimal): BigDecimal {
- return balance.divide((crossBid ?: ONE), MathContext.DECIMAL64).divide(nav, 0, ROUND_DOWN)
- }
- fun minQTY(minAmount: BigDecimal, nav: BigDecimal): BigDecimal {
- return if (minAmount <= ONE) ONE else minAmount.divide(nav, MathContext.DECIMAL64).scaleUp(0)
- }
- fun minQTYAccountCurrency(cross: BigDecimal?, minAmount: BigDecimal): BigDecimal {
- return minAmount.multiply(cross ?: ONE).scaleUp(0)
- }
- fun neededAmount(minAmount: BigDecimal, balance: BigDecimal, cross: BigDecimal): BigDecimal {
- return minQTYAccountCurrency(cross, minAmount) - balance.scaleDown(0)
- }
- fun investmentValue(qty: BigDecimal, nav: BigDecimal, crossBid: BigDecimal? = ONE): BigDecimal {
- return qty.multiply(nav).multiply(crossBid ?: ONE)
- }
- fun qty(invest: BigDecimal, nav: BigDecimal, cross: BigDecimal?): BigDecimal {
- return invest.divide(nav, MathContext.DECIMAL64).divide((cross ?: ONE), MathContext.DECIMAL64).scaleUp(0)
- }
- fun positionValue(qty: BigDecimal, currentNav: BigDecimal): BigDecimal = qty.multiply(currentNav)
- fun positionProfit(nav: BigDecimal, navOpen: BigDecimal, qty: BigDecimal, openCrossPrice: BigDecimal, currentCross: BigDecimal?): BigDecimal {
- return currentValue(nav, currentCross, qty) - getInvested(navOpen, qty, openCrossPrice)
- }
- fun priceChange(currentNav: BigDecimal, openPrice: BigDecimal) = (currentNav - openPrice) / openPrice * BigDecimal(100/* 100% */)// todo fix it!!
- fun getInvested(openPrice: BigDecimal, volume: BigDecimal, positionCross: BigDecimal): BigDecimal {
- return openPrice.multiply(volume).multiply(positionCross).scaleUp()
- }
- fun currentValue(nav: BigDecimal, currentCross: BigDecimal?, volume: BigDecimal): BigDecimal {
- return nav.multiply((currentCross ?: ONE)).multiply(volume).scaleUp()
- }
- fun redeemCurrentValue(currentValue: BigDecimal, qty: BigDecimal, maxQTY: BigDecimal): BigDecimal {
- return currentValue.multiply(qty).divide(maxQTY, MathContext.DECIMAL64)
- }
- fun totalCurrentValue(invested: BigDecimal?, profit: BigDecimal): BigDecimal = invested?.let { it + profit } ?: ZERO
- val List<ProfitAndInvested>.toTotalProfitWithCurrentValue
- get() = run {
- var profit = ZERO
- var currentValue = ZERO
- forEach {
- profit += it.profit
- currentValue += totalCurrentValue(it.invested, it.profit)
- }
- Pair(profit, currentValue)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement