Explorar el Código

fix:持仓分析优化

Roc hace 1 año
padre
commit
54a7a0c447

+ 26 - 6
models/tables/trade_analysis/trade_analysis.go

@@ -83,6 +83,7 @@ type TradeClassifyNameListItemItem struct {
 type TradeClassifyName struct {
 	ClassifyName string //分类名称
 	ClassifyType string //分类名称下的类型
+	LatestDate   string //分类下最晚日期
 }
 
 func GetExchangeClassify(exchange string) (list []TradeClassifyName, err error) {
@@ -126,6 +127,7 @@ type GetPositionTopResp struct {
 	CleanBuyList  GetPositionTopList `json:"clean_buy_list"`  //净多单列表
 	CleanSoldList GetPositionTopList `json:"clean_sold_list"` //净空单列表
 	DataTime      string             `json:"data_time"`       //最新日期或者请求日期
+	LastDataTime  string             `json:"last_data_time" description:"最新日期"`
 }
 
 type GetPositionTopList struct {
@@ -154,18 +156,36 @@ func GetTradePositionTop(exchange string, classifyName, classifyType, dataTime s
 	return
 }
 
-func GetTradeTopLastDataTime(exchange string, classifyName, classifyType string) (item *TradePositionTop, err error) {
-	tableName := "trade_position_" + exchange + "_top"
+// BaseFromTradeClassify 交易所分类表
+type BaseFromTradeClassify struct {
+	Id           uint64    `orm:"column(id);pk"`
+	ClassifyName string    //分类名称
+	ClassifyType string    //分类名称下的类型
+	Exchange     string    //交易所
+	LatestDate   time.Time //数据最近的日期
+	CreateTime   time.Time //插入时间
+	ModifyTime   time.Time //修改时间
+}
+
+// GetAllBaseFromTradeClassify 获取所有的交易所分类列表
+func GetAllBaseFromTradeClassify() (list []*BaseFromTradeClassify, err error) {
+	err = global.MYSQL["data"].Table("base_from_trade_classify").Find(&list).Error
+
+	return
+}
+
+func GetTradeTopLastDataTime(exchange string, classifyName, classifyType string) (item *BaseFromTradeClassify, err error) {
+	tableName := "base_from_trade_classify"
 	if exchange == "zhengzhou" {
 		err = global.MYSQL["data"].
 			Table(tableName).
-			Where("classify_name=? ", classifyType).
-			Order("data_time desc").First(&item).Error
+			Where("exchange = ? AND classify_name=? ", exchange, classifyType).
+			Order("latest_date desc").First(&item).Error
 	} else {
 		err = global.MYSQL["data"].
 			Table(tableName).
-			Where("classify_name=? and classify_type=?", classifyName, classifyType).
-			Order("data_time desc").First(&item).Error
+			Where("exchange = ? AND classify_name=? and classify_type=?", exchange, classifyName, classifyType).
+			Order("latest_date desc").First(&item).Error
 	}
 
 	return

+ 58 - 38
services/trade_analysis/trade_analysis.go

@@ -6,7 +6,6 @@ import (
 	"hongze/hongze_yb/utils"
 	"sort"
 	"strings"
-	"sync"
 	"time"
 )
 
@@ -26,36 +25,45 @@ func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error
 		"cffex":     4,
 		"ine":       5,
 	}
-	//查询每个交易所的最新更新时间
-	//查询每个交易所下的classifyNameList
+
+	//查询所有交易所下的分类
+	classifyExchangeList, tmpErr := trade_analysis.GetAllBaseFromTradeClassify()
+	if tmpErr != nil {
+		err = tmpErr
+		errMsg = "查询交易所最新更新时间失败"
+		return
+	}
+
+	// 每个交易所的分类信息
 	classifyExchangeMap := make(map[string][]trade_analysis.TradeClassifyName)
-	timeMap := make(map[string]string)
-	i := 0
-	var wg sync.WaitGroup
-	for k := range exchanges {
-		wg.Add(1)
-		go func(k string, classifyExchangeMap map[string][]trade_analysis.TradeClassifyName) {
-			defer wg.Done()
-			nameList, tmpErr := trade_analysis.GetExchangeClassify(k)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			for _, n := range nameList {
-				classifyExchangeMap[k] = append(classifyExchangeMap[k], n)
-			}
+	// 每个交易所的最新更新时间
+	timeLastMap := make(map[string]time.Time)
+	for _, v := range classifyExchangeList {
+		tmpExchange := v.Exchange
 
-			dataTimeItem, tmpErr := trade_analysis.GetExchangeLastTime(k)
-			if tmpErr != nil {
-				err = tmpErr
-				errMsg = "查询交易所最新更新时间失败"
-				return
-			}
-			timeMap[k] = dataTimeItem.CreateTime.Format(utils.FormatDateTime)
+		// 分类
+		tmpList, ok := classifyExchangeMap[tmpExchange]
+		if !ok {
+			tmpList = make([]trade_analysis.TradeClassifyName, 0)
+		}
+		tmpList = append(tmpList, trade_analysis.TradeClassifyName{
+			ClassifyName: v.ClassifyName,
+			ClassifyType: v.ClassifyType,
+			LatestDate:   v.LatestDate.Format(utils.FormatDate),
+		})
+		classifyExchangeMap[v.Exchange] = tmpList
 
-		}(k, classifyExchangeMap)
+		// 时间
+		if tmpLastTime, ok2 := timeLastMap[tmpExchange]; !ok2 {
+			timeLastMap[tmpExchange] = v.ModifyTime
+		} else {
+			if v.ModifyTime.After(tmpLastTime) {
+				timeLastMap[tmpExchange] = v.ModifyTime
+			}
+		}
 	}
-	wg.Wait()
+
+	i := 0
 	currDate := time.Now().Format(utils.FormatDate)
 	for k, v := range exchanges {
 		tmp := trade_analysis.TradeClassifyNameList{
@@ -70,12 +78,16 @@ func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error
 			errMsg = "查询交易所分类信息失败"
 			return
 		}
-		tmp.DataTime, ok = timeMap[k]
-		if !ok {
+
+		// 查询交易所最新更新时间失败
+		if timeLast, ok := timeLastMap[k]; ok {
+			tmp.DataTime = timeLast.Format(utils.FormatDateTime)
+		} else {
 			err = fmt.Errorf("查询交易所最新更新时间失败")
 			errMsg = "查询交易所最新更新时间失败"
 			return
 		}
+
 		classifyMap := make(map[string][]trade_analysis.TradeClassifyNameListItemItem)
 		if len(nameList) > 0 {
 			if k == "zhengzhou" {
@@ -230,16 +242,20 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 		return
 	}
 	dataTimeStr := req.DataTime
-	var dataTime time.Time
+	var lastDataTime, dataTime time.Time
+
 	//查询最新的时间
+	lastItem, tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType)
+	if tmpErr != nil {
+		errMsg = "查询最新的榜单信息失败"
+		err = tmpErr
+		return
+	}
+	lastDataTime = lastItem.LatestDate
+
+	// 如果没有传入日期,那么就用最晚的的日期
 	if dataTimeStr == "" {
-		lastItem, tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType)
-		if tmpErr != nil {
-			errMsg = "查询最新的榜单信息失败"
-			err = tmpErr
-			return
-		}
-		dataTime = lastItem.DataTime
+		dataTime = lastDataTime
 	} else {
 		dataTime, err = time.ParseInLocation(utils.FormatDate, dataTimeStr, time.Local)
 		if err != nil {
@@ -247,6 +263,10 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 			return
 		}
 	}
+	dataTimeStr = dataTime.Format(utils.FormatDate)
+
+	ret.DataTime = dataTimeStr
+	ret.LastDataTime = lastDataTime.Format(utils.FormatDate)
 
 	//遇到周末则跳过当天
 	weekStr := dataTime.Weekday().String()
@@ -255,7 +275,6 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 		err = fmt.Errorf(errMsg)*/
 		return
 	}
-	dataTimeStr = dataTime.Format(utils.FormatDate)
 	classifyName := req.ClassifyName
 	classifyType := req.ClassifyType
 	if exchange == "zhengzhou" {
@@ -273,6 +292,7 @@ func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analy
 		classifyType = typeItem.ClassifyType
 
 	}
+
 	//查询当日榜单列表
 	dataList, tmpErr := trade_analysis.GetTradePositionTop(exchange, classifyName, classifyType, dataTimeStr)
 	if tmpErr != nil {