This commit is contained in:
2026-01-09 15:48:31 +08:00
parent e32eabbf95
commit c8e189e9c7
28 changed files with 2795 additions and 0 deletions

95
trade/calc_qty.go Normal file
View File

@@ -0,0 +1,95 @@
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)
}