This commit is contained in:
2025-02-20 15:13:30 +08:00
parent ade768c28a
commit f105b7fd61
4 changed files with 116 additions and 33 deletions

View File

@ -37,6 +37,8 @@ type LinePreOrder struct {
Child []LinePreOrder `json:"child" gorm:"-"`
ApiName string `json:"api_name" gorm:"->"`
ChildNum int64 `json:"child_num" gorm:"->"`
AddPositionStatus int `json:"add_position_status" gorm:"->"`
ReduceStatus int `json:"reduce_status" gorm:"->"`
// LinePreOrder 线上预埋单\
models.ModelTime
models.ControlBy

View File

@ -1312,15 +1312,20 @@ func (e *LinePreOrder) SpotClosePosition(position *dto.ClosePosition, errs *[]er
//查询已经开仓的现货交易对
var spotList []models.LinePreOrder
if position.Symbol == "" { //全平
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND status = 6 AND pid = 0 AND order_type = 0", position.ApiId).Find(&spotList)
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND symbol_type =1 AND status = 6 AND pid = 0 AND order_type = 0", position.ApiId).Find(&spotList)
} else {
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND symbol = ? AND status = 6 AND pid = 0 AND order_type = 0", position.ApiId, position.Symbol).Find(&spotList)
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND symbol_type =1 AND symbol = ? AND status = 6 AND pid = 0 AND order_type = 0", position.ApiId, position.Symbol).Find(&spotList)
}
if len(spotList) <= 0 {
*errs = append(*errs, errors.New(fmt.Sprintf("api_id:%d 没有可平仓的交易对", position.ApiId)))
}
api := binanceservice.SpotRestApi{}
if len(spotList) == 0 {
*errs = append(*errs, errors.New("无仓可平"))
return
}
for _, list := range spotList {
for _, balance := range balanceInfo.Balances {
suffix := utility.ReplaceSuffix(list.Symbol, list.QuoteSymbol, "")
@ -1406,9 +1411,9 @@ func (e *LinePreOrder) FutClosePosition(position *dto.ClosePosition, errs *[]err
//查询已经开仓的合约交易对
var futList []models.LinePreOrder
if position.Symbol == "" {
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND status = 6 AND order_type =0 AND main_id = 0", position.ApiId).Find(&futList)
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND status = 6 AND symbol_type =2 AND order_type =0 AND main_id = 0", position.ApiId).Find(&futList)
} else {
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND symbol = ? AND status = 6 AND order_type = 0 AND main_id = 0", position.ApiId, position.Symbol).Find(&futList)
e.Orm.Model(&models.LinePreOrder{}).Where("api_id = ? AND symbol = ? AND symbol_type =2 AND status = 6 AND order_type = 0 AND main_id = 0", position.ApiId, position.Symbol).Find(&futList)
}
if len(futList) <= 0 {
*errs = append(*errs, fmt.Errorf("api_id:%d 没有可平仓的交易对", position.ApiId))
@ -1417,6 +1422,11 @@ func (e *LinePreOrder) FutClosePosition(position *dto.ClosePosition, errs *[]err
api := binanceservice.FutRestApi{}
if len(futList) == 0 {
*errs = append(*errs, errors.New("无仓可平"))
return
}
for _, list := range futList {
risks, err := api.GetPositionV3(&apiUserInfo, list.Symbol)
if err != nil {

View File

@ -276,6 +276,16 @@ func getFuturesPositionNum(apiUserInfo DbModels.LineApiUser, preOrder *DbModels.
// 平仓单成交
func handleClosePosition(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
removeFutLossAndAddPosition(preOrder)
futApi := FutRestApi{}
apiUserInfo, _ := GetApiInfo(preOrder.ApiId)
if apiUserInfo.Id > 0 {
if err := futApi.CancelAllFutOrder(apiUserInfo, preOrder.Symbol); err != nil {
logger.Errorf("止盈单成功 取消其它订单失败 订单号:%s:", err)
}
}
ids := []int{preOrder.Pid, preOrder.MainId}
//主单止盈成交
if err := db.Model(&DbModels.LinePreOrder{}).Where("id IN ?", ids).Update("status", 9).Error; err != nil {
@ -286,6 +296,20 @@ func handleClosePosition(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
// 止损单成交
func handleStopLoss(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
removeFutLossAndAddPosition(preOrder)
spotApi := SpotRestApi{}
apiUserInfo, _ := GetApiInfo(preOrder.ApiId)
if apiUserInfo.Id > 0 {
req := CancelOpenOrdersReq{
Symbol: preOrder.Symbol,
ApiId: preOrder.ApiId,
}
if err := spotApi.CancelOpenOrders(db, req); err != nil {
logger.Errorf("止盈单成功 取消其它订单失败 订单号:%s:", err)
}
}
ids := []int{preOrder.Pid, preOrder.MainId}
//主单止损成交
if err := db.Model(&DbModels.LinePreOrder{}).Where("id IN ?", ids).Update("status", 9).Error; err != nil {
@ -297,6 +321,15 @@ func handleStopLoss(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
func handleTakeProfit(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
removeFutLossAndAddPosition(preOrder)
futApi := FutRestApi{}
apiUserInfo, _ := GetApiInfo(preOrder.ApiId)
if apiUserInfo.Id > 0 {
if err := futApi.CancelAllFutOrder(apiUserInfo, preOrder.Symbol); err != nil {
logger.Errorf("止盈单成功 取消其它订单失败 订单号:%s:", err)
}
}
ids := []int{preOrder.Pid, preOrder.MainId}
//主单止盈成交
if err := db.Model(&DbModels.LinePreOrder{}).Where("id IN ? AND order_type=0", ids).Update("status", 9).Error; err != nil {

View File

@ -136,6 +136,19 @@ func handleOrderByType(db *gorm.DB, preOrder *DbModels.LinePreOrder, orderStatus
if err := db.Model(&DbModels.LinePreOrder{}).Where("main_id =? AND status =0", preOrder.MainId).Update("status", 4).Error; err != nil {
logger.Errorf("主单止损回调 订单号:%s 修改主单状态失败:%v", preOrder.OrderSn, err)
}
spotApi := SpotRestApi{}
apiUserInfo, _ := GetApiInfo(preOrder.ApiId)
if apiUserInfo.Id > 0 {
req := CancelOpenOrdersReq{
Symbol: preOrder.Symbol,
ApiId: preOrder.ApiId,
}
if err := spotApi.CancelOpenOrders(db, req); err != nil {
logger.Errorf("止盈单成功 取消其它订单失败 订单号:%s:", err)
}
}
}
}
@ -361,16 +374,41 @@ func handleMainOrderClosePosition(db *gorm.DB, preOrder *DbModels.LinePreOrder)
return nil
})
}
removeSpotLossAndAddPosition(preOrder)
spotApi := SpotRestApi{}
apiUserInfo, _ := GetApiInfo(preOrder.ApiId)
if apiUserInfo.Id > 0 {
req := CancelOpenOrdersReq{
Symbol: preOrder.Symbol,
ApiId: preOrder.ApiId,
}
if err := spotApi.CancelOpenOrders(db, req); err != nil {
logger.Errorf("止盈单成功 取消其它订单失败 订单号:%s:", err)
}
}
}
// 止盈成交
func handleSpotTakeProfitFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
removeSpotLossAndAddPosition(preOrder)
spotApi := SpotRestApi{}
apiUserInfo, _ := GetApiInfo(preOrder.ApiId)
if apiUserInfo.Id > 0 {
req := CancelOpenOrdersReq{
Symbol: preOrder.Symbol,
ApiId: preOrder.ApiId,
}
if err := spotApi.CancelOpenOrders(db, req); err != nil {
logger.Errorf("止盈单成功 取消其它订单失败 订单号:%s:", err)
}
}
db.Transaction(func(tx *gorm.DB) error {
ids := []int{preOrder.Pid, preOrder.MainId}
if err := db.Model(&DbModels.LinePreOrder{}).Where("id IN ? AND status =6 AND order_type=0", ids).Update("status", 9).Error; err != nil {