拆分加仓、减仓

This commit is contained in:
2025-03-07 16:48:55 +08:00
parent 126193df36
commit 0aa2ab7355
4 changed files with 303 additions and 89 deletions

View File

@ -100,6 +100,9 @@ func handleFutOrderByType(db *gorm.DB, preOrder *DbModels.LinePreOrder, orderSta
//减仓回调
case preOrder.OrderType == 4 && orderStatus == 6:
handleReduceFilled(db, preOrder)
//主单取消
case preOrder.OrderType == 0 && preOrder.Pid == 0 && orderStatus == 4:
handleMainOrderCancel(db, preOrder, 2)
//止损成交
case preOrder.OrderType == 2 && orderStatus == 6:
handleStopLoss(db, preOrder)
@ -154,6 +157,12 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
totalNum = totalNum.Truncate(int32(tradeSet.AmountDigit))
price := utility.StrToDecimal(preOrder.Price).Truncate(int32(tradeSet.PriceDigit))
futApi := FutRestApi{}
mainId := preOrder.Id
if preOrder.MainId > 0 {
mainId = preOrder.MainId
}
db.Model(&orderExt).Where("order_id =?", preOrder.Pid).First(&orderExt)
for _, v := range orders {
@ -177,39 +186,46 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
processFutStopLossOrder(db, v, utility.StrToDecimal(v.Price), totalNum)
}
}
nextFuturesReduceTrigger(db, mainId, totalNum, tradeSet)
}
//加仓待触发
addPositionOrder := DbModels.LinePreOrder{}
// 下一个合约待触发
func nextFuturesReduceTrigger(db *gorm.DB, mainId int, totalNum decimal.Decimal, tradeSet models2.TradeSet) {
nextOrder := DbModels.LinePreOrder{}
nextExt := DbModels.LinePreOrderExt{}
if err := db.Model(&addPositionOrder).Where("main_id =? AND order_category=3 AND status=0", preOrder.MainId).First(&addPositionOrder).Error; err != nil {
logger.Errorf("handleMainReduceFilled 获取加仓单失败,订单号:%s err:%v", preOrder.OrderSn, err)
if err := db.Model(&models.LinePreOrder{}).Where("main_id =? AND order_type =4 AND status=0", mainId).Order("rate asc").First(&nextOrder).Error; err != nil {
logger.Errorf("获取下一个单失败 err:%v", err)
return
}
keyFutAddpositionKey := fmt.Sprintf(rediskey.FuturesAddPositionList, global.EXCHANGE_BINANCE)
addPositionData := AddPositionList{
Id: addPositionOrder.Id,
OrderSn: addPositionOrder.OrderSn,
MainId: addPositionOrder.MainId,
Pid: addPositionOrder.Pid,
Price: utility.StrToDecimal(addPositionOrder.Price),
ApiId: addPositionOrder.ApiId,
Symbol: addPositionOrder.Symbol,
Side: addPositionOrder.Site,
SymbolType: addPositionOrder.SymbolType,
if err := db.Model(&models.LinePreOrderExt{}).Where("id =?", nextOrder.Id).First(&nextExt).Error; err != nil {
logger.Errorf("获取下一个单失败 err:%v", err)
}
addVal, err := sonic.MarshalString(addPositionData)
num := totalNum
//移除缓存
key := fmt.Sprintf(rediskey.FuturesReduceList, global.EXCHANGE_BINANCE)
vals, _ := helper.DefaultRedis.GetAllList(key)
item := ReduceListItem{}
if err != nil {
logger.Errorf("handleMainReduceFilled 序列化加仓单失败,订单号:%s err:%v", preOrder.OrderSn, err)
return
for _, val := range vals {
sonic.Unmarshal([]byte(val), &item)
if item.MainId == mainId {
if _, err := helper.DefaultRedis.LRem(key, val); err != nil {
logger.Errorf("减仓单 redis删除失败 main_id:%v err:%v", mainId, err)
}
}
}
if err := helper.DefaultRedis.RPushList(keyFutAddpositionKey, addVal); err != nil {
logger.Errorf("handleMainReduceFilled 添加加仓单失败,订单号:%s err:%v", preOrder.OrderSn, err)
//
if nextExt.AddPositionVal.Cmp(decimal.Zero) > 0 && nextExt.AddPositionVal.Cmp(decimal.Zero) < 100 {
// 计算减仓数量
num = totalNum.Mul(nextExt.AddPositionVal.Div(decimal.NewFromInt(100))).Truncate(int32(tradeSet.AmountDigit))
nextOrder.Num = num.String()
}
processFutReduceOrder(nextOrder, utility.StrToDecimal(nextOrder.Price).Truncate(int32(tradeSet.PriceDigit)), num)
}
// 获取合约可用数量
@ -407,6 +423,7 @@ func removeFutLossAndAddPosition(mainId int, orderSn string) {
func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder, extOrderId int, first bool) {
// 获取交易对配置和API信息
tradeSet, err := GetTradeSet(preOrder.Symbol, 1)
mainId := preOrder.Id
if err != nil || tradeSet.Coin == "" {
logger.Errorf("获取交易对配置失败, 回调订单号:%s, 错误信息: %v", preOrder.OrderSn, err)
return
@ -418,6 +435,10 @@ func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder, extOrd
return
}
if preOrder.MainId > 0 {
mainId = preOrder.MainId
}
// 处理主单加仓
if preOrder.OrderCategory == 3 {
if err := handleMainOrderAddPosition(db, preOrder); err != nil {
@ -430,6 +451,39 @@ func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder, extOrd
logger.Errorf("取消主单相关订单失败, 订单号:%s, 错误信息: %v", preOrder.OrderSn, err)
return
}
//加仓待触发
addPositionOrders := make([]DbModels.LinePreOrder, 0)
if err := db.Model(&DbModels.LinePreOrder{}).Where("main_id =? AND order_category=3 AND order_type=0 AND status=0", preOrder.Id).Order("rate asc").Find(&addPositionOrders).Error; err != nil {
logger.Errorf("handleMainReduceFilled 获取加仓单失败,订单号:%s err:%v", preOrder.OrderSn, err)
}
keyFutAddpositionKey := fmt.Sprintf(rediskey.FuturesAddPositionList, global.EXCHANGE_BINANCE)
for _, addPositionOrder := range addPositionOrders {
addPositionData := AddPositionList{
Id: addPositionOrder.Id,
OrderSn: addPositionOrder.OrderSn,
MainId: addPositionOrder.MainId,
Pid: addPositionOrder.Pid,
Price: utility.StrToDecimal(addPositionOrder.Price),
ApiId: addPositionOrder.ApiId,
Symbol: addPositionOrder.Symbol,
Side: addPositionOrder.Site,
SymbolType: addPositionOrder.SymbolType,
}
addVal, err := sonic.MarshalString(addPositionData)
if err != nil {
logger.Errorf("handleMainReduceFilled 序列化加仓单失败,订单号:%s err:%v", preOrder.OrderSn, err)
return
}
if err := helper.DefaultRedis.RPushList(keyFutAddpositionKey, addVal); err != nil {
logger.Errorf("handleMainReduceFilled 添加加仓单失败,订单号:%s err:%v", preOrder.OrderSn, err)
}
}
}
// 获取止盈止损订单
@ -493,10 +547,12 @@ func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder, extOrd
}
processFutStopLossOrder(db, order, price, num)
case 4: // 减仓
processFutReduceOrder(order, price, num)
// case 4: // 减仓
// processFutReduceOrder(order, price, num)
}
}
nextFuturesReduceTrigger(db, mainId, num, tradeSet)
}
// 处理主单加仓