From 981d2c0108bc1e772ec09b738e37620c4c741c41 Mon Sep 17 00:00:00 2001 From: hucan <951870319@qq.com> Date: Tue, 4 Mar 2025 15:34:32 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/binanceservice/futuresrest.go | 11 +++++++---- services/binanceservice/spotreset.go | 4 ++-- services/positionservice/position_management.go | 5 ++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/services/binanceservice/futuresrest.go b/services/binanceservice/futuresrest.go index 5e7d289..8c32a08 100644 --- a/services/binanceservice/futuresrest.go +++ b/services/binanceservice/futuresrest.go @@ -261,10 +261,10 @@ func getFuturesPositionNum(apiUserInfo DbModels.LineApiUser, preOrder *DbModels. positionAmt := utility.StrToDecimal(item.PositionAmt) //多 - if positionAmt.Cmp(decimal.Zero) > 0 && preOrder.Site == "SELL" { + if positionAmt.Cmp(decimal.Zero) > 0 && ((preOrder.OrderType == 0 && preOrder.Site == "BUY") || (preOrder.OrderType != 0 && preOrder.Site == "SELL")) { num = positionAmt.Abs().Truncate(int32(tradeSet.AmountDigit)) break - } else if positionAmt.Cmp(decimal.Zero) < 0 && preOrder.Site == "BUY" { + } else if positionAmt.Cmp(decimal.Zero) < 0 && ((preOrder.OrderType != 0 && preOrder.Site == "BUY") || (preOrder.OrderType == 0 && preOrder.Site == "SELL")) { //空 num = positionAmt.Abs().Truncate(int32(tradeSet.AmountDigit)) break @@ -499,7 +499,10 @@ func cancelPositionOtherOrders(apiUserInfo DbModels.LineApiUser, db *gorm.DB, pr mainId = mainOrder.MainId } removeFutLossAndAddPosition(mainId, mainOrder.OrderSn) - mainIds = append(mainIds, mainId) + + if !utility.ContainsInt(mainIds, mainId) { + mainIds = append(mainIds, mainId) + } } if len(mainIds) > 0 { @@ -620,7 +623,7 @@ func processFutTakeProfitOrder(db *gorm.DB, futApi FutRestApi, order models.Line } if err := db.Model(&DbModels.LinePreOrder{}).Where("id = ? and status =0", order.Id). - Updates(map[string]interface{}{"status": "1", "num": num.String()}).Error; err != nil { + Updates(map[string]interface{}{"status": "1", "num": num.String(), "price": order.Price}).Error; err != nil { logger.Error("合约止盈下单成功,更新状态失败:", order.OrderSn, " err:", err) } } diff --git a/services/binanceservice/spotreset.go b/services/binanceservice/spotreset.go index dfbc5e5..3cdbb45 100644 --- a/services/binanceservice/spotreset.go +++ b/services/binanceservice/spotreset.go @@ -543,7 +543,7 @@ func handleMainOrderFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) { if err != nil { logger.Errorf("取消未成交订单失败, 交易对:%s 主单号:%s, 错误信息:%v", preOrder.Symbol, preOrder.MainId, err) } else if len(mainIds) > 0 { - if err := db.Exec("UPDATE line_pre_order SET status=4,desc=desc +' 新单触发取消' WHERE id IN ? AND status =6", mainIds).Error; err != nil { + if err := db.Exec("UPDATE line_pre_order SET `status`=4,`desc`=CONCAT(`desc`, ' 新单触发取消') WHERE id IN ? AND `status` =6", mainIds).Error; err != nil { logger.Errorf("新下单成功后更新主单取消状态失败, 新主单号:%s, 错误信息:%v", preOrder.MainId, err) } } @@ -770,7 +770,7 @@ func processTakeProfitOrder(db *gorm.DB, spotApi SpotRestApi, order models.LineP logger.Error("更新现货止盈单触发事件 ordersn:", order.OrderSn) } if err := db.Model(&DbModels.LinePreOrder{}).Where("id = ? and status ='0'", order.Id). - Updates(map[string]interface{}{"status": "1", "num": order.Num}).Error; err != nil { + Updates(map[string]interface{}{"status": "1", "num": order.Num, "price": order.Price}).Error; err != nil { logger.Error("现货止盈下单成功,更新状态失败:", order.OrderSn, " err:", err) } } diff --git a/services/positionservice/position_management.go b/services/positionservice/position_management.go index 78221c3..b44e050 100644 --- a/services/positionservice/position_management.go +++ b/services/positionservice/position_management.go @@ -77,8 +77,11 @@ func (e *BinancePositionManagement) SavePosition(data *positiondto.PositionAddRe result.LastPrice = data.Price } - if totalLoss.Cmp(decimal.Zero) > 0 { + //总亏损大于0 + if totalLoss.Add(result.TotalLoss).Cmp(decimal.Zero) > 0 { result.TotalLoss = result.TotalLoss.Add(totalLoss) + } else { + result.TotalLoss = decimal.Zero } result.Quantity = data.Quantity.Add(result.Quantity)