1、合约止盈止损单在减仓单成交之后再取消

This commit is contained in:
2025-04-11 09:06:09 +08:00
parent a9fc1c87f5
commit d4c8e692a7
10 changed files with 142 additions and 86 deletions

View File

@ -12,9 +12,11 @@ import (
models2 "go-admin/models"
"go-admin/pkg/utility"
"go-admin/services/cacheservice"
"strings"
"time"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk/service"
"github.com/shopspring/decimal"
)
@ -95,8 +97,16 @@ func (e *BinanceStrategyOrderService) JudgeStrategy(order dto.StrategyOrderRedis
}
score := lastPrices[0].Score
startPrice := utility.StrToDecimal(beforePrice)
lastPrice := utility.StrToDecimal(lastPrices[0].Member.(string))
var startPrice decimal.Decimal
var lastPrice decimal.Decimal
startPriceArgs := strings.Split(beforePrice, ":")
endPricecArgs := strings.Split(lastPrices[0].Member.(string), ":")
if len(startPriceArgs) == 0 || len(endPricecArgs) == 0 {
return result, errors.New("获取交易对起止价格失败")
}
startPrice = utility.StrToDecimal(startPriceArgs[len(startPriceArgs)-1])
lastPrice = utility.StrToDecimal(endPricecArgs[len(endPricecArgs)-1])
//时间差超过10s
if (nowUtc-int64(score))/1000 > 10 {
@ -188,33 +198,81 @@ func (e *BinanceStrategyOrderService) RecalculateOrder(tradeSet models2.TradeSet
mainOrder.SignPrice = lastPrice.String()
mainOrder.Price = newPrice.String()
mainOrder.Num = totalNum.String()
remainQuantity := totalNum
for index := range mainOrder.Childs {
//主单止盈
if mainOrder.Child[index].OrderType == 1 {
var ext models.LinePreOrderExt
var ext models.LinePreOrderExt
for _, v := range exts {
if v.OrderId == mainOrder.Child[index].Id {
ext = v
break
}
}
if ext.Id <= 0 {
logger.Errorf("子订单ext不存在 id:%d", mainOrder.Child[index].Id)
continue
}
for _, v := range exts {
if v.OrderId == mainOrder.Child[index].Id {
ext = v
break
}
//主单止盈、止损
if mainOrder.Child[index].Pid == mainOrder.Child[index].MainId && (mainOrder.Child[index].OrderType == 1 || mainOrder.Child[index].OrderType == 2) {
var percent decimal.Decimal
switch {
// 加价
case mainOrder.Child[index].OrderType == 1 && mainOrder.Site == "BUY", mainOrder.Child[index].OrderType == 2 && mainOrder.Site == "SELL":
percent = decimal.NewFromInt(100).Add(ext.TakeProfitRatio)
//减价
case mainOrder.Child[index].OrderType == 2 && mainOrder.Site == "BUY", mainOrder.Child[index].OrderType == 1 && mainOrder.Site == "SELL":
percent = decimal.NewFromInt(100).Sub(ext.StopLossRatio)
}
if ext.Id > 0 {
var percent decimal.Decimal
//多
if mainOrder.Site == "BUY" {
percent = decimal.NewFromInt(100).Add(ext.TakeProfitRatio)
} else {
percent = decimal.NewFromInt(100).Sub(ext.StopLossRatio)
}
childPrice := lastPrice.Mul(percent.Div(decimal.NewFromInt(100).Truncate(4))).Truncate(int32(tradeSet.PriceDigit))
mainOrder.Child[index].Price = childPrice.String()
mainOrder.Child[index].Num = totalNum.String()
childPrice := lastPrice.Mul(percent.Div(decimal.NewFromInt(100).Truncate(4))).Truncate(int32(tradeSet.PriceDigit))
mainOrder.Child[index].Price = childPrice.String()
}
} else {
//todo 重新计算
lastNum := remainQuantity
//过期时间
if ext.ExpirateHour <= 0 {
mainOrder.Child[index].ExpireTime = time.Now().AddDate(10, 0, 0)
} else {
mainOrder.Child[index].ExpireTime = time.Now().Add(time.Hour * time.Duration(ext.ExpirateHour))
}
switch {
//加仓单
case mainOrder.Child[index].OrderType == 1 && mainOrder.Child[index].OrderCategory == 3:
var percentage decimal.Decimal
if mainOrder.Site == "BUY" {
percentage = decimal.NewFromInt(1).Sub(ext.PriceRatio.Div(decimal.NewFromInt(100)))
} else {
percentage = decimal.NewFromInt(1).Add(ext.PriceRatio.Div(decimal.NewFromInt(100)))
}
dataPrice := utility.StrToDecimal(mainOrder.Price).Mul(percentage).Truncate(int32(tradeSet.PriceDigit))
mainOrder.Child[index].Price = dataPrice.String()
if ext.AddPositionType == 1 {
buyPrice := utility.StrToDecimal(mainOrder.BuyPrice).Mul(utility.SafeDiv(ext.AddPositionVal, decimal.NewFromInt(100))).Truncate(2)
mainOrder.Child[index].Num = utility.SafeDiv(buyPrice, dataPrice).Truncate(int32(tradeSet.AmountDigit)).String()
} else {
mainOrder.Child[index].Num = utility.SafeDiv(ext.AddPositionVal.Truncate(2), dataPrice).Truncate(int32(tradeSet.AmountDigit)).String()
}
//加库存
lastNum = lastNum.Add(utility.StrToDecimal(mainOrder.Child[index].Num))
//todo 计算子订单
//减仓单
case mainOrder.Child[index].OrderType == 4:
// todo 计算
//减库存
lastNum = lastNum.Add(utility.StrToDecimal(mainOrder.Child[index].Num))
//todo 计算子订单
}
}
}
return nil