money.rave.common.backend.entity.order.Order.kt Maven / Gradle / Ivy
package money.rave.common.backend.entity.order
import money.rave.common.backend.entity.rule.Rule
import money.rave.common.backend.entity.ticker.Ticker
import money.rave.common.backend.enumeration.OrderState
import money.rave.common.backend.enumeration.OrderType
import java.math.BigDecimal
import java.time.ZonedDateTime
import javax.persistence.*
typealias OrderId = Long
@Entity
@Table(name = "order")
class Order(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: OrderId,
@Column(name = "type", nullable = false)
@Enumerated(EnumType.STRING)
val type: OrderType,
@Column(name = "description", nullable = true, columnDefinition = "TEXT")
val description: String?,
@ManyToOne
@JoinColumns(
JoinColumn(
name = "ticker_id_from_market",
referencedColumnName = "id_from_market",
nullable = false,
insertable = false,
updatable = false,
),
JoinColumn(
name = "market",
referencedColumnName = "market",
nullable = false,
insertable = false,
updatable = false,
)
)
val ticker: Ticker,
@ManyToOne
@JoinColumn(name = "rule_id", referencedColumnName = "id", insertable = false, updatable = false, nullable = false)
val rule: Rule,
baseAssetVolume: BigDecimal?,
quoteAssetVolume: BigDecimal?,
price: BigDecimal?,
@OneToMany
val orderShares: List,
@OneToMany
val executions: List,
@Column(name = "state", nullable = false)
@Enumerated(EnumType.STRING)
val state: OrderState,
@Column(name = "created_at", nullable = false)
val createdAt: ZonedDateTime,
) {
private val _baseAssetVolume: BigDecimal? = baseAssetVolume
@get:Column(name = "base_asset_volume", nullable = true, precision = 40, scale = 8)
val baseAssetVolume: BigDecimal
get() = _baseAssetVolume ?: _quoteAssetVolume?.divide(_price) ?: throw Exception()
private val _quoteAssetVolume: BigDecimal? = quoteAssetVolume
@get:Column(name = "quote_asset_volume", nullable = true, precision = 40, scale = 8)
val quoteAssetVolume: BigDecimal
get() = _quoteAssetVolume ?: _baseAssetVolume?.multiply(_price) ?: throw Exception()
private val _price: BigDecimal? = price
@get:Column(name = "price", nullable = true, precision = 40, scale = 8)
val price: BigDecimal
get() = _price ?: _baseAssetVolume?.divide(_quoteAssetVolume) ?: throw Exception()
val executedQuoteAssetVolume: BigDecimal?
get() = if (executions.isEmpty()) {
null
} else {
executions.sumOf { it.quoteAssetVolume }
}
val executedBaseAssetVolume: BigDecimal?
get() = if (executions.isEmpty()) {
null
} else {
executions.sumOf { it.baseAssetVolume }
}
val executedAveragePrice: BigDecimal?
get() = executedBaseAssetVolume?.divide(executedQuoteAssetVolume)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy