Advertisement
lituchy

Untitled

Jan 15th, 2020
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.68 KB | None | 0 0
  1. package com.emfxe.utils
  2.  
  3. import com.bmfn.extensions.scaleDown
  4. import com.bmfn.extensions.scaleUp
  5. import com.emfxe.model.position.ProfitAndInvested
  6. import java.math.BigDecimal
  7. import java.math.BigDecimal.*
  8. import java.math.MathContext
  9.  
  10. fun maxQTY(balance: BigDecimal, crossBid: BigDecimal?, nav: BigDecimal): BigDecimal {
  11.     return balance.divide((crossBid ?: ONE), MathContext.DECIMAL64).divide(nav, 0, ROUND_DOWN)
  12. }
  13.  
  14. fun minQTY(minAmount: BigDecimal, nav: BigDecimal): BigDecimal {
  15.     return if (minAmount <= ONE) ONE else minAmount.divide(nav, MathContext.DECIMAL64).scaleUp(0)
  16. }
  17.  
  18. fun minQTYAccountCurrency(cross: BigDecimal?, minAmount: BigDecimal): BigDecimal {
  19.     return minAmount.multiply(cross ?: ONE).scaleUp(0)
  20. }
  21.  
  22. fun neededAmount(minAmount: BigDecimal, balance: BigDecimal, cross: BigDecimal): BigDecimal {
  23.     return minQTYAccountCurrency(cross, minAmount) - balance.scaleDown(0)
  24. }
  25.  
  26. fun investmentValue(qty: BigDecimal, nav: BigDecimal, crossBid: BigDecimal? = ONE): BigDecimal {
  27.     return qty.multiply(nav).multiply(crossBid ?: ONE)
  28. }
  29.  
  30. fun qty(invest: BigDecimal, nav: BigDecimal, cross: BigDecimal?): BigDecimal {
  31.     return invest.divide(nav, MathContext.DECIMAL64).divide((cross ?: ONE), MathContext.DECIMAL64).scaleUp(0)
  32. }
  33.  
  34. fun positionValue(qty: BigDecimal, currentNav: BigDecimal): BigDecimal = qty.multiply(currentNav)
  35.  
  36. fun positionProfit(nav: BigDecimal, navOpen: BigDecimal, qty: BigDecimal, openCrossPrice: BigDecimal, currentCross: BigDecimal?): BigDecimal {
  37.     return currentValue(nav, currentCross, qty) - getInvested(navOpen, qty, openCrossPrice)
  38. }
  39.  
  40. fun priceChange(currentNav: BigDecimal, openPrice: BigDecimal) = (currentNav - openPrice) / openPrice * BigDecimal(100/* 100% */)// todo fix it!!
  41.  
  42. fun getInvested(openPrice: BigDecimal, volume: BigDecimal, positionCross: BigDecimal): BigDecimal {
  43.     return openPrice.multiply(volume).multiply(positionCross).scaleUp()
  44. }
  45.  
  46. fun currentValue(nav: BigDecimal, currentCross: BigDecimal?, volume: BigDecimal): BigDecimal {
  47.     return nav.multiply((currentCross ?: ONE)).multiply(volume).scaleUp()
  48. }
  49.  
  50. fun redeemCurrentValue(currentValue: BigDecimal, qty: BigDecimal, maxQTY: BigDecimal): BigDecimal {
  51.     return currentValue.multiply(qty).divide(maxQTY,  MathContext.DECIMAL64)
  52. }
  53.  
  54. fun totalCurrentValue(invested: BigDecimal?, profit: BigDecimal): BigDecimal = invested?.let { it + profit } ?: ZERO
  55.  
  56. val List<ProfitAndInvested>.toTotalProfitWithCurrentValue
  57.     get() = run {
  58.         var profit = ZERO
  59.         var currentValue = ZERO
  60.         forEach {
  61.             profit += it.profit
  62.             currentValue += totalCurrentValue(it.invested, it.profit)
  63.         }
  64.         Pair(profit, currentValue)
  65.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement