1、有更新,还没测完,暂时归档
This commit is contained in:
@ -56,9 +56,11 @@ func JudgeSpotPrice(trade models.TradeSet) {
|
||||
|
||||
apiInfo, _ := GetApiInfo(preOrder.ApiId)
|
||||
if err := commonservice.JudgeWebsocketTimeout(apiInfo.ApiKey, 1); err != nil {
|
||||
log.Errorf("现货行情订阅超时,apiKey:%s err:%v", err)
|
||||
log.Errorf("现货行情订阅超时,apiKey:%s err:%v", apiInfo.ApiKey, err)
|
||||
|
||||
if err1 := orderService.ErrorTrigger(&preOrder, fmt.Sprintf("行情触发失败,err:%v", err)); err1 != nil {
|
||||
if err1 := orderService.ErrorTrigger(preOrder.Id, 1,
|
||||
global.EXCHANGE_BINANCE, item,
|
||||
fmt.Sprintf("行情触发失败,err:%v", err)); err1 != nil {
|
||||
log.Error("触发失败", err1)
|
||||
}
|
||||
continue
|
||||
@ -70,9 +72,8 @@ func JudgeSpotPrice(trade models.TradeSet) {
|
||||
}
|
||||
}
|
||||
|
||||
// 分布式锁下单
|
||||
// v 预下单信息
|
||||
// item 预下单源文本
|
||||
// 分布式锁下单(现货预设主单触发)
|
||||
// v: 预下单信息;item: Redis 原始条目(用于准确删除)
|
||||
func SpotOrderLock(db *gorm.DB, v *dto.PreOrderRedisList, item string, spotApi SpotRestApi) {
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.SpotTrigger, v.ApiId, v.Symbol), 20, 5, 100*time.Millisecond)
|
||||
|
||||
@ -114,29 +115,21 @@ func SpotOrderLock(db *gorm.DB, v *dto.PreOrderRedisList, item string, spotApi S
|
||||
Quantity: num,
|
||||
NewClientOrderId: v.OrderSn,
|
||||
}
|
||||
preOrderVal, _ := sonic.MarshalString(&v)
|
||||
|
||||
if err := spotApi.OrderPlaceLoop(db, params, 3); err != nil {
|
||||
log.Error("下单失败", v.Symbol, " err:", err)
|
||||
err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status =0", preOrder.Id).Updates(map[string]interface{}{"status": "2", "desc": err.Error()}).Error
|
||||
err = db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status =0", preOrder.Id).Updates(map[string]interface{}{"status": "2", "desc": err.Error()}).Error
|
||||
|
||||
if err != nil {
|
||||
log.Error("下单失败后修改订单失败")
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? ", preOrder.Id).Updates(map[string]interface{}{"trigger_time": time.Now()}).Error; err != nil {
|
||||
@ -214,7 +207,7 @@ func SpotStopLossTrigger(db *gorm.DB, stopOrder dto.StopLossRedisList, spotApi S
|
||||
hasrecord, _ := helper.DefaultRedis.IsElementInList(key, item)
|
||||
|
||||
if !hasrecord {
|
||||
log.Debug("减仓缓存中不存在", item)
|
||||
log.Debug("止损缓存中不存在", item)
|
||||
return
|
||||
}
|
||||
|
||||
@ -225,17 +218,8 @@ func SpotStopLossTrigger(db *gorm.DB, stopOrder dto.StopLossRedisList, spotApi S
|
||||
return
|
||||
}
|
||||
|
||||
var err error
|
||||
for x := 1; x <= 4; x++ {
|
||||
err = spotApi.CancelOpenOrderByOrderSn(apiInfo, takeOrder.Symbol, takeOrder.OrderSn)
|
||||
|
||||
if err == nil || strings.Contains(err.Error(), "该交易对没有订单") {
|
||||
err = nil
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
// 使用统一的撤单重试封装,确保行为一致且高效
|
||||
if err := CancelOpenOrderByOrderSnLoop(apiInfo, takeOrder.Symbol, takeOrder.OrderSn); err != nil {
|
||||
log.Error("现货止损撤单失败", err)
|
||||
return
|
||||
}
|
||||
@ -265,11 +249,9 @@ func SpotStopLossTrigger(db *gorm.DB, stopOrder dto.StopLossRedisList, spotApi S
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Errorf("现货止损 删除缓存失败 id:%v err:%v", stopOrder.Id, err)
|
||||
}
|
||||
|
||||
} else {
|
||||
log.Error("获取锁失败")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 判断是否触发现货减仓
|
||||
@ -310,7 +292,7 @@ func JudgeSpotReduce(trade models.TradeSet) {
|
||||
return
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
hasrecord, _ := helper.DefaultRedis.HExists(reduceReduceListKey, utility.IntTostring(reduceOrderStrategy.OrderId), item)
|
||||
hasrecord, _ := helper.DefaultRedis.HExists(reduceReduceListKey, utility.IntToString(reduceOrderStrategy.OrderId), item)
|
||||
|
||||
if !hasrecord {
|
||||
log.Debug("减仓缓存中不存在", item)
|
||||
@ -515,6 +497,8 @@ func JudgeSpotAddPosition(trade models.TradeSet) {
|
||||
}
|
||||
}
|
||||
|
||||
// 现货加仓触发
|
||||
// v: 加仓触发信息;item: Redis 原始条目(用于准确删除)
|
||||
func SpotAddPositionTrigger(db *gorm.DB, v *positiondto.AddPositionList, item string, spotApi SpotRestApi) {
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.SpotTrigger, v.ApiId, v.Symbol), 20, 5, 100*time.Millisecond)
|
||||
|
||||
@ -569,8 +553,6 @@ func SpotAddPositionTrigger(db *gorm.DB, v *positiondto.AddPositionList, item st
|
||||
Quantity: num.Truncate(int32(tradeSet.AmountDigit)),
|
||||
NewClientOrderId: v.OrderSn,
|
||||
}
|
||||
preOrderVal, _ := sonic.MarshalString(&v)
|
||||
|
||||
if err := spotApi.OrderPlaceLoop(db, params, 3); err != nil {
|
||||
log.Error("下单失败", v.Symbol, " err:", err)
|
||||
err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status =0", preOrder.Id).Updates(map[string]interface{}{"status": "2", "desc": err.Error()}).Error
|
||||
@ -578,20 +560,14 @@ func SpotAddPositionTrigger(db *gorm.DB, v *positiondto.AddPositionList, item st
|
||||
if err != nil {
|
||||
log.Error("下单失败后修改订单失败")
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("id =?", preOrder.Id).Updates(map[string]interface{}{"trigger_time": time.Now()}).Error; err != nil {
|
||||
@ -607,3 +583,71 @@ func SpotAddPositionTrigger(db *gorm.DB, v *positiondto.AddPositionList, item st
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 触发现货止盈
|
||||
func SpotTakeProfitTrigger(db *gorm.DB, takeOrder dto.TakeProfitRedisList, spotApi SpotRestApi, setting DbModels.LineSystemSetting, tradeSet models.TradeSet, key string, item string) {
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.SpotTrigger, takeOrder.ApiId, takeOrder.Symbol), 20, 5, 100*time.Millisecond)
|
||||
|
||||
if ok, err := lock.AcquireWait(context.Background()); err != nil {
|
||||
log.Error("获取锁失败", err)
|
||||
return
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
stopOrder := DbModels.LinePreOrder{}
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).
|
||||
Where("pid =? AND order_type =2", takeOrder.PId).
|
||||
Find(&stopOrder).Error; err != nil {
|
||||
log.Error("查询止盈单失败")
|
||||
return
|
||||
}
|
||||
|
||||
hasrecord, _ := helper.DefaultRedis.IsElementInList(key, item)
|
||||
|
||||
if !hasrecord {
|
||||
log.Debug("止损缓存中不存在", item)
|
||||
return
|
||||
}
|
||||
|
||||
apiInfo, _ := GetApiInfo(takeOrder.ApiId)
|
||||
|
||||
if apiInfo.Id == 0 {
|
||||
log.Error("现货止盈 查询api用户不存在")
|
||||
return
|
||||
}
|
||||
|
||||
// 使用统一的撤单重试封装,确保行为一致且高效
|
||||
if err := CancelOpenOrderByOrderSnLoop(apiInfo, stopOrder.Symbol, stopOrder.OrderSn); err != nil {
|
||||
log.Error("现货止盈撤单失败", err)
|
||||
return
|
||||
}
|
||||
price := takeOrder.Price.Mul(decimal.NewFromInt(1).Sub(setting.StopLossPremium.Div(decimal.NewFromInt(100)))).Truncate(int32(tradeSet.PriceDigit))
|
||||
num := utility.StrToDecimal(stopOrder.Num).Truncate(int32(tradeSet.AmountDigit))
|
||||
|
||||
params := OrderPlacementService{
|
||||
ApiId: takeOrder.ApiId,
|
||||
Side: takeOrder.Site,
|
||||
Type: "TAKE_PROFIT_Market",
|
||||
TimeInForce: "GTC",
|
||||
Symbol: takeOrder.Symbol,
|
||||
Price: price,
|
||||
Quantity: num,
|
||||
NewClientOrderId: takeOrder.OrderSn,
|
||||
}
|
||||
|
||||
if err := spotApi.OrderPlaceLoop(db, params, 3); err != nil {
|
||||
log.Errorf("现货止盈挂单失败 id:%s err:%v", takeOrder.Id, err)
|
||||
} else {
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).
|
||||
Where("id = ? ", takeOrder.Id).
|
||||
Updates(map[string]interface{}{"trigger_time": time.Now()}).Error; err != nil {
|
||||
log.Errorf("现货止盈更新状态失败 id:%s err:%v", takeOrder.Id, err)
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Errorf("现货止盈 删除缓存失败 id:%v err:%v", takeOrder.Id, err)
|
||||
}
|
||||
} else {
|
||||
log.Error("获取锁失败")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user