109 lines
3.4 KiB
Go
109 lines
3.4 KiB
Go
|
|
package orderservice
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"go-admin/app/admin/models"
|
|||
|
|
"go-admin/app/admin/service/dto"
|
|||
|
|
"go-admin/pkg/utility"
|
|||
|
|
"go-admin/pkg/utility/snowflakehelper"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"github.com/go-admin-team/go-admin-core/sdk/service"
|
|||
|
|
"github.com/jinzhu/copier"
|
|||
|
|
"github.com/shopspring/decimal"
|
|||
|
|
"gorm.io/gorm"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type OrderService struct {
|
|||
|
|
service.Service
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建减仓后减仓单
|
|||
|
|
func (e *OrderService) CreateReduceReduceOrder(db *gorm.DB, pid int, price, num decimal.Decimal, priceDigit int) (models.LinePreOrder, error) {
|
|||
|
|
var preOrder models.LinePreOrder
|
|||
|
|
var result models.LinePreOrder
|
|||
|
|
var ext models.LinePreOrderExt
|
|||
|
|
|
|||
|
|
if err := db.Model(&models.LinePreOrder{}).Preload("Childs").Where("id =? ", pid).First(&preOrder).Error; err != nil {
|
|||
|
|
return preOrder, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := db.Model(&models.LinePreOrderExt{}).Where("order_id =? ", pid).Find(&ext).Error; err != nil {
|
|||
|
|
return preOrder, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
copier.Copy(&result, &preOrder)
|
|||
|
|
|
|||
|
|
result.Id = 0
|
|||
|
|
result.OrderSn = utility.Int64ToString(snowflakehelper.GetOrderId())
|
|||
|
|
result.Status = 0
|
|||
|
|
result.CreatedAt = time.Now()
|
|||
|
|
result.TriggerTime = nil
|
|||
|
|
result.UpdatedAt = time.Now()
|
|||
|
|
result.BuyPrice = decimal.Zero.String()
|
|||
|
|
result.Price = price.String()
|
|||
|
|
result.Num = num.String()
|
|||
|
|
result.ReduceOrderId = preOrder.Id
|
|||
|
|
|
|||
|
|
for index := range result.Childs {
|
|||
|
|
result.Childs[index].Id = 0
|
|||
|
|
result.Childs[index].OrderSn = utility.Int64ToString(snowflakehelper.GetOrderId())
|
|||
|
|
result.Childs[index].Status = 0
|
|||
|
|
result.Childs[index].CreatedAt = time.Now()
|
|||
|
|
result.Childs[index].TriggerTime = nil
|
|||
|
|
result.Childs[index].UpdatedAt = time.Now()
|
|||
|
|
result.Childs[index].BuyPrice = decimal.Zero.String()
|
|||
|
|
var pricePercent decimal.Decimal
|
|||
|
|
|
|||
|
|
if result.Childs[index].OrderType == 1 && ext.TakeProfitRatio.Cmp(decimal.Zero) > 0 {
|
|||
|
|
// 减仓单卖出
|
|||
|
|
if preOrder.Site == "SELL" {
|
|||
|
|
pricePercent = decimal.NewFromInt(100).Add(ext.TakeProfitRatio).Div(decimal.NewFromInt(100))
|
|||
|
|
} else {
|
|||
|
|
pricePercent = decimal.NewFromInt(100).Sub(ext.TakeProfitRatio).Div(decimal.NewFromInt(100))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} else if result.Childs[index].OrderType == 2 && ext.StopLossRatio.Cmp(decimal.Zero) > 0 {
|
|||
|
|
if preOrder.Site == "SELL" {
|
|||
|
|
pricePercent = decimal.NewFromInt(100).Sub(ext.StopLossRatio).Div(decimal.NewFromInt(100))
|
|||
|
|
} else {
|
|||
|
|
pricePercent = decimal.NewFromInt(100).Add(ext.StopLossRatio).Div(decimal.NewFromInt(100))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//重新计算止盈止损价
|
|||
|
|
if pricePercent.Cmp(decimal.Zero) > 0 {
|
|||
|
|
result.Childs[index].Price = price.Mul(pricePercent).Truncate(int32(priceDigit)).String()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := db.Create(&result).Error; err != nil {
|
|||
|
|
return result, fmt.Errorf("复制减仓单失败:pid:%d err:%v", pid, err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return result, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 触发主单失败
|
|||
|
|
func (e *OrderService) ErrorTrigger(preOrder *dto.PreOrderRedisList, errData string) error {
|
|||
|
|
// var cacheOrderKey string
|
|||
|
|
|
|||
|
|
// if preOrder.OrderType == 1 {
|
|||
|
|
// cacheOrderKey = fmt.Sprintf(rediskey.PreSpotOrderList, preOrder.ExchangeType)
|
|||
|
|
// } else {
|
|||
|
|
// cacheOrderKey = fmt.Sprintf(rediskey.PreFutOrderList, preOrder.ExchangeType)
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
if err := e.Orm.Model(&models.LinePreOrder{}).
|
|||
|
|
Where("id = ? and status =1", preOrder.Id).
|
|||
|
|
Updates(map[string]interface{}{
|
|||
|
|
"status": 2,
|
|||
|
|
"desc": errData,
|
|||
|
|
"trigger_time": time.Now(),
|
|||
|
|
}).Error; err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|