1撤销限价后 市价分单
This commit is contained in:
54
services/binanceservice/futures_callback.go
Normal file
54
services/binanceservice/futures_callback.go
Normal file
@ -0,0 +1,54 @@
|
||||
package binanceservice
|
||||
|
||||
import (
|
||||
"go-admin/app/admin/models"
|
||||
"go-admin/pkg/utility"
|
||||
"go-admin/services/cacheservice"
|
||||
"go-admin/services/positionservice"
|
||||
"time"
|
||||
|
||||
models2 "go-admin/models"
|
||||
|
||||
"github.com/go-admin-team/go-admin-core/logger"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// HandleMarketSliceTakeProfit
|
||||
// @Description: 限价拆分为市价后处理止盈止损
|
||||
func HandleMarketSliceTakeProfit(db *gorm.DB, orderCopy models.LinePreOrder, extOrderId int, apiUserInfo models.LineApiUser, tradeSet models2.TradeSet) {
|
||||
HandleNextFuturesReduce(db, apiUserInfo, orderCopy, tradeSet)
|
||||
|
||||
//延时执行
|
||||
time.AfterFunc(15*time.Second, func() {
|
||||
utility.SafeGo(func() {
|
||||
orderExt := models.LinePreOrderExt{}
|
||||
db.Model(&orderExt).Where("order_id =?", extOrderId).First(&orderExt)
|
||||
positionService := positionservice.BinancePositionManagement{}
|
||||
var side = ""
|
||||
|
||||
if orderCopy.OrderType != 0 {
|
||||
if orderCopy.Site == "BUY" {
|
||||
side = "SELL"
|
||||
} else {
|
||||
side = "BUY"
|
||||
}
|
||||
|
||||
} else {
|
||||
side = orderCopy.Site
|
||||
}
|
||||
|
||||
positionData, err := positionService.GetPosition(orderCopy.ApiId, orderCopy.SymbolType, orderCopy.ExchangeType, orderCopy.Symbol, side)
|
||||
|
||||
if err != nil {
|
||||
logger.Errorf("获取持仓信息失败,err:", err)
|
||||
} else {
|
||||
sysConfig := cacheservice.GetConfigCacheByKey(db, "market_take_profit_ratio")
|
||||
stopSysConfig := cacheservice.GetConfigCacheByKey(db, "market_stop_loss_ratio")
|
||||
marketTakeProfitRatio := utility.StrToDecimal(sysConfig.ConfigValue)
|
||||
marketStopLossRatio := utility.StrToDecimal(stopSysConfig.ConfigValue)
|
||||
|
||||
FutTakeProfit(db, &orderCopy, apiUserInfo, tradeSet, positionData, orderExt, marketTakeProfitRatio, marketStopLossRatio)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
@ -226,6 +226,11 @@ func GetAndReloadSymbols(data *map[string]models.TradeSet) error {
|
||||
tradeSet.MinBuyVal = utility.StringAsFloat(*filter.MinPrice)
|
||||
case "LOT_SIZE":
|
||||
tradeSet.AmountDigit = utility.GetPrecision(*filter.StepSize)
|
||||
tradeSet.MaxQty = utility.StringAsFloat(*filter.MaxQty)
|
||||
tradeSet.MinQty = utility.StringAsFloat(*filter.MinQty)
|
||||
case "MARKET_LOT_SIZE":
|
||||
tradeSet.MarketMaxQty = utility.StringAsFloat(*filter.MaxQty)
|
||||
tradeSet.MarketMinQty = utility.StringAsFloat(*filter.MinQty)
|
||||
case "MIN_NOTIONAL":
|
||||
tradeSet.MinNotional = *filter.Notional
|
||||
case "MAX_NOTIONAL":
|
||||
|
||||
@ -11,12 +11,14 @@ import (
|
||||
"go-admin/common/global"
|
||||
"go-admin/common/helper"
|
||||
models2 "go-admin/models"
|
||||
"go-admin/models/positiondto"
|
||||
"go-admin/pkg/utility"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/bytedance/sonic"
|
||||
"github.com/go-admin-team/go-admin-core/logger"
|
||||
log "github.com/go-admin-team/go-admin-core/logger"
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@ -148,26 +150,53 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
return
|
||||
}
|
||||
|
||||
positionData := savePosition(db, preOrder)
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.FutReducecCallback, preOrder.ApiId, preOrder.Symbol), 120, 20, 100*time.Millisecond)
|
||||
|
||||
if ok, err := lock.AcquireWait(context.Background()); err != nil {
|
||||
log.Error("获取锁失败", err)
|
||||
return
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
positionData := savePosition(db, preOrder)
|
||||
|
||||
//市价单就跳出 市价减仓不设止盈止损
|
||||
if preOrder.MainOrderType == "MARKET" {
|
||||
return
|
||||
}
|
||||
|
||||
//亏损大于0 重新计算比例
|
||||
FutTakeProfit(db, preOrder, apiUserInfo, tradeSet, positionData, orderExt, decimal.Zero, decimal.Zero)
|
||||
//处理下一个减仓
|
||||
HandleNextFuturesReduce(db, apiUserInfo, *preOrder, tradeSet)
|
||||
}
|
||||
}
|
||||
|
||||
// 减仓处理止盈止损
|
||||
func FutTakeProfit(db *gorm.DB, preOrder *DbModels.LinePreOrder, apiUserInfo DbModels.LineApiUser, tradeSet models2.TradeSet,
|
||||
positionData positiondto.PositionDto, orderExt DbModels.LinePreOrderExt, manualTakeRatio, manualStopRatio decimal.Decimal) bool {
|
||||
orders := make([]models.LinePreOrder, 0)
|
||||
if err := db.Model(&models.LinePreOrder{}).Where("pid =? AND order_type IN (1,2) AND status = 0", preOrder.Id).Find(&orders).Error; err != nil {
|
||||
logger.Errorf("handleMainReduceFilled 获取待触发订单失败,订单号:%s", preOrder.OrderSn)
|
||||
return
|
||||
return true
|
||||
}
|
||||
|
||||
totalNum := getFuturesPositionAvailableQuantity(db, apiUserInfo, preOrder, tradeSet)
|
||||
price := utility.StrToDecimal(preOrder.Price).Truncate(int32(tradeSet.PriceDigit))
|
||||
futApi := FutRestApi{}
|
||||
mainId := preOrder.Id
|
||||
|
||||
if preOrder.MainId > 0 {
|
||||
mainId = preOrder.MainId
|
||||
}
|
||||
|
||||
for _, v := range orders {
|
||||
if v.OrderType == 1 {
|
||||
//亏损大于0 重新计算比例
|
||||
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||
//手动设置百分比
|
||||
if manualTakeRatio.Cmp(decimal.Zero) > 0 {
|
||||
v.Rate = manualTakeRatio.String()
|
||||
percentag := manualTakeRatio.Div(decimal.NewFromInt(100))
|
||||
|
||||
if positionData.PositionSide == "LONG" {
|
||||
v.Price = price.Mul(decimal.NewFromInt(1).Add(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
} else {
|
||||
v.Price = price.Mul(decimal.NewFromInt(1).Sub(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
}
|
||||
} else if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||
percentag := positionData.TotalLoss.Div(totalNum).Div(price).Mul(decimal.NewFromInt(100))
|
||||
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
||||
v.Rate = percentag.String()
|
||||
@ -182,9 +211,32 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
|
||||
processFutTakeProfitOrder(db, futApi, v, totalNum)
|
||||
} else if v.OrderType == 2 {
|
||||
if manualStopRatio.Cmp(decimal.Zero) > 0 {
|
||||
v.Rate = manualStopRatio.String()
|
||||
percentag := manualStopRatio.Div(decimal.NewFromInt(100))
|
||||
|
||||
if positionData.PositionSide == "LONG" {
|
||||
v.Price = price.Mul(decimal.NewFromInt(1).Sub(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
} else {
|
||||
v.Price = price.Mul(decimal.NewFromInt(1).Add(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
}
|
||||
}
|
||||
processFutStopLossOrder(db, v, utility.StrToDecimal(v.Price), totalNum)
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// 处理下一个待触发
|
||||
func HandleNextFuturesReduce(db *gorm.DB, apiUserInfo DbModels.LineApiUser, preOrdedr DbModels.LinePreOrder, tradeSet models2.TradeSet) {
|
||||
mainId := preOrdedr.Id
|
||||
|
||||
if preOrdedr.MainId > 0 {
|
||||
mainId = preOrdedr.MainId
|
||||
}
|
||||
|
||||
totalNum := getFuturesPositionAvailableQuantity(db, apiUserInfo, &preOrdedr, tradeSet)
|
||||
nextFuturesReduceTrigger(db, mainId, totalNum, tradeSet)
|
||||
}
|
||||
|
||||
@ -307,7 +359,7 @@ func handleClosePosition(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
|
||||
if apiUserInfo.Id > 0 {
|
||||
mainIds := []int{preOrder.MainId}
|
||||
if err := cancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, false); err != nil {
|
||||
if err := CancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, false); err != nil {
|
||||
logger.Errorf("平仓单成功 取消其它订单失败 订单号:%s:", err)
|
||||
}
|
||||
}
|
||||
@ -328,7 +380,7 @@ func handleStopLoss(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
|
||||
if apiUserInfo.Id > 0 {
|
||||
mainIds := []int{preOrder.MainId}
|
||||
if err := cancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, false); err != nil {
|
||||
if err := CancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, false); err != nil {
|
||||
logger.Errorf("止损单成功 取消其它订单失败 订单号:%s:", err)
|
||||
}
|
||||
}
|
||||
@ -356,7 +408,7 @@ func handleTakeProfit(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
|
||||
if apiUserInfo.Id > 0 {
|
||||
mainIds := []int{preOrder.MainId}
|
||||
if err := cancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, false); err != nil {
|
||||
if err := CancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, false); err != nil {
|
||||
logger.Errorf("止损单成功 取消其它订单失败 订单号:%s:", err)
|
||||
}
|
||||
}
|
||||
@ -508,7 +560,7 @@ func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder, extOrd
|
||||
switch order.OrderType {
|
||||
case 1: // 止盈
|
||||
//亏损大于0 重新计算比例
|
||||
if first && positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||
if first && positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 && preOrder.SignPriceType != "mixture" {
|
||||
percentag := positionData.TotalLoss.Div(num).Div(price).Mul(decimal.NewFromInt(100))
|
||||
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
||||
order.Rate = percentag.String()
|
||||
@ -591,14 +643,14 @@ func cancelPositionOtherOrders(apiUserInfo DbModels.LineApiUser, db *gorm.DB, pr
|
||||
|
||||
// 批量取消订单
|
||||
|
||||
err = cancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, changeMainOrderStatus)
|
||||
err = CancelMainOrders(mainIds, db, apiUserInfo, preOrder.Symbol, changeMainOrderStatus)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// 根据mainid 取消订单
|
||||
// @changeMainOrderStatus 是否更新主单状态
|
||||
func cancelMainOrders(mainIds []int, db *gorm.DB, apiUserInfo DbModels.LineApiUser, symbol string, changeMainOrderStatus bool) error {
|
||||
func CancelMainOrders(mainIds []int, db *gorm.DB, apiUserInfo DbModels.LineApiUser, symbol string, changeMainOrderStatus bool) error {
|
||||
if len(mainIds) > 0 {
|
||||
orderSns, err := GetOpenOrderSns(db, mainIds)
|
||||
if err != nil {
|
||||
|
||||
63
services/binanceservice/spot_callback.go
Normal file
63
services/binanceservice/spot_callback.go
Normal file
@ -0,0 +1,63 @@
|
||||
package binanceservice
|
||||
|
||||
import (
|
||||
"go-admin/app/admin/models"
|
||||
models2 "go-admin/models"
|
||||
"go-admin/pkg/utility"
|
||||
"go-admin/services/cacheservice"
|
||||
"go-admin/services/positionservice"
|
||||
"time"
|
||||
|
||||
"github.com/go-admin-team/go-admin-core/logger"
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// HandleMarketSliceTakeProfit
|
||||
// @Description: 限价拆分为市价后处理止盈止损
|
||||
func HandleSpotMarketSliceTakeProfit(db *gorm.DB, orderCopy models.LinePreOrder, extOrderId int, apiUserInfo models.LineApiUser, tradeSet models2.TradeSet) {
|
||||
mainId := orderCopy.Id
|
||||
|
||||
if orderCopy.MainId > 0 {
|
||||
mainId = orderCopy.MainId
|
||||
}
|
||||
totalNum := getSpotPositionAvailableQuantity(db, apiUserInfo, &orderCopy, tradeSet) //getSpotTotalNum(apiUserInfo, preOrder, tradeSet)
|
||||
totalNum = totalNum.Mul(decimal.NewFromFloat(0.998)).Truncate(int32(tradeSet.AmountDigit))
|
||||
nextSpotReduceTrigger(db, mainId, totalNum, tradeSet)
|
||||
|
||||
//延时执行
|
||||
time.AfterFunc(15*time.Second, func() {
|
||||
utility.SafeGo(func() {
|
||||
orderExt := models.LinePreOrderExt{}
|
||||
db.Model(&orderExt).Where("order_id =?", extOrderId).First(&orderExt)
|
||||
positionService := positionservice.BinancePositionManagement{}
|
||||
var side = ""
|
||||
|
||||
if orderCopy.OrderType != 0 {
|
||||
if orderCopy.Site == "BUY" {
|
||||
side = "SELL"
|
||||
} else {
|
||||
side = "BUY"
|
||||
}
|
||||
|
||||
} else {
|
||||
side = orderCopy.Site
|
||||
}
|
||||
|
||||
positionData, err := positionService.GetPosition(orderCopy.ApiId, orderCopy.SymbolType, orderCopy.ExchangeType, orderCopy.Symbol, side)
|
||||
|
||||
if err != nil {
|
||||
logger.Errorf("获取持仓信息失败,err:", err)
|
||||
} else {
|
||||
sysConfig := cacheservice.GetConfigCacheByKey(db, "market_take_profit_ratio")
|
||||
stopSysConfig := cacheservice.GetConfigCacheByKey(db, "market_stop_loss_ratio")
|
||||
marketTakeProfitRatio := utility.StrToDecimal(sysConfig.ConfigValue)
|
||||
marketStopLossRatio := utility.StrToDecimal(stopSysConfig.ConfigValue)
|
||||
totalNum := getSpotPositionAvailableQuantity(db, apiUserInfo, &orderCopy, tradeSet) //getSpotTotalNum(apiUserInfo, preOrder, tradeSet)
|
||||
totalNum = totalNum.Mul(decimal.NewFromFloat(0.998)).Truncate(int32(tradeSet.AmountDigit))
|
||||
|
||||
SpotTakeProfit(db, &orderCopy, totalNum, positionData, orderExt, tradeSet, marketTakeProfitRatio, marketStopLossRatio)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
@ -20,6 +20,7 @@ import (
|
||||
|
||||
"github.com/bytedance/sonic"
|
||||
"github.com/go-admin-team/go-admin-core/logger"
|
||||
log "github.com/go-admin-team/go-admin-core/logger"
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
@ -173,34 +174,60 @@ func handleMainReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
|
||||
orderExt := models.LinePreOrderExt{}
|
||||
positionData := savePosition(db, preOrder)
|
||||
orders := make([]models.LinePreOrder, 0)
|
||||
// rate := utility.StringAsFloat(preOrder.Rate)
|
||||
|
||||
if err := db.Model(&DbModels.LinePreOrderStatus{}).Where("order_id =? ", preOrder.MainId).Update("reduce_status", 1).Error; err != nil {
|
||||
logger.Errorf("handleMainReduceFilled 更新主单减仓状态失败,订单号:%s", preOrder.OrderSn)
|
||||
}
|
||||
db.Model(&orderExt).Where("order_id =?", preOrder.Id).Find(&orderExt)
|
||||
|
||||
// 100%减仓 终止流程
|
||||
if orderExt.AddPositionVal.Cmp(decimal.NewFromInt(100)) >= 0 {
|
||||
//缓存
|
||||
removeSpotLossAndAddPosition(preOrder.MainId, preOrder.OrderSn)
|
||||
removePosition(db, preOrder)
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.SpotReduceCallback, preOrder.ApiId, preOrder.Symbol), 120, 20, 100*time.Millisecond)
|
||||
|
||||
ids := []int{preOrder.MainId, preOrder.Pid}
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("id IN ? AND status =6", ids).Update("status", 9).Error; err != nil {
|
||||
logger.Info("100%减仓完毕,终结流程")
|
||||
}
|
||||
if ok, err := lock.AcquireWait(context.Background()); err != nil {
|
||||
log.Error("获取锁失败", err)
|
||||
return
|
||||
}
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
// 100%减仓 终止流程
|
||||
if orderExt.AddPositionVal.Cmp(decimal.NewFromInt(100)) >= 0 {
|
||||
//缓存
|
||||
removeSpotLossAndAddPosition(preOrder.MainId, preOrder.OrderSn)
|
||||
removePosition(db, preOrder)
|
||||
|
||||
totalNum := getSpotPositionAvailableQuantity(db, apiUserInfo, preOrder, tradeSet) //getSpotTotalNum(apiUserInfo, preOrder, tradeSet)
|
||||
totalNum = totalNum.Mul(decimal.NewFromFloat(0.998)).Truncate(int32(tradeSet.AmountDigit))
|
||||
ids := []int{preOrder.MainId, preOrder.Pid}
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("id IN ? AND status =6", ids).Update("status", 9).Error; err != nil {
|
||||
logger.Info("100%减仓完毕,终结流程")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//市价单跳出
|
||||
if preOrder.MainOrderType == "MARKET" {
|
||||
return
|
||||
}
|
||||
|
||||
totalNum := getSpotPositionAvailableQuantity(db, apiUserInfo, preOrder, tradeSet) //getSpotTotalNum(apiUserInfo, preOrder, tradeSet)
|
||||
totalNum = totalNum.Mul(decimal.NewFromFloat(0.998)).Truncate(int32(tradeSet.AmountDigit))
|
||||
//亏损大于0 重新计算比例
|
||||
SpotTakeProfit(db, preOrder, totalNum, positionData, orderExt, tradeSet, decimal.Zero, decimal.Zero)
|
||||
|
||||
mainId := preOrder.Id
|
||||
|
||||
if preOrder.MainId > 0 {
|
||||
mainId = preOrder.MainId
|
||||
}
|
||||
|
||||
nextSpotReduceTrigger(db, mainId, totalNum, tradeSet)
|
||||
}
|
||||
}
|
||||
|
||||
func SpotTakeProfit(db *gorm.DB, preOrder *DbModels.LinePreOrder, totalNum decimal.Decimal,
|
||||
positionData positiondto.PositionDto, orderExt DbModels.LinePreOrderExt, tradeSet models2.TradeSet, manualTakeRatio, manualStopRatio decimal.Decimal) bool {
|
||||
price := utility.StrToDecimal(preOrder.Price)
|
||||
orders := make([]models.LinePreOrder, 0)
|
||||
|
||||
if err := db.Model(&models.LinePreOrder{}).Where("pid =? AND order_type IN (1,2) AND status=0", preOrder.Id).Find(&orders).Error; err != nil {
|
||||
logger.Errorf("获取减仓单止盈止损失败 err:%v", err)
|
||||
return
|
||||
return true
|
||||
}
|
||||
|
||||
spotApi := SpotRestApi{}
|
||||
@ -209,8 +236,17 @@ func handleMainReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
orders[index].Num = totalNum.String()
|
||||
|
||||
if orders[index].OrderType == 1 {
|
||||
//亏损大于0 重新计算比例
|
||||
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||
//手动设置百分比
|
||||
if manualTakeRatio.Cmp(decimal.Zero) > 0 {
|
||||
orders[index].Rate = manualTakeRatio.String()
|
||||
percentag := manualTakeRatio.Div(decimal.NewFromInt(100))
|
||||
|
||||
if positionData.PositionSide == "LONG" {
|
||||
orders[index].Price = price.Mul(decimal.NewFromInt(1).Add(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
} else {
|
||||
orders[index].Price = price.Mul(decimal.NewFromInt(1).Sub(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
}
|
||||
} else if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||
percentag := positionData.TotalLoss.Div(totalNum).Div(price).Mul(decimal.NewFromInt(100))
|
||||
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
||||
orders[index].Rate = percentag.String()
|
||||
@ -220,17 +256,20 @@ func handleMainReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
|
||||
processTakeProfitOrder(db, spotApi, orders[index])
|
||||
} else if orders[index].OrderType == 2 {
|
||||
if manualStopRatio.Cmp(decimal.Zero) > 0 {
|
||||
orders[index].Rate = manualStopRatio.String()
|
||||
percentag := manualStopRatio.Div(decimal.NewFromInt(100))
|
||||
|
||||
if positionData.PositionSide == "LONG" {
|
||||
orders[index].Price = price.Mul(decimal.NewFromInt(1).Sub(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
} else {
|
||||
orders[index].Price = price.Mul(decimal.NewFromInt(1).Add(percentag)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
}
|
||||
}
|
||||
processStopLossOrder(orders[index])
|
||||
}
|
||||
}
|
||||
|
||||
mainId := preOrder.Id
|
||||
|
||||
if preOrder.MainId > 0 {
|
||||
mainId = preOrder.MainId
|
||||
}
|
||||
|
||||
nextSpotReduceTrigger(db, mainId, totalNum, tradeSet)
|
||||
return false
|
||||
}
|
||||
|
||||
// 缓存下一个减仓单
|
||||
@ -751,7 +790,7 @@ func processTakeProfitAndStopLossOrders(db *gorm.DB, preOrder *models.LinePreOrd
|
||||
switch order.OrderType {
|
||||
case 1: // 止盈
|
||||
//亏损大于0 重新计算比例
|
||||
if fist && positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||
if fist && positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 && preOrder.SignPriceType != "mixture" {
|
||||
percentag := positionData.TotalLoss.Div(num).Div(price).Mul(decimal.NewFromInt(100))
|
||||
|
||||
if fist {
|
||||
|
||||
@ -43,6 +43,9 @@ func GetSpotSymbols() (map[string]models.TradeSet, []string, error) {
|
||||
tradeSet.AmountDigit = utility.GetPrecision(filter.StepSize)
|
||||
tradeSet.MinQty = utility.StringAsFloat(filter.MinQty)
|
||||
tradeSet.MaxQty = utility.StringAsFloat(filter.MaxQty)
|
||||
case "MARKET_LOT_SIZE":
|
||||
tradeSet.MarketMinQty = utility.StringAsFloat(filter.MinQty)
|
||||
tradeSet.MarketMinQty = utility.StringAsFloat(filter.MaxQty)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
61
services/cacheservice/config_service.go
Normal file
61
services/cacheservice/config_service.go
Normal file
@ -0,0 +1,61 @@
|
||||
package cacheservice
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go-admin/app/admin/models"
|
||||
"go-admin/common/const/rediskey"
|
||||
"go-admin/common/helper"
|
||||
|
||||
"github.com/bytedance/sonic"
|
||||
"github.com/go-admin-team/go-admin-core/logger"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// 加载config缓存
|
||||
func InitConfigCache(db *gorm.DB) {
|
||||
datas := []models.SysConfig{}
|
||||
db.Model(&models.SysConfig{}).Find(&datas)
|
||||
for _, item := range datas {
|
||||
cacheKey := fmt.Sprintf(rediskey.SysConfigKey, item.ConfigKey)
|
||||
|
||||
content, err := sonic.Marshal(item)
|
||||
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
continue
|
||||
}
|
||||
|
||||
if len(content) > 0 {
|
||||
helper.DefaultRedis.SetString(cacheKey, item.ConfigValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取 sys config缓存
|
||||
func GetConfigCacheByKey(db *gorm.DB, key string) models.SysConfig {
|
||||
cacheKey := fmt.Sprintf(rediskey.SysConfigKey, key)
|
||||
val, _ := helper.DefaultRedis.GetString(key)
|
||||
result := models.SysConfig{}
|
||||
|
||||
if val == "" {
|
||||
sonic.Unmarshal([]byte(val), &result)
|
||||
}
|
||||
|
||||
if result.Id == 0 {
|
||||
if err := db.Model(&result).Where("config_key = ?", key).First(&result).Error; err != nil {
|
||||
logger.Errorf("GetConfigCacheByKey %s", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
if result.Id > 0 {
|
||||
content, err := sonic.Marshal(result)
|
||||
|
||||
if err != nil {
|
||||
logger.Errorf("GetConfigCacheByKey %s", err.Error())
|
||||
} else {
|
||||
helper.DefaultRedis.SetString(cacheKey, string(content))
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user