1、
This commit is contained in:
@ -145,6 +145,8 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
}
|
||||
// rate := utility.StringAsFloat(orderExt.AddPositionVal)
|
||||
|
||||
//取消委托中的止盈止损
|
||||
cancelTakeProfitByReduce(db, apiUserInfo, preOrder.Symbol, preOrder.MainId, preOrder.SymbolType)
|
||||
// 100%减仓 终止流程
|
||||
if orderExt.AddPositionVal.Cmp(decimal.NewFromInt(100)) >= 0 {
|
||||
//缓存
|
||||
@ -158,8 +160,6 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
return
|
||||
}
|
||||
|
||||
//取消委托中的止盈止损
|
||||
cancelTakeProfitByReduce(db, apiUserInfo, preOrder.Symbol, preOrder.MainId, preOrder.SymbolType)
|
||||
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 {
|
||||
|
||||
@ -165,7 +165,7 @@ func (e *BinanceStrategyOrderService) TriggerOrder(order dto.StrategyOrderRedisL
|
||||
return errors.New("最新成交价小于等于0")
|
||||
}
|
||||
|
||||
var mainOrder models.LinePreOrder
|
||||
mainOrder := models.LinePreOrder{}
|
||||
|
||||
for _, v := range orders {
|
||||
if v.MainId == 0 {
|
||||
@ -176,6 +176,12 @@ func (e *BinanceStrategyOrderService) TriggerOrder(order dto.StrategyOrderRedisL
|
||||
|
||||
GetOrderByPid(&mainOrder, orders, mainOrder.Id)
|
||||
|
||||
e.RecalculateOrder(tradeSet, &mainOrder, setting)
|
||||
|
||||
if err := e.Orm.Save(&mainOrder).Error; err != nil {
|
||||
e.Log.Errorf("order_id:%d 波段触发保存委托单失败:%s", mainOrder.Id, err.Error())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -265,19 +271,93 @@ func (e *BinanceStrategyOrderService) RecalculateOrder(tradeSet models2.TradeSet
|
||||
|
||||
//加库存
|
||||
lastNum = lastNum.Add(utility.StrToDecimal(mainOrder.Child[index].Num))
|
||||
//todo 计算子订单
|
||||
// 计算子订单
|
||||
if len(mainOrder.Child[index].Child) > 0 {
|
||||
calculateChildOrder(&mainOrder.Child, &tradeSet, ext, lastNum, dataPrice, false)
|
||||
}
|
||||
//减仓单
|
||||
case mainOrder.Child[index].OrderType == 4:
|
||||
// todo 计算
|
||||
percentage := decimal.NewFromInt(1)
|
||||
|
||||
if mainOrder.Site == "BUY" && ext.PriceRatio.Cmp(decimal.Zero) > 0 {
|
||||
percentage = decimal.NewFromInt(1).Sub(ext.PriceRatio.Div(decimal.NewFromInt(100)))
|
||||
} else if ext.PriceRatio.Cmp(decimal.Zero) > 0 {
|
||||
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 {
|
||||
mainOrder.Child[index].Num = lastNum.Mul(ext.AddPositionVal.Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit)).String()
|
||||
|
||||
} else {
|
||||
logger.Error("减仓不能是固定数值")
|
||||
}
|
||||
|
||||
//减库存
|
||||
lastNum = lastNum.Add(utility.StrToDecimal(mainOrder.Child[index].Num))
|
||||
//todo 计算子订单
|
||||
lastNum = lastNum.Sub(utility.StrToDecimal(mainOrder.Child[index].Num))
|
||||
// 计算子订单
|
||||
if len(mainOrder.Child[index].Child) > 0 {
|
||||
calculateChildOrder(&mainOrder.Child, &tradeSet, ext, lastNum, dataPrice, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 计算子订单信息
|
||||
// isTpTp 是否是止盈后止损止盈
|
||||
func calculateChildOrder(orders *[]models.LinePreOrder, tradeSet *models2.TradeSet, ext models.LinePreOrderExt, lastNum decimal.Decimal, price decimal.Decimal, isTpTp bool) error {
|
||||
for index := range *orders {
|
||||
orderQuantity := lastNum.Truncate(int32(tradeSet.AmountDigit))
|
||||
percentage := decimal.NewFromInt(1)
|
||||
var addPercentage decimal.Decimal
|
||||
|
||||
switch {
|
||||
//止盈
|
||||
case !isTpTp && (*orders)[index].OrderType == 1:
|
||||
addPercentage = ext.TakeProfitRatio
|
||||
if ext.TakeProfitNumRatio.Cmp(decimal.Zero) > 0 {
|
||||
orderQuantity = lastNum.Mul(ext.TakeProfitNumRatio.Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit))
|
||||
}
|
||||
//止损
|
||||
case !isTpTp && (*orders)[index].OrderType == 2:
|
||||
addPercentage = ext.StopLossRatio
|
||||
//止盈后止盈
|
||||
case isTpTp && (*orders)[index].OrderType == 1:
|
||||
addPercentage = ext.TpTpPriceRatio
|
||||
//止盈后止损
|
||||
case isTpTp && (*orders)[index].OrderType == 2:
|
||||
addPercentage = ext.TpSlPriceRatio
|
||||
}
|
||||
|
||||
switch {
|
||||
//做多止盈、做空止损
|
||||
case (*orders)[index].OrderType == 1 && (*orders)[index].Site == "SELL", (*orders)[index].OrderType == 2 && (*orders)[index].Site == "BUY":
|
||||
percentage = decimal.NewFromInt(100).Add(addPercentage).Div(decimal.NewFromInt(100))
|
||||
|
||||
//做多止损、做空止盈
|
||||
case (*orders)[index].OrderType == 2 && (*orders)[index].Site == "SELL", (*orders)[index].OrderType == 1 && (*orders)[index].Site == "BUY":
|
||||
percentage = decimal.NewFromInt(100).Sub(addPercentage).Div(decimal.NewFromInt(100))
|
||||
}
|
||||
|
||||
orderPrice := price.Mul(percentage).Truncate(int32(tradeSet.PriceDigit))
|
||||
(*orders)[index].Price = orderPrice.String()
|
||||
(*orders)[index].Num = orderQuantity.String()
|
||||
lastOrderQuantity := lastNum.Sub(orderQuantity).Truncate(int32(tradeSet.AmountDigit))
|
||||
|
||||
//止盈后止盈、止盈后止损
|
||||
if len((*orders)[index].Child) > 0 && lastOrderQuantity.Cmp(decimal.Zero) > 0 {
|
||||
calculateChildOrder(&(*orders)[index].Child, tradeSet, ext, lastOrderQuantity, orderPrice, true)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 递归订单树
|
||||
func GetOrderByPid(order *models.LinePreOrder, orders []models.LinePreOrder, pid int) {
|
||||
for _, v := range orders {
|
||||
|
||||
Reference in New Issue
Block a user