96 lines
2.6 KiB
Go
96 lines
2.6 KiB
Go
|
|
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)
|
|||
|
|
}
|