From 184e6991956c7da65031e29d76f61c426e3a7552 Mon Sep 17 00:00:00 2001 From: hucan <951870319@qq.com> Date: Sat, 22 Feb 2025 09:51:45 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=88=A0=E9=99=A4=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=BF=AE=E6=94=B9=202=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=A7=A6=E5=8F=91=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/models/line_pre_order.go | 1 + app/jobs/examples.go | 2 +- .../binanceservice/futuresjudgeservice.go | 11 ++++++++--- services/binanceservice/futuresrest.go | 4 ++-- services/binanceservice/spotjudgeservice.go | 19 +++++++++++++++++-- services/binanceservice/spotreset.go | 2 +- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/admin/models/line_pre_order.go b/app/admin/models/line_pre_order.go index 5fb59ed..4e9caab 100644 --- a/app/admin/models/line_pre_order.go +++ b/app/admin/models/line_pre_order.go @@ -34,6 +34,7 @@ type LinePreOrder struct { ExpireTime time.Time `json:"expireTime" gorm:"comment:过期时间"` MainOrderType string `json:"mainOrderType" gorm:"type:enum;comment:第一笔(主单类型) 限价(LIMIT)市价(MARKET)"` LossAmount decimal.Decimal `json:"lossAmount" gorm:"type:decimal(18,8);comment:亏损金额(U)"` + TriggerTime *time.Time `json:"triggerTime" gorm:"type:datetime;comment:触发时间"` Child []LinePreOrder `json:"child" gorm:"-"` ApiName string `json:"api_name" gorm:"->"` ChildNum int64 `json:"child_num" gorm:"->"` diff --git a/app/jobs/examples.go b/app/jobs/examples.go index a259011..0841ba8 100644 --- a/app/jobs/examples.go +++ b/app/jobs/examples.go @@ -71,7 +71,7 @@ func (receiver DeleteExpireOrder) Exec(arg interface{}) error { break } orders := make([]models.LinePreOrder, 0) - err := db.Model(&models.LinePreOrder{}).Where("status = '0' AND expire_time <= ? AND (order_type = 1 or order_type = 2)", time.Now()).Find(&orders).Error + err := db.Model(&models.LinePreOrder{}).Where("status = '0' AND expire_time <= ? AND order_type = 0 AND pid=0", time.Now()).Find(&orders).Error if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } diff --git a/services/binanceservice/futuresjudgeservice.go b/services/binanceservice/futuresjudgeservice.go index 413fee4..c38a9b4 100644 --- a/services/binanceservice/futuresjudgeservice.go +++ b/services/binanceservice/futuresjudgeservice.go @@ -137,7 +137,7 @@ func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi } } - if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Update("status", "1").Error; err != nil { + if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Updates(map[string]interface{}{"status": "1", "trigger_time": time.Now()}).Error; err != nil { log.Error("更新预下单状态失败 ordersn:", v.OrderSn, " status:1") } @@ -260,6 +260,11 @@ func FuturesReduceTrigger(db *gorm.DB, reduceOrder ReduceListItem, futApi FutRes Updates(map[string]interface{}{"status": 2, "desc": err.Error()}).Error; err2 != nil { log.Errorf("合约减仓更新状态失败 id:%s err:%v", reduceOrder.Id, err2) } + } else { + if err := db.Model(&DbModels.LinePreOrder{}). + Where("id = ? AND status =0", reduceOrder.Id).Updates(map[string]interface{}{"status": 1, "trigger_time": time.Now()}).Error; err != nil { + log.Errorf("合约减仓更新状态失败 id:%s err:%v", reduceOrder.Id, err) + } } if _, err := helper.DefaultRedis.LRem(key, item); err != nil { @@ -270,7 +275,7 @@ func FuturesReduceTrigger(db *gorm.DB, reduceOrder ReduceListItem, futApi FutRes } } -// 判断现货加仓 +// 判断合约加仓 func JudgeFutAddPosition(trade models.TradeSet) { key := fmt.Sprintf(rediskey.FuturesAddPositionList, global.EXCHANGE_BINANCE) preOrderVal, _ := helper.DefaultRedis.GetAllList(key) @@ -384,7 +389,7 @@ func FutAddPositionTrigger(db *gorm.DB, v *AddPositionList, item string, futApi } } - if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Update("status", "1").Error; err != nil { + if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Updates(map[string]interface{}{"status": "1", "trigger_time": time.Now()}).Error; err != nil { log.Error("更新预下单状态失败 ordersn:", v.OrderSn, " status:1") } return diff --git a/services/binanceservice/futuresrest.go b/services/binanceservice/futuresrest.go index f85ea0c..a61fdc8 100644 --- a/services/binanceservice/futuresrest.go +++ b/services/binanceservice/futuresrest.go @@ -511,7 +511,7 @@ func processFutTakeProfitOrder(db *gorm.DB, futApi FutRestApi, order models.Line } } else { 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(), "trigger_time": time.Now()}).Error; err != nil { logger.Error("合约止盈下单成功,更新状态失败:", order.OrderSn, " err:", err) } } @@ -541,7 +541,7 @@ func processFutStopLossOrder(db *gorm.DB, order models.LinePreOrder, price, num } } else { if err := db.Model(&order).Where("status =0"). - Updates(map[string]interface{}{"status": "1"}).Error; err != nil { + Updates(map[string]interface{}{"status": "1", "trigger_time": time.Now()}).Error; err != nil { logger.Error("合约止损下单成功,更新状态失败:", order.OrderSn, " err:", err) } } diff --git a/services/binanceservice/spotjudgeservice.go b/services/binanceservice/spotjudgeservice.go index f23753f..34b3d94 100644 --- a/services/binanceservice/spotjudgeservice.go +++ b/services/binanceservice/spotjudgeservice.go @@ -127,7 +127,7 @@ func SpotOrderLock(db *gorm.DB, v *dto.PreOrderRedisList, item string, spotApi S } } - if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Update("status", "1").Error; err != nil { + if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Updates(map[string]interface{}{"status": "1", "trigger_time": time.Now()}).Error; err != nil { log.Error("更新预下单状态失败 ordersn:", v.OrderSn, " status:1") } return @@ -244,11 +244,16 @@ func SpotStopLossTrigger(db *gorm.DB, stopOrder dto.StopLossRedisList, spotApi S if err := spotApi.OrderPlaceLoop(db, params, 3); err != nil { log.Errorf("现货止损挂单失败 id:%s err:%v", stopOrder.Id, err) + } else { + if err := db.Model(&DbModels.LinePreOrder{}).Where("id = ? AND status =0", stopOrder.Id).Updates(map[string]interface{}{"status": 1, "trigger_time": time.Now()}).Error; err != nil { + log.Errorf("现货止损更新状态失败 id:%s err:%v", stopOrder.Id, err) + } } if _, err := helper.DefaultRedis.LRem(key, item); err != nil { log.Errorf("现货止损 删除缓存失败 id:%v err:%v", stopOrder.Id, err) } + } else { log.Error("获取锁失败") } @@ -356,6 +361,12 @@ func SpotReduceTrigger(db *gorm.DB, reduceOrder ReduceListItem, spotApi SpotRest Updates(map[string]interface{}{"status": 2, "desc": err.Error()}).Error; err2 != nil { log.Errorf("修改现货减仓状态失败 id:%s err:%v", reduceOrder.Id, err2) } + } else { + if err := db.Model(&DbModels.LinePreOrder{}). + Where("id =? AND status =0", reduceOrder.Id). + Updates(map[string]interface{}{"status": 1, "trigger_time": time.Now()}).Error; err != nil { + log.Errorf("修改现货减仓状态失败 id:%s err:%v", reduceOrder.Id, err) + } } if _, err := helper.DefaultRedis.LRem(key, item); err != nil { @@ -474,7 +485,11 @@ func SpotAddPositionTrigger(db *gorm.DB, v *AddPositionList, item string, spotAp } } - if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Update("status", "1").Error; err != nil { + if err := db.Model(&DbModels.LinePreOrder{}).Where("id =?", preOrder.Id).Updates(map[string]interface{}{"trigger_time": time.Now()}).Error; err != nil { + log.Error("更新预下单触发事件失败 ordersn:", v.OrderSn) + } + + if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Updates(map[string]interface{}{"status": "1"}).Error; err != nil { log.Error("更新预下单状态失败 ordersn:", v.OrderSn, " status:1") } return diff --git a/services/binanceservice/spotreset.go b/services/binanceservice/spotreset.go index 0365b22..5fb5f50 100644 --- a/services/binanceservice/spotreset.go +++ b/services/binanceservice/spotreset.go @@ -687,7 +687,7 @@ func processTakeProfitOrder(db *gorm.DB, spotApi SpotRestApi, order models.LineP } } else { 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, "trigger_time": time.Now()}).Error; err != nil { logger.Error("现货止盈下单成功,更新状态失败:", order.OrderSn, " err:", err) } }