package trade import ( "errors" "log" "math" "git.apinb.com/bsm-sdk/core/utils" "git.apinb.com/quant/strategy/internal/core/market" ) // 计算下单数量 // 计算逻辑 // 保证金 = 可用余额 × 杠杆倍数 = 6U × 2 = 12U // 下单数量 = 可用保证金 / 价格 func QtyBal(price, margin float64, leverage int, cfg *market.PairSetting) string { qty := QtyBalByFloat(price, margin, leverage, cfg) return utils.Float64ToString(qty) } func QtyBalByFloat(price, margin float64, leverage int, cfg *market.PairSetting) float64 { // 计算可用保证金 availableMargin := margin * float64(leverage) // 计算下单数量 (减去手续费考虑) // Binance 现货杠杆交易手续费通常是 0.1% 或更低 quantity := availableMargin / price // 考虑手续费 if quantity < cfg.MinTradeNum { quantity = cfg.MinTradeNum } // 确保下单数量的价值未超过最小名义价值 if quantity*price < cfg.MinNotional { quantity = quantity * 2 } return utils.FloatRound(quantity, cfg.QuantityPrecision) } // 计算下单数量 V2 // 计算逻辑 // 保证金 = 可用余额 × 10% = 10U × 0.1 = 1U // 下单数量 = 保证金 / 价格 func QtyPer(margin, price, per float64, leverage int, cfg *market.PairSetting) (string, error) { // 计算可用保证金 availableMargin := margin * float64(leverage) * per // 计算下单数量 (减去手续费考虑) // Binance 现货杠杆交易手续费通常是 0.1% 或更低 quantity := availableMargin / price // 考虑手续费 if quantity < cfg.MinTradeNum { quantity = cfg.MinTradeNum } // 确保下单数量的价值超过20 if quantity*price < cfg.MinNotional { quantity = quantity + cfg.MinTradeNum } qty := FmtNumber(quantity, cfg.QuantityPrecision) if qty == "0" { return "0", errors.New("qty is zero") } log.Println("QtyPer:", "margin", "price", "per", "leverage", "MinTradeNum", "MinNotional", "qty") log.Println("QtyPer:", margin, price, per, leverage, cfg.MinTradeNum, cfg.MinNotional, qty) return qty, nil } func QtyMin(price float64, leverage int, cfg *market.PairSetting) string { // 计算下单数量 (减去手续费考虑) // Binance 现货杠杆交易手续费通常是 0.1% 或更低 quantity := cfg.MinNotional / price if quantity < cfg.MinTradeNum { quantity = cfg.MinTradeNum } quantity = quantity + cfg.MinTradeNum // 多加一个最小交易数量,确保够下单 qty := FmtNumber(quantity, cfg.QuantityPrecision) return qty } func CalcMinQty_Binance(lotSize, minNotional, price float64) float64 { minQtyByLot := lotSize minQtyByNotional := minNotional / price return math.Max(minQtyByLot, minQtyByNotional) }