1
This commit is contained in:
@ -37,7 +37,7 @@ func ChangeSpotOrder(mapData map[string]interface{}) {
|
||||
return
|
||||
}
|
||||
|
||||
if originOrderSn != "" {
|
||||
if originOrderSn != nil && originOrderSn != "" {
|
||||
orderSn = originOrderSn
|
||||
}
|
||||
|
||||
@ -177,7 +177,7 @@ func handleMainReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
takeProfitOrder.Id = 0
|
||||
takeProfitOrder.OrderSn = utility.Int64ToString(snowflakehelper.GetOrderId())
|
||||
takeProfitOrder.Status = 0
|
||||
takeProfitOrder.Price = price.Mul(decimal.NewFromInt(1).Add(ext.TakeProfitRatio)).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
takeProfitOrder.Price = price.Mul(decimal.NewFromInt(1).Add(ext.TakeProfitRatio.Div(decimal.NewFromInt(100)))).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
takeProfitOrder.OrderType = 1
|
||||
takeProfitOrder.Rate = "100"
|
||||
takeProfitOrder.SignPrice = preOrder.Price
|
||||
@ -462,9 +462,9 @@ func handleMainOrderFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
var percentage decimal.Decimal
|
||||
|
||||
if data.Site == "BUY" {
|
||||
percentage = decimal.NewFromInt(1).Add(v.AddPositionPriceRatio)
|
||||
percentage = decimal.NewFromInt(1).Add(v.AddPositionPriceRatio.Div(decimal.NewFromInt(100)))
|
||||
} else {
|
||||
percentage = decimal.NewFromInt(1).Sub(v.AddPositionPriceRatio)
|
||||
percentage = decimal.NewFromInt(1).Sub(v.AddPositionPriceRatio.Div(decimal.NewFromInt(100)))
|
||||
}
|
||||
data.Price = price.Mul(percentage).Truncate(int32(tradeSet.PriceDigit)).String()
|
||||
|
||||
@ -563,13 +563,26 @@ func processTakeProfitAndStopLossOrders(db *gorm.DB, preOrder *models.LinePreOrd
|
||||
return
|
||||
}
|
||||
|
||||
apiInfo, err := GetApiInfo(preOrder.ApiId)
|
||||
if apiInfo.Id == 0 {
|
||||
logger.Error("订单回调查询apiuserinfo失败 err:", err)
|
||||
return
|
||||
}
|
||||
|
||||
num, err := getSpotPositionNum(apiInfo, preOrder, tradeSet)
|
||||
|
||||
if err != nil {
|
||||
logger.Error("订单回调查询持仓数量失败:", err)
|
||||
num = utility.StrToDecimal(preOrder.Num)
|
||||
}
|
||||
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).
|
||||
Where("pid = ? AND order_category = 1 AND order_type > 0 AND status = '0' ", preOrder.Id).
|
||||
Find(&orders).Error; err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
logger.Error("订单回调查询止盈止损单失败:", err)
|
||||
return
|
||||
} else if len(orders) == 0 && preOrder.OrderCategory == 3 {
|
||||
orders, err = makeSpotTakeAndReduce(preOrder, db, tradeSet, orders)
|
||||
orders, err = makeSpotTakeAndReduce(preOrder, db, tradeSet, orders, num)
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
@ -577,52 +590,49 @@ func processTakeProfitAndStopLossOrders(db *gorm.DB, preOrder *models.LinePreOrd
|
||||
}
|
||||
|
||||
spotApi := SpotRestApi{}
|
||||
num, _ := decimal.NewFromString(preOrder.Num)
|
||||
|
||||
for i, order := range orders {
|
||||
if i >= 2 { // 最多处理 2 个订单
|
||||
break
|
||||
}
|
||||
|
||||
if err := db.Model(&order).Update("num", num).Error; err != nil {
|
||||
order.Num = num.Mul(decimal.NewFromFloat(0.998)).Truncate(int32(tradeSet.AmountDigit)).String()
|
||||
|
||||
if order.OrderType == 4 {
|
||||
ext := DbModels.LinePreOrderExt{}
|
||||
db.Model(&ext).Where("order_id=?", preOrder.Id).Find(&ext)
|
||||
|
||||
if ext.ReduceNumRatio.Cmp(decimal.Zero) > 0 {
|
||||
order.Num = num.Mul(ext.ReduceNumRatio.Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit)).String()
|
||||
}
|
||||
}
|
||||
|
||||
if err := db.Model(&order).Update("num", order.Num).Error; err != nil {
|
||||
logger.Errorf("修改止盈止损数量失败 订单号:%s err:%v", order.OrderSn, err)
|
||||
}
|
||||
|
||||
switch order.OrderType {
|
||||
case 1: // 止盈
|
||||
processTakeProfitOrder(db, spotApi, order, num)
|
||||
processTakeProfitOrder(db, spotApi, order)
|
||||
case 2: // 止损
|
||||
processStopLossOrder(order)
|
||||
case 4: //减仓
|
||||
processSpotReduceOrder(order, num)
|
||||
|
||||
processSpotReduceOrder(order)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 构建现货止盈、减仓单
|
||||
func makeSpotTakeAndReduce(preOrder *DbModels.LinePreOrder, db *gorm.DB, tradeSet models2.TradeSet, orders []DbModels.LinePreOrder) ([]DbModels.LinePreOrder, error) {
|
||||
func makeSpotTakeAndReduce(preOrder *DbModels.LinePreOrder, db *gorm.DB, tradeSet models2.TradeSet, orders []DbModels.LinePreOrder, num decimal.Decimal) ([]DbModels.LinePreOrder, error) {
|
||||
ext := models.LinePreOrderExt{}
|
||||
apiInfo, err := GetApiInfo(preOrder.ApiId)
|
||||
price := utility.StrToDecimal(preOrder.Price)
|
||||
|
||||
if apiInfo.Id == 0 {
|
||||
logger.Error("订单回调查询apiuserinfo失败 err:", err)
|
||||
return nil, errors.New("订单回调查询apiuserinfo失败")
|
||||
}
|
||||
|
||||
if err := db.Model(&ext).Where("order_id = ?", preOrder.Id).First(&ext).Error; err != nil {
|
||||
logger.Error("订单回调查询止盈止损单扩展表失败:", err)
|
||||
return nil, errors.New("订单回调查询止盈止损单扩展表失败")
|
||||
}
|
||||
|
||||
totalLossAmountU, _ := GetTotalLossAmount(db, preOrder.MainId)
|
||||
num, err := getSpotPositionNum(apiInfo, preOrder, tradeSet)
|
||||
|
||||
if err != nil {
|
||||
logger.Error("订单回调查询持仓数量失败:", err)
|
||||
return nil, errors.New("订单回调查询持仓数量失败")
|
||||
}
|
||||
|
||||
//止盈单
|
||||
if ext.TakeProfitRatio.Cmp(decimal.Zero) > 0 {
|
||||
@ -658,7 +668,12 @@ func makeSpotTakeAndReduce(preOrder *DbModels.LinePreOrder, db *gorm.DB, tradeSe
|
||||
stopOrder.OrderType = 4
|
||||
stopOrder.Status = 0
|
||||
stopOrder.Rate = ext.ReducePriceRatio.String()
|
||||
stopOrder.Num = num.String()
|
||||
|
||||
if ext.ReduceNumRatio.Cmp(decimal.Zero) > 0 {
|
||||
stopOrder.Num = num.Mul(ext.ReduceNumRatio.Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit)).String()
|
||||
} else {
|
||||
stopOrder.Num = num.String()
|
||||
}
|
||||
|
||||
orders = append(orders, stopOrder)
|
||||
}
|
||||
@ -683,7 +698,7 @@ func makeSpotTakeAndReduce(preOrder *DbModels.LinePreOrder, db *gorm.DB, tradeSe
|
||||
}
|
||||
|
||||
// 现货减仓
|
||||
func processSpotReduceOrder(preOrder DbModels.LinePreOrder, num decimal.Decimal) {
|
||||
func processSpotReduceOrder(preOrder DbModels.LinePreOrder) {
|
||||
key := fmt.Sprintf(rediskey.SpotReduceList, global.EXCHANGE_BINANCE)
|
||||
item := ReduceListItem{
|
||||
Id: preOrder.Id,
|
||||
@ -691,7 +706,7 @@ func processSpotReduceOrder(preOrder DbModels.LinePreOrder, num decimal.Decimal)
|
||||
Pid: preOrder.Pid,
|
||||
MainId: preOrder.MainId,
|
||||
Price: utility.StrToDecimal(preOrder.Price),
|
||||
Num: num,
|
||||
Num: utility.StrToDecimal(preOrder.Num),
|
||||
Side: preOrder.Site,
|
||||
Symbol: preOrder.Symbol,
|
||||
OrderSn: preOrder.OrderSn,
|
||||
@ -711,7 +726,7 @@ func processSpotReduceOrder(preOrder DbModels.LinePreOrder, num decimal.Decimal)
|
||||
}
|
||||
|
||||
// 处理止盈订单
|
||||
func processTakeProfitOrder(db *gorm.DB, spotApi SpotRestApi, order models.LinePreOrder, num decimal.Decimal) {
|
||||
func processTakeProfitOrder(db *gorm.DB, spotApi SpotRestApi, order models.LinePreOrder) {
|
||||
tradeSet, _ := GetTradeSet(order.Symbol, 0)
|
||||
|
||||
if tradeSet.Coin == "" {
|
||||
@ -726,7 +741,7 @@ func processTakeProfitOrder(db *gorm.DB, spotApi SpotRestApi, order models.LineP
|
||||
Symbol: order.Symbol,
|
||||
Side: order.Site,
|
||||
Price: price.Truncate(int32(tradeSet.PriceDigit)),
|
||||
Quantity: num.Truncate(int32(tradeSet.AmountDigit)),
|
||||
Quantity: utility.StrToDecimal(order.Num),
|
||||
Type: "TAKE_PROFIT_LIMIT",
|
||||
TimeInForce: "GTC",
|
||||
StopPrice: price.Truncate(int32(tradeSet.PriceDigit)),
|
||||
@ -757,7 +772,7 @@ func processTakeProfitOrder(db *gorm.DB, spotApi SpotRestApi, order models.LineP
|
||||
}
|
||||
} else {
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("id = ? and status ='0'", order.Id).
|
||||
Updates(map[string]interface{}{"status": "1", "num": num.String()}).Error; err != nil {
|
||||
Updates(map[string]interface{}{"status": "1", "num": order.Num}).Error; err != nil {
|
||||
logger.Error("现货止盈下单成功,更新状态失败:", order.OrderSn, " err:", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user