This commit is contained in:
2025-02-06 11:14:33 +08:00
commit 07847a2d9e
535 changed files with 65131 additions and 0 deletions

View File

@ -0,0 +1,77 @@
package serverinit
import (
"go-admin/config"
"go-admin/models"
"go-admin/pkg/httputils"
"go-admin/services/binanceservice"
"go-admin/services/futureservice"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/robfig/cron/v3"
)
func FuturesInit() error {
httputils.InitProxy(config.ExtConfig.ProxyUrl)
//FutFundingRate()
log.Info("初始化交易对-开始")
data := make(map[string]models.TradeSet, 0)
err := binanceservice.GetAndReloadSymbols(&data)
if err != nil {
return err
}
log.Info("初始化交易对-结束")
log.Info("初始化24h行情-开始")
_, err = binanceservice.InitSymbolsTicker24h(&data)
if err != nil {
return err
}
log.Info("初始化24h行情-结束")
log.Info("订阅合约-开始")
go futureservice.StartBinanceProWs("normal")
//定时任务
RunJobs()
return nil
}
/*
缓存合约资金费率
*/
func FutFundingRate() error {
log.Info("初始化 合约-费率 开始")
_, err := binanceservice.GetPremiumIndex()
if err != nil {
log.Error("初始化 合约-费率 失败:", err)
return err
}
log.Info("初始化 合约-费率 成功")
return nil
}
// 定义任务
func RunJobs() {
cronJob := cron.New()
//添加任务
//_, err := cronJob.AddFunc("@every 1h", func() {
// FutFundingRate()
//})
//
//if err != nil {
// fmt.Println("添加定时获取资金费率任务失败")
//} else {
// fmt.Println("添加定时获取资金费率任务成功")
//}
//启动
cronJob.Start()
}

View File

@ -0,0 +1,30 @@
package serverinit
import (
"go-admin/models"
"go-admin/pkg/utility"
"go-admin/services/binanceservice"
"go-admin/services/spotservice"
"os"
)
/*
初始化-币安现货交易对24h行情
*/
func SpotCurrencyInit() (map[string]models.TradeSet, []string) {
result, symbols, err := binanceservice.GetSpotSymbols()
if err != nil {
os.Exit(-1)
}
return result, symbols
}
/*
初始化现货订阅
- @workType 工作类型 normal-正常任务trigger-主动触发
*/
func SpotSubscribeInit(workType string) {
utility.SafeGoParam(spotservice.StartBinanceProWs, workType)
}

View File

@ -0,0 +1,134 @@
package serverinit
import (
"fmt"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/common/const/rediskey"
"go-admin/common/helper"
"go-admin/config"
"go-admin/pkg/httputils"
"go-admin/services/binanceservice"
"go-admin/services/futureservice"
"go-admin/services/scriptservice"
"os"
"github.com/bytedance/sonic"
"github.com/go-admin-team/go-admin-core/logger"
log "github.com/go-admin-team/go-admin-core/logger"
"github.com/go-admin-team/go-admin-core/sdk"
"github.com/robfig/cron/v3"
"gorm.io/gorm"
)
// 业务初始化
func BusinessInit(db *gorm.DB) {
httputils.InitProxy(config.ExtConfig.ProxyUrl)
if err := loadApiUser(db); err != nil { //加载api用户
os.Exit(-1)
}
//初始化订单配置
binanceservice.ResetSystemSetting(db)
//币安 现货交易对
SpotCurrencyInit()
//币安 合约交易对
FuturesInit()
//第一次初始化交易对价格
spotApi := binanceservice.SpotRestApi{}
futApi := binanceservice.FutRestApi{}
spotApi.Ticker()
futApi.Ticker()
//现货 订阅
SpotSubscribeInit("normal")
//合约订阅
futureservice.StartBinanceProWs("normal")
//定时任务
RunSpotJobs(db)
}
// 开启现货ws监听
func SpotWsInit() {
//启动websocket服务
//go func() {
// err := wsservice.StartServer(":3333")
// if err != nil {
// log.Info("wsservice.StartServer", zap.Error(err))
//
// _, cancel := context.WithTimeout(context.Background(), 5*time.Second)
// cancel()
// }
//}()
}
// 定义任务
func RunSpotJobs(db *gorm.DB) {
cronJob := cron.New()
//添加任务 同步交易对行情
// spotApi := spotservice.SpotRestApi{}
// futApi := futureservice.FutRestApi{}
// _, err := cronJob.AddFunc("@every 10s", func() {
// //BuySellOrderNew(db)
// spotApi.Ticker()
// futApi.Ticker()
// })
// if err != nil {
// return
// }
//定时执行脚本任务
_, err := cronJob.AddFunc("@every 3s", func() {
order := scriptservice.PreOrder{}
order.AddOrder(db)
})
if err != nil {
return
}
//启动
cronJob.Start()
}
/*
加载api user
*/
func loadApiUser(db *gorm.DB) error {
users := make([]models.LineApiUser, 0)
if err := db.Model(&models.LineApiUser{}).Where("open_status =1").Find(&users).Error; err != nil {
log.Error("loadApiUser", err)
return err
}
for _, user := range users {
key := fmt.Sprintf(rediskey.API_USER, user.Id)
val, _ := sonic.MarshalString(&user)
if val != "" {
if err := helper.DefaultRedis.SetString(key, val); err != nil {
log.Error("loadApiUser 保存redis", err)
}
}
}
groups := make([]models.LineApiGroup, 0)
if err := db.Model(&models.LineApiGroup{}).Find(&groups).Error; err != nil {
log.Error("loadApiGroup", err)
return err
}
apiGroupService := service.LineApiGroup{}
apiGroupService.Log = logger.NewHelper(sdk.Runtime.GetLogger()).WithFields(map[string]interface{}{})
for _, group := range groups {
service.SetApiGroupCache(group)
}
return nil
}

View File

@ -0,0 +1,15 @@
package serverinit
import (
"go-admin/config"
"go-admin/pkg/httputils"
"go-admin/services/futureservice"
)
func ClosePositionInit() {
httputils.InitProxy(config.ExtConfig.ProxyUrl)
//现货 订阅
SpotSubscribeInit("trigger")
//合约订阅
futureservice.StartBinanceProWs("trigger")
}

View File

@ -0,0 +1,85 @@
package serverinit
import (
"context"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/common/const/rediskey"
"go-admin/common/helper"
"go-admin/pkg/utility"
"go-admin/services/excservice"
"os"
"time"
"github.com/bytedance/sonic"
log "github.com/go-admin-team/go-admin-core/logger"
"gorm.io/gorm"
)
// 初始化用户订阅ws连接
func UserSubscribeInit(orm *gorm.DB, ctx context.Context) {
var list []models.LineApiUser
err := orm.Model(&models.LineApiUser{}).Where("open_status=1 ").Find(&list).Error
if err != nil {
log.Error("获取用户api失败", err)
os.Exit(1)
}
for _, item := range list {
service.OpenUserBinanceWebsocket(item)
}
utility.SafeGo(func() {
ticker := time.NewTicker(time.Second * 5)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
log.Info("ctx.Done() 被触发,原因:", ctx.Err()) // 打印上下文错误信息
return
case <-ticker.C:
deleteKeys, _ := helper.DefaultRedis.GetAllList(rediskey.ApiUserDeleteList)
activeApis, _ := helper.DefaultRedis.GetAllList(rediskey.ApiUserActiveList)
//移除连接
for _, item := range deleteKeys {
if wm, ok := excservice.SpotSockets[item]; ok {
wm.Stop()
delete(excservice.FutureSockets, item)
}
if wm, ok := excservice.SpotSockets[item]; ok {
wm.Stop()
delete(excservice.SpotSockets, item)
}
if _, err := helper.DefaultRedis.LRem(rediskey.ApiUserDeleteList, item); err != nil {
log.Error("移除 待关闭websocket 失败:", err)
}
}
//连接websocket
var apiUser models.LineApiUser
for _, item := range activeApis {
if item == "" {
continue
}
sonic.Unmarshal([]byte(item), &apiUser)
if apiUser.Id > 0 {
service.OpenUserBinanceWebsocket(apiUser)
if _, err := helper.DefaultRedis.LRem(rediskey.ApiUserActiveList, item); err != nil {
log.Error("删除 待触发的apiUser失败", err)
}
}
}
}
}
})
}