拆分加仓、减仓
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
||||
// 处理主单加仓
|
||||
|
||||
Reference in New Issue
Block a user