Files
coin/trade/calc_qty.go
2026-01-09 15:48:31 +08:00

96 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}