initial
This commit is contained in:
95
trade/calc_qty.go
Normal file
95
trade/calc_qty.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user