1、阶段减仓
This commit is contained in:
@ -10,6 +10,7 @@ import (
|
||||
"go-admin/common/global"
|
||||
"go-admin/common/helper"
|
||||
"go-admin/models"
|
||||
"go-admin/pkg/utility"
|
||||
"go-admin/services/cacheservice"
|
||||
"strings"
|
||||
"time"
|
||||
@ -161,30 +162,83 @@ func JudgeFuturesReduce(trade models.TradeSet) {
|
||||
return
|
||||
}
|
||||
|
||||
reduceOrder := ReduceListItem{}
|
||||
tradePrice, _ := decimal.NewFromString(trade.LastPrice)
|
||||
//减仓单减仓策略
|
||||
orderReduceVal, _ := helper.DefaultRedis.GetAllList(fmt.Sprintf(rediskey.SpotOrderReduceStrategyList, global.EXCHANGE_BINANCE))
|
||||
reduceReduceListKey := fmt.Sprintf(rediskey.FutOrderReduceStrategyList, global.EXCHANGE_BINANCE)
|
||||
orderReduceVal, _ := helper.DefaultRedis.HGetAllFields(reduceReduceListKey)
|
||||
reduceOrderStrategy := dto.LineOrderReduceStrategyResp{}
|
||||
|
||||
for _, item := range orderReduceVal {
|
||||
sonic.Unmarshal([]byte(item), &reduceOrderStrategy)
|
||||
|
||||
for _, item2 := range reduceOrderStrategy.Items {
|
||||
if reduceOrderStrategy.Symbol == trade.Coin+trade.Currency {
|
||||
for index, item2 := range reduceOrderStrategy.Items {
|
||||
if reduceOrderStrategy.Symbol == trade.Coin+trade.Currency && !item2.Actived {
|
||||
//买入
|
||||
if item2.TriggerPrice.Cmp(decimal.Zero) > 0 &&
|
||||
tradePrice.Cmp(decimal.Zero) > 0 &&
|
||||
((strings.ToUpper(reduceOrderStrategy.Side) == "SELL" && item2.TriggerPrice.Cmp(tradePrice) >= 0) ||
|
||||
(strings.ToUpper(reduceOrderStrategy.Side) == "BUY" && item2.TriggerPrice.Cmp(tradePrice) <= 0)) {
|
||||
//todo 生成订单并触发
|
||||
// SpotReduceTrigger(db, reduceOrder, spotApi, setting, key, item)
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.ReduceStrategyFutTriggerLock, reduceOrder.ApiId, reduceOrder.Symbol), 50, 15, 100*time.Millisecond)
|
||||
|
||||
if ok, err := lock.AcquireWait(context.Background()); err != nil {
|
||||
log.Error("获取锁失败", err)
|
||||
return
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
hasrecord, _ := helper.DefaultRedis.IsElementInList(reduceReduceListKey, item)
|
||||
|
||||
if !hasrecord {
|
||||
log.Debug("减仓缓存中不存在", item)
|
||||
return
|
||||
}
|
||||
|
||||
order, err := CreateReduceReduceOrder(db, reduceOrderStrategy.OrderId, item2.Price, item2.Num, trade.AmountDigit)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("%d 生成订单失败", reduceOrderStrategy.OrderId)
|
||||
}
|
||||
|
||||
reduceOrder.ApiId = order.ApiId
|
||||
reduceOrder.Id = order.Id
|
||||
reduceOrder.Pid = order.Pid
|
||||
reduceOrder.MainId = order.MainId
|
||||
reduceOrder.Symbol = order.Symbol
|
||||
reduceOrder.Side = reduceOrderStrategy.Side
|
||||
reduceOrder.OrderSn = order.OrderSn
|
||||
reduceOrder.Price = item2.Price
|
||||
reduceOrder.Num = item2.Num
|
||||
//下单成功修改策略节点状态
|
||||
if FuturesReduceTrigger(db, reduceOrder, futApi, setting, reduceReduceListKey, item, true) {
|
||||
reduceOrderStrategy.Items[index].Actived = true
|
||||
allActive := true
|
||||
orderId := utility.IntToString(reduceOrderStrategy.OrderId)
|
||||
|
||||
for _, item3 := range reduceOrderStrategy.Items {
|
||||
if !item3.Actived {
|
||||
allActive = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if allActive {
|
||||
if err := helper.DefaultRedis.HDelField(reduceReduceListKey, orderId); err != nil {
|
||||
log.Errorf("删除redis reduceReduceListKey失败 %s", err.Error())
|
||||
}
|
||||
} else {
|
||||
str, _ := sonic.MarshalString(reduceOrderStrategy)
|
||||
if err := helper.DefaultRedis.HSetField(reduceReduceListKey, orderId, str); err != nil {
|
||||
log.Errorf("更新redis reduceReduceListKey失败 %s", err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, item := range reduceVal {
|
||||
reduceOrder := ReduceListItem{}
|
||||
if err := sonic.Unmarshal([]byte(item), &reduceOrder); err != nil {
|
||||
log.Error("反序列化失败")
|
||||
continue
|
||||
@ -198,52 +252,54 @@ func JudgeFuturesReduce(trade models.TradeSet) {
|
||||
((strings.ToUpper(reduceOrder.Side) == "SELL" && orderPrice.Cmp(tradePrice) >= 0) ||
|
||||
(strings.ToUpper(reduceOrder.Side) == "BUY" && orderPrice.Cmp(tradePrice) <= 0)) {
|
||||
|
||||
FuturesReduceTrigger(db, reduceOrder, futApi, setting, key, item)
|
||||
FuturesReduceTrigger(db, reduceOrder, futApi, setting, key, item, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 触发合约减仓
|
||||
func FuturesReduceTrigger(db *gorm.DB, reduceOrder ReduceListItem, futApi FutRestApi, setting DbModels.LineSystemSetting, key, item string) {
|
||||
// isStrategy 是否是策略减仓
|
||||
func FuturesReduceTrigger(db *gorm.DB, reduceOrder ReduceListItem, futApi FutRestApi, setting DbModels.LineSystemSetting, key, item string, isStrategy bool) bool {
|
||||
tradeSet, _ := cacheservice.GetTradeSet(global.EXCHANGE_BINANCE, reduceOrder.Symbol, 1)
|
||||
result := true
|
||||
|
||||
if tradeSet.LastPrice == "" {
|
||||
return
|
||||
return false
|
||||
}
|
||||
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.FutTrigger, reduceOrder.ApiId, reduceOrder.Symbol), 20, 5, 100*time.Millisecond)
|
||||
|
||||
if ok, err := lock.AcquireWait(context.Background()); err != nil {
|
||||
log.Error("获取锁失败", err)
|
||||
return
|
||||
return false
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
takeOrders := make([]DbModels.LinePreOrder, 0)
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("main_id =? AND order_type =1 AND status IN (1,5)", reduceOrder.MainId).Find(&takeOrders).Error; err != nil {
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("main_id =? AND order_type IN (1,2,4) AND status IN (1,5)", reduceOrder.MainId).Find(&takeOrders).Error; err != nil {
|
||||
log.Error("查询止盈单失败")
|
||||
return
|
||||
return false
|
||||
}
|
||||
|
||||
hasrecord, _ := helper.DefaultRedis.IsElementInList(key, item)
|
||||
|
||||
if !hasrecord {
|
||||
log.Debug("减仓缓存中不存在", item)
|
||||
return
|
||||
return false
|
||||
}
|
||||
|
||||
apiInfo, _ := GetApiInfo(reduceOrder.ApiId)
|
||||
|
||||
if apiInfo.Id == 0 {
|
||||
log.Error("现货减仓 查询api用户不存在")
|
||||
return
|
||||
return false
|
||||
}
|
||||
for _, takeOrder := range takeOrders {
|
||||
err := CancelFutOrderByOrderSnLoop(apiInfo, takeOrder.Symbol, takeOrder.OrderSn)
|
||||
|
||||
if err != nil {
|
||||
log.Error("合约止盈撤单失败", err)
|
||||
return
|
||||
log.Error("撤单失败", err)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@ -258,6 +314,7 @@ func FuturesReduceTrigger(db *gorm.DB, reduceOrder ReduceListItem, futApi FutRes
|
||||
}
|
||||
|
||||
if err := futApi.ClosePositionLoop(reduceOrder.Symbol, reduceOrder.OrderSn, num, reduceOrder.Side, positionSide, apiInfo, "LIMIT", "0", price, 3); err != nil {
|
||||
result = false
|
||||
log.Errorf("合约减仓挂单失败 id:%s err:%v", reduceOrder.Id, err)
|
||||
|
||||
if err2 := db.Model(&DbModels.LinePreOrder{}).
|
||||
@ -276,15 +333,22 @@ func FuturesReduceTrigger(db *gorm.DB, reduceOrder ReduceListItem, futApi FutRes
|
||||
}
|
||||
|
||||
//处理减仓单减仓策略
|
||||
CacheOrderStrategyAndReCreate(db, reduceOrder, 2, tradeSet, setting)
|
||||
if err := CacheOrderStrategyAndReCreate(db, reduceOrder, 2, tradeSet, setting); err != nil {
|
||||
log.Errorf("合约减仓策略处理失败 id:%s err:%v", reduceOrder.Id, err)
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Errorf("合约减仓 删除缓存失败 id:%v err:%v", reduceOrder.Id, err)
|
||||
if !isStrategy {
|
||||
if _, err := helper.DefaultRedis.LRem(key, item); err != nil {
|
||||
log.Errorf("合约减仓 删除缓存失败 id:%v err:%v", reduceOrder.Id, err)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.Error("获取锁失败")
|
||||
result = false
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// 判断合约加仓
|
||||
|
||||
Reference in New Issue
Block a user