Merge pull request #462 from zhouyongyou/fix/quantity-zero-min-notional

fix(trader+decision): prevent quantity=0 error with minimum notional validation
This commit is contained in:
Icyoung
2025-11-05 16:29:24 +08:00
committed by GitHub
2 changed files with 69 additions and 3 deletions

View File

@@ -279,6 +279,17 @@ func (t *FuturesTrader) OpenLong(symbol string, quantity float64, leverage int)
return nil, err
}
// ✅ 检查格式化后的数量是否为 0防止四舍五入导致的错误
quantityFloat, parseErr := strconv.ParseFloat(quantityStr, 64)
if parseErr != nil || quantityFloat <= 0 {
return nil, fmt.Errorf("开倉數量過小,格式化後為 0 (原始: %.8f → 格式化: %s)。建議增加開倉金額或選擇價格更低的幣種", quantity, quantityStr)
}
// ✅ 检查最小名义价值Binance 要求至少 10 USDT
if err := t.CheckMinNotional(symbol, quantityFloat); err != nil {
return nil, err
}
// 创建市价买入订单
order, err := t.client.NewCreateOrderService().
Symbol(symbol).
@@ -322,6 +333,17 @@ func (t *FuturesTrader) OpenShort(symbol string, quantity float64, leverage int)
return nil, err
}
// ✅ 检查格式化后的数量是否为 0防止四舍五入导致的错误
quantityFloat, parseErr := strconv.ParseFloat(quantityStr, 64)
if parseErr != nil || quantityFloat <= 0 {
return nil, fmt.Errorf("开倉數量過小,格式化後為 0 (原始: %.8f → 格式化: %s)。建議增加開倉金額或選擇價格更低的幣種", quantity, quantityStr)
}
// ✅ 检查最小名义价值Binance 要求至少 10 USDT
if err := t.CheckMinNotional(symbol, quantityFloat); err != nil {
return nil, err
}
// 创建市价卖出订单
order, err := t.client.NewCreateOrderService().
Symbol(symbol).
@@ -748,6 +770,32 @@ func (t *FuturesTrader) SetTakeProfit(symbol string, positionSide string, quanti
return nil
}
// GetMinNotional 获取最小名义价值Binance要求
func (t *FuturesTrader) GetMinNotional(symbol string) float64 {
// 使用保守的默认值 10 USDT确保订单能够通过交易所验证
return 10.0
}
// CheckMinNotional 检查订单是否满足最小名义价值要求
func (t *FuturesTrader) CheckMinNotional(symbol string, quantity float64) error {
price, err := t.GetMarketPrice(symbol)
if err != nil {
return fmt.Errorf("获取市价失败: %w", err)
}
notionalValue := quantity * price
minNotional := t.GetMinNotional(symbol)
if notionalValue < minNotional {
return fmt.Errorf(
"订单金额 %.2f USDT 低于最小要求 %.2f USDT (数量: %.4f, 价格: %.4f)",
notionalValue, minNotional, quantity, price,
)
}
return nil
}
// GetSymbolPrecision 获取交易对的数量精度
func (t *FuturesTrader) GetSymbolPrecision(symbol string) (int, error) {
exchangeInfo, err := t.client.NewExchangeInfoService().Do(context.Background())