1、阶段减仓

This commit is contained in:
2025-04-07 18:36:36 +08:00
parent cdd3f951a2
commit 8e8c78ec0b
13 changed files with 393 additions and 59 deletions

View File

@ -8,6 +8,7 @@ import (
"go-admin/common/global"
"go-admin/common/helper"
models2 "go-admin/models"
"go-admin/pkg/utility"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/logger"
@ -19,7 +20,7 @@ import (
// reduceOrder:原始减仓单
// reduceOrderStrategy:减仓策略
func CacheOrderStrategyAndReCreate(db *gorm.DB, reduceOrder ReduceListItem, symbolType int, tradeSet models2.TradeSet, setting models.LineSystemSetting) error {
reduceOrderStrategy := models.LineReduceStrategy{}
reduceOrderStrategy := models.LineOrderReduceStrategy{}
var key string
if symbolType == 1 {
@ -28,21 +29,27 @@ func CacheOrderStrategyAndReCreate(db *gorm.DB, reduceOrder ReduceListItem, symb
key = fmt.Sprintf(rediskey.FutOrderReduceStrategyList, global.EXCHANGE_BINANCE)
}
if err := db.Model(&reduceOrderStrategy).Where("order_id =?", reduceOrder.Id).Find(reduceOrderStrategy).Error; err != nil {
if err := db.Model(&reduceOrderStrategy).Where("order_id =?", reduceOrder.Id).Find(&reduceOrderStrategy).Error; err != nil {
logger.Errorf("获取减仓策略失败,err:%v", err)
return err
}
if reduceOrderStrategy.Id > 0 {
items := make([]models.LineReduceStrategyItem, 0)
strategyCache := dto.LineOrderReduceStrategyResp{
OrderId: reduceOrder.Id,
Symbol: reduceOrder.Symbol,
MainId: reduceOrder.MainId,
Side: reduceOrder.Side,
}
for _, item := range reduceOrderStrategy.Items {
sonic.Unmarshal([]byte(reduceOrderStrategy.ItemContent), &items)
for _, item := range items {
var rate decimal.Decimal
var triggerRate decimal.Decimal
if reduceOrder.Side == "BUY" {
if reduceOrder.Side == "SELL" {
rate = (decimal.NewFromInt(100).Sub(item.LossPercent)).Div(decimal.NewFromInt(100))
if setting.ReduceEarlyTriggerPercent.Cmp(decimal.Zero) > 0 {
@ -61,19 +68,26 @@ func CacheOrderStrategyAndReCreate(db *gorm.DB, reduceOrder ReduceListItem, symb
}
price := reduceOrder.Price.Mul(rate).Truncate(int32(tradeSet.PriceDigit))
triggerPrice := reduceOrder.Price.Mul(triggerRate).Truncate(int32(tradeSet.PriceDigit))
num := reduceOrder.Num
//百分比大于0就重新计算 否则就是主减仓单数量
if item.QuantityPercent.Cmp(decimal.Zero) > 0 {
num = reduceOrder.Num.Mul(item.QuantityPercent.Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit))
}
strategyCache.Items = append(strategyCache.Items, dto.LineOrderReduceStrategyRespItem{
LossPercent: item.LossPercent,
OrderType: item.OrderType,
Price: price,
TriggerPrice: triggerPrice,
Num: num,
})
}
str, _ := sonic.MarshalString(reduceOrderStrategy)
str, _ := sonic.MarshalString(strategyCache)
if str != "" {
if err := helper.DefaultRedis.SetString(key, str); err != nil {
if err := helper.DefaultRedis.HSetField(key, utility.IntToString(reduceOrder.Id), str); err != nil {
logger.Errorf("减仓单缓存减仓策略,err:%v", err)
}
}
@ -132,3 +146,33 @@ func ReduceCallBack(db *gorm.DB, preOrder *models.LinePreOrder) error {
return nil
}
// 移除减仓后减仓策略
// mainId 主单id
// symbolType 交易对类型
func RemoveReduceReduceCacheByMainId(mainId int, symbolType int) error {
var key string
switch symbolType {
case 1:
key = fmt.Sprintf(rediskey.SpotOrderReduceStrategyList, global.EXCHANGE_BINANCE)
case 2:
key = fmt.Sprintf(rediskey.FutOrderReduceStrategyList, global.EXCHANGE_BINANCE)
default:
return fmt.Errorf("交易对类型错误")
}
arrays, _ := helper.DefaultRedis.HGetAllFields(key)
cache := dto.LineOrderReduceStrategyResp{}
for _, v := range arrays {
sonic.Unmarshal([]byte(v), &cache)
if cache.MainId == mainId {
if err := helper.DefaultRedis.HDelField(key, utility.IntToString(cache.OrderId)); err != nil {
logger.Errorf("移除减仓单减仓策略失败redis err:%v", err)
}
}
}
return nil
}