fix: Bitget 平仓必须传 holdSide 参数
- PlaceMarketOrder 新增 holdSide 参数 - 平仓时(closeLeg)根据 leg.Side 传 holdSide="long"/"short" - 开仓传空字符串,不受影响 - 修复 BG 持续 'No position to close' (22002) 问题
This commit is contained in:
@@ -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())
|
ts := fmt.Sprintf("%d", time.Now().UnixMilli())
|
||||||
method := "POST"
|
method := "POST"
|
||||||
|
|
||||||
@@ -48,6 +48,10 @@ func (b *BitgetTrade) PlaceMarketOrder(side, symbol, size, tradeSide string) (st
|
|||||||
"tradeSide": tradeSide,
|
"tradeSide": tradeSide,
|
||||||
"size": size,
|
"size": size,
|
||||||
}
|
}
|
||||||
|
// When closing, Bitget requires holdSide to identify which position to close
|
||||||
|
if tradeSide == "close" && holdSide != "" {
|
||||||
|
body["holdSide"] = holdSide
|
||||||
|
}
|
||||||
bodyJSON, _ := json.Marshal(body)
|
bodyJSON, _ := json.Marshal(body)
|
||||||
|
|
||||||
sign := b.sign(method, requestPath, ts, string(bodyJSON))
|
sign := b.sign(method, requestPath, ts, string(bodyJSON))
|
||||||
|
|||||||
@@ -1168,7 +1168,7 @@ func (t *Trader) placeOrder(leg *PositionLeg, side string, store *PriceStore) (s
|
|||||||
if leg.Exchange == ExBitget {
|
if leg.Exchange == ExBitget {
|
||||||
szStr := exchange.GetBitgetSize(leg.Coin+"USDT", t.cfg.TradeAmountUSD, leg.EntryPrice)
|
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)
|
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 {
|
if err != nil {
|
||||||
return fmt.Sprintf("BG %s error: %v", side, err), 0
|
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 {
|
if leg.Exchange == ExBitget {
|
||||||
log.Printf("[Order] BG close %s %s | size=%s", side, leg.Coin+"USDT", leg.Size)
|
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 {
|
if err != nil {
|
||||||
return fmt.Sprintf("%v", err)
|
return fmt.Sprintf("%v", err)
|
||||||
}
|
}
|
||||||
@@ -1584,7 +1588,7 @@ func (t *Trader) placeOrderAt(leg *PositionLeg, side string, store *PriceStore,
|
|||||||
if leg.Exchange == ExBitget {
|
if leg.Exchange == ExBitget {
|
||||||
szStr := exchange.GetBitgetSize(leg.Coin+"USDT", t.cfg.TradeAmountUSD, price)
|
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)
|
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 {
|
if err != nil {
|
||||||
return fmt.Sprintf("BG %s error: %v", side, err)
|
return fmt.Sprintf("BG %s error: %v", side, err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user