From fd777e6fe044df497fb21c924a85295a80a5d374 Mon Sep 17 00:00:00 2001 From: jackyu66git Date: Tue, 5 May 2026 00:46:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Bitget=20=E5=B9=B3=E4=BB=93=E5=BF=85?= =?UTF-8?q?=E9=A1=BB=E4=BC=A0=20holdSide=20=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PlaceMarketOrder 新增 holdSide 参数 - 平仓时(closeLeg)根据 leg.Side 传 holdSide="long"/"short" - 开仓传空字符串,不受影响 - 修复 BG 持续 'No position to close' (22002) 问题 --- exchange/bitget_trade.go | 6 +++++- trader.go | 10 +++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/exchange/bitget_trade.go b/exchange/bitget_trade.go index aeb08f9..3810e96 100644 --- a/exchange/bitget_trade.go +++ b/exchange/bitget_trade.go @@ -30,7 +30,7 @@ func NewBitgetTrade(apiKey, apiSecret, passphrase string) *BitgetTrade { } } -func (b *BitgetTrade) PlaceMarketOrder(side, symbol, size, tradeSide string) (string, error) { +func (b *BitgetTrade) PlaceMarketOrder(side, symbol, size, tradeSide, holdSide string) (string, error) { ts := fmt.Sprintf("%d", time.Now().UnixMilli()) method := "POST" @@ -48,6 +48,10 @@ func (b *BitgetTrade) PlaceMarketOrder(side, symbol, size, tradeSide string) (st "tradeSide": tradeSide, "size": size, } + // When closing, Bitget requires holdSide to identify which position to close + if tradeSide == "close" && holdSide != "" { + body["holdSide"] = holdSide + } bodyJSON, _ := json.Marshal(body) sign := b.sign(method, requestPath, ts, string(bodyJSON)) diff --git a/trader.go b/trader.go index fa7030b..4596418 100644 --- a/trader.go +++ b/trader.go @@ -1168,7 +1168,7 @@ func (t *Trader) placeOrder(leg *PositionLeg, side string, store *PriceStore) (s if leg.Exchange == ExBitget { szStr := exchange.GetBitgetSize(leg.Coin+"USDT", t.cfg.TradeAmountUSD, leg.EntryPrice) log.Printf("[Order] BG %s %s | amountUSD=%.2f entryPrice=%.6f size=%s", side, leg.Coin+"USDT", t.cfg.TradeAmountUSD, leg.EntryPrice, szStr) - oid, err := t.bitget.PlaceMarketOrder(side, leg.Coin+"USDT", szStr, "open") + oid, err := t.bitget.PlaceMarketOrder(side, leg.Coin+"USDT", szStr, "open", "") if err != nil { return fmt.Sprintf("BG %s error: %v", side, err), 0 } @@ -1398,7 +1398,11 @@ func (t *Trader) closeLeg(leg *PositionLeg) string { if leg.Exchange == ExBitget { log.Printf("[Order] BG close %s %s | size=%s", side, leg.Coin+"USDT", leg.Size) - resp, err := t.bitget.PlaceMarketOrder(side, leg.Coin+"USDT", leg.Size, "close") + holdSide := "long" + if leg.Side == Short { + holdSide = "short" + } + resp, err := t.bitget.PlaceMarketOrder(side, leg.Coin+"USDT", leg.Size, "close", holdSide) if err != nil { return fmt.Sprintf("%v", err) } @@ -1584,7 +1588,7 @@ func (t *Trader) placeOrderAt(leg *PositionLeg, side string, store *PriceStore, if leg.Exchange == ExBitget { szStr := exchange.GetBitgetSize(leg.Coin+"USDT", t.cfg.TradeAmountUSD, price) log.Printf("[Order] BG scale %s %s | amountUSD=%.2f price=%.6f size=%s", side, leg.Coin+"USDT", t.cfg.TradeAmountUSD, price, szStr) - _, err := t.bitget.PlaceMarketOrder(side, leg.Coin+"USDT", szStr, "open") + _, err := t.bitget.PlaceMarketOrder(side, leg.Coin+"USDT", szStr, "open", "") if err != nil { return fmt.Sprintf("BG %s error: %v", side, err) }