Files
exchange_go/services/excservice/binancereceive.go
2025-07-26 09:09:09 +08:00

113 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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-合约
*/
func ReceiveListen(msg []byte, listenType int, apiKey string) (reconnect bool, err error) {
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() {
binanceservice.ChangeSpotOrder(mapData, apiKey)
})
} else {
var data futuresdto.OrderTradeUpdate
err = sonic.Unmarshal(msg, &data)
if err != nil {
log.Error("订单变更处理失败", err)
break
}
utility.SafeGo(func() {
binanceservice.ChangeFutureOrder(data.OrderDetails, apiKey)
})
}
//订单更新
case "executionReport":
log.Info("executionReport 推送:", string(msg))
if listenType == 0 { //现货
binanceservice.ChangeSpotOrder(dataMap, apiKey)
} else if listenType == 1 { //合约
binanceservice.ChangeFutureOrder(dataMap, apiKey)
} 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))
return true, nil
default:
log.Info("未知事件 内容:", string(msg))
log.Info("未知事件", event)
return false, nil
}
return false, nil
}