package entity import ( "fmt" "time" "github.com/genex/trading-service/internal/domain/vo" ) const ( // TakerFeeRate is the fee rate charged to the taker (0.5%). TakerFeeRate = 0.005 // MakerFeeRate is the fee rate charged to the maker (0.1%). MakerFeeRate = 0.001 ) // Trade represents an executed trade between a buyer and seller. type Trade struct { ID string `json:"id"` CouponID string `json:"couponId"` BuyOrderID string `json:"buyOrderId"` SellOrderID string `json:"sellOrderId"` BuyerID string `json:"buyerId"` SellerID string `json:"sellerId"` Price vo.Price `json:"price"` Quantity int `json:"quantity"` BuyerFee float64 `json:"buyerFee"` SellerFee float64 `json:"sellerFee"` CreatedAt time.Time `json:"createdAt"` } // NewTrade creates a new Trade from matched orders. func NewTrade(id string, buyOrder, sellOrder *Order, price vo.Price, matchQty int) (*Trade, error) { if id == "" { return nil, fmt.Errorf("trade ID cannot be empty") } if matchQty <= 0 { return nil, fmt.Errorf("trade quantity must be positive") } notional := price.Multiply(matchQty) takerFee := notional * TakerFeeRate makerFee := notional * MakerFeeRate return &Trade{ ID: id, CouponID: buyOrder.CouponID, BuyOrderID: buyOrder.ID, SellOrderID: sellOrder.ID, BuyerID: buyOrder.UserID, SellerID: sellOrder.UserID, Price: price, Quantity: matchQty, BuyerFee: takerFee, SellerFee: makerFee, CreatedAt: time.Now(), }, nil } // Notional returns the total value of the trade (price * quantity). func (t *Trade) Notional() float64 { return t.Price.Multiply(t.Quantity) } // TotalFees returns the sum of buyer and seller fees. func (t *Trade) TotalFees() float64 { return t.BuyerFee + t.SellerFee }