2025-02-06 11:14:33 +08:00
|
|
|
|
package excservice
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"go-admin/models/futuresdto"
|
|
|
|
|
|
"go-admin/pkg/utility"
|
|
|
|
|
|
"go-admin/services/binanceservice"
|
|
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/bytedance/sonic"
|
|
|
|
|
|
log "github.com/go-admin-team/go-admin-core/logger"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
用户订单订阅处理
|
|
|
|
|
|
- @msg 消息内容
|
|
|
|
|
|
- @listenType 订阅类型 0-现货 1-合约
|
|
|
|
|
|
*/
|
2025-07-26 09:09:09 +08:00
|
|
|
|
func ReceiveListen(msg []byte, listenType int, apiKey string) (reconnect bool, err error) {
|
2025-02-06 11:14:33 +08:00
|
|
|
|
var dataMap map[string]interface{}
|
|
|
|
|
|
err = sonic.Unmarshal(msg, &dataMap)
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Error("接收ws 反序列化失败:", err)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
event, exits := dataMap["e"]
|
|
|
|
|
|
|
|
|
|
|
|
if !exits {
|
|
|
|
|
|
log.Error("不存在event")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch event {
|
|
|
|
|
|
//listenKey过期
|
|
|
|
|
|
case "listenKeyExpired":
|
|
|
|
|
|
log.Info("listenKey过期", string(msg))
|
|
|
|
|
|
return true, nil
|
|
|
|
|
|
|
|
|
|
|
|
//订单变更
|
|
|
|
|
|
case "ORDER_TRADE_UPDATE":
|
|
|
|
|
|
log.Info("ORDER_TRADE_UPDATE 推送:", string(msg))
|
|
|
|
|
|
|
|
|
|
|
|
//现货
|
|
|
|
|
|
if listenType == 0 {
|
|
|
|
|
|
var mapData map[string]interface{}
|
|
|
|
|
|
err = sonic.Unmarshal(msg, &mapData)
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Error("订单变更处理失败", err)
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
utility.SafeGo(func() {
|
2025-07-26 09:09:09 +08:00
|
|
|
|
binanceservice.ChangeSpotOrder(mapData, apiKey)
|
2025-02-06 11:14:33 +08:00
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
var data futuresdto.OrderTradeUpdate
|
|
|
|
|
|
err = sonic.Unmarshal(msg, &data)
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Error("订单变更处理失败", err)
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
utility.SafeGo(func() {
|
2025-07-26 09:09:09 +08:00
|
|
|
|
binanceservice.ChangeFutureOrder(data.OrderDetails, apiKey)
|
2025-02-06 11:14:33 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
//订单更新
|
|
|
|
|
|
case "executionReport":
|
|
|
|
|
|
log.Info("executionReport 推送:", string(msg))
|
|
|
|
|
|
|
|
|
|
|
|
if listenType == 0 { //现货
|
2025-07-26 09:09:09 +08:00
|
|
|
|
binanceservice.ChangeSpotOrder(dataMap, apiKey)
|
2025-02-06 11:14:33 +08:00
|
|
|
|
} else if listenType == 1 { //合约
|
2025-07-26 09:09:09 +08:00
|
|
|
|
binanceservice.ChangeFutureOrder(dataMap, apiKey)
|
2025-02-06 11:14:33 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
log.Error("executionReport 不支持的订阅类型", strconv.Itoa(listenType))
|
|
|
|
|
|
}
|
|
|
|
|
|
//杠杆倍数等账户配置 更新推送
|
|
|
|
|
|
case "ACCOUNT_CONFIG_UPDATE":
|
|
|
|
|
|
log.Info(string(msg))
|
|
|
|
|
|
//追加保证金
|
|
|
|
|
|
case "MARGIN_CALL":
|
|
|
|
|
|
log.Info(string(msg))
|
|
|
|
|
|
|
|
|
|
|
|
//条件订单(TP/SL)触发后拒绝更新推送
|
|
|
|
|
|
case "CONDITIONAL_ORDER_TRIGGER_REJECT":
|
|
|
|
|
|
or, exits := dataMap["or"].(string)
|
|
|
|
|
|
|
|
|
|
|
|
if exits {
|
|
|
|
|
|
var data futuresdto.OrderTriggerReject
|
|
|
|
|
|
|
|
|
|
|
|
sonic.UnmarshalString(or, &data)
|
|
|
|
|
|
|
|
|
|
|
|
if data.OrderNo > 0 {
|
|
|
|
|
|
log.Info("订单号【%v】止盈止损触发后被拒绝:%s", data.OrderNo, data.Reason)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case "eventStreamTerminated":
|
|
|
|
|
|
log.Info("账户数据流被终止 type:", getWsTypeName(listenType))
|
2025-07-26 09:09:09 +08:00
|
|
|
|
return true, nil
|
2025-02-06 11:14:33 +08:00
|
|
|
|
default:
|
|
|
|
|
|
log.Info("未知事件 内容:", string(msg))
|
|
|
|
|
|
log.Info("未知事件", event)
|
|
|
|
|
|
return false, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false, nil
|
|
|
|
|
|
}
|