This commit is contained in:
2025-02-14 09:43:49 +08:00
parent 97037adbbb
commit 8fbfcbf285
19 changed files with 755 additions and 288 deletions

View File

@ -4,7 +4,6 @@ import (
"errors"
"fmt"
DbModels "go-admin/app/admin/models"
"go-admin/app/admin/service/dto"
"go-admin/common/const/rediskey"
commondto "go-admin/common/dto"
"go-admin/common/global"
@ -14,6 +13,7 @@ import (
"go-admin/pkg/httputils"
"go-admin/pkg/utility"
"strings"
"time"
"github.com/shopspring/decimal"
"gorm.io/gorm"
@ -34,7 +34,7 @@ var ErrorMaps = map[float64]string{
-1111: "金额设置错误。精度错误",
-1021: "请求的时间戳在recvWindow之外",
-2011: "该交易对没有订单",
-2010: "账户余额不足",
// -2010: "账户余额不足",
}
type SpotRestApi struct {
@ -174,6 +174,36 @@ func (e SpotRestApi) Ticker() {
helper.DefaultRedis.SetString(rediskey.SpotSymbolTicker, string(mapData))
}
// 循环下单
func (e SpotRestApi) OrderPlaceLoop(db *gorm.DB, params OrderPlacementService, retryCount int) error {
var err error
err = e.OrderPlace(db, params)
if err != nil {
//数量不正确
if strings.Contains(err.Error(), "LOT_SIZE") {
return err
}
for x := 1; x <= retryCount; x++ {
err = e.OrderPlace(db, params)
if err == nil || strings.Contains(err.Error(), "LOT_SIZE") {
break
}
// if strings.Contains(err.Error(), "余额不足") {
// apiUserInfo, _ := GetApiInfo(params.ApiId)
// tradeset, _ := GetTradeSet(params.Symbol, 0)
// num, _ := getSpotPositionNum(apiUserInfo, &DbModels.LinePreOrder{Symbol: params.Symbol, QuoteSymbol: "USDT", OrderSn: params.NewClientOrderId}, tradeset)
// log.Info(" 循环下单 余额:%v", num)
// }
time.Sleep(500 * time.Millisecond)
}
}
return err
}
// OrderPlace 现货下单
func (e SpotRestApi) OrderPlace(orm *gorm.DB, params OrderPlacementService) error {
if orm == nil {
@ -476,15 +506,26 @@ func GetApiGroups() []commondto.ApiGroupDto {
// GetSpotSymbolLastPrice 获取现货交易对最新价格
func (e SpotRestApi) GetSpotSymbolLastPrice(targetSymbol string) (lastPrice decimal.Decimal) {
tickerSymbol := helper.DefaultRedis.Get(rediskey.SpotSymbolTicker).Val()
tickerSymbolMaps := make([]dto.Ticker, 0)
sonic.Unmarshal([]byte(tickerSymbol), &tickerSymbolMaps)
//key := fmt.Sprintf("%s:%s", global.TICKER_SPOT, targetSymbol)
//tradeSet, _ := helper.GetObjString[models.TradeSet](helper.DefaultRedis, key)
for _, symbolMap := range tickerSymbolMaps {
if symbolMap.Symbol == strings.ToUpper(targetSymbol) {
lastPrice = utility.StringToDecimal(symbolMap.Price)
key := fmt.Sprintf(global.TICKER_SPOT, global.EXCHANGE_BINANCE, targetSymbol)
ticker, _ := helper.DefaultRedis.GetString(key)
if ticker != "" {
tradeSet := models.TradeSet{}
sonic.Unmarshal([]byte(ticker), &tradeSet)
if tradeSet.LastPrice != "" {
lastPrice = utility.StrToDecimal(tradeSet.LastPrice).Truncate(int32(tradeSet.PriceDigit))
}
}
// tickerSymbol := helper.DefaultRedis.Get(rediskey.SpotSymbolTicker).Val()
// tickerSymbolMaps := make([]dto.Ticker, 0)
// sonic.Unmarshal([]byte(tickerSymbol), &tickerSymbolMaps)
// //key := fmt.Sprintf("%s:%s", global.TICKER_SPOT, targetSymbol)
// //tradeSet, _ := helper.GetObjString[models.TradeSet](helper.DefaultRedis, key)
// for _, symbolMap := range tickerSymbolMaps {
// if symbolMap.Symbol == strings.ToUpper(targetSymbol) {
// lastPrice = utility.StringToDecimal(symbolMap.Price)
// }
// }
return lastPrice
}