Browse Source

Merge branch 'fix/trade_position' of hongze/hongze_task_trial into master

xyxie 1 year ago
parent
commit
75594c11d8

+ 33 - 0
models/data_manage/trade_position_analysis.go

@@ -148,6 +148,12 @@ type UpdateDealValueChange struct {
 	ModifyTime time.Time //修改时间
 }
 
+type UpdateChangeVal struct {
+	Id         uint64
+	DealChange int
+	ModifyTime time.Time //修改时间
+}
+
 func MultiUpdatePositionTop(exchange string, updates []UpdateDealValueChange) (err error) {
 	o := orm.NewOrm()
 	p, err := o.Raw("UPDATE trade_position_" + exchange + "_top SET deal_value=?, deal_change=?, source_type=?, modify_time=? WHERE id = ?").Prepare()
@@ -264,3 +270,30 @@ func GetExchangeClassify(exchange string) (list []TradeClassifyName, err error)
 
 	return
 }
+
+// GetTradePositionTopCleanByExchangeDataTime 根据时间查询净多单和净空单的值
+func GetTradePositionTopCleanByExchangeDataTime(exchange string, startDate, endDate string) (list []*TradePositionTop, err error) {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM trade_position_" + exchange + "_top where data_time >= ? and data_time <= ? and deal_type in (3,4) ORDER BY classify_name, classify_type, deal_type, data_time, deal_value desc"
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&list)
+	return
+}
+
+// MultiUpdatePositionTopChangeVal 批量更新榜单里变化量的值
+func MultiUpdatePositionTopChangeVal(exchange string, updates []UpdateChangeVal) (err error) {
+	o := orm.NewOrm()
+	p, err := o.Raw("UPDATE trade_position_" + exchange + "_top SET deal_change=?, modify_time=? WHERE id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+	for _, v := range updates {
+		_, err = p.Exec(v.DealChange, v.ModifyTime, v.Id)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 72 - 0
services/data/trade_position_analysis.go

@@ -441,6 +441,12 @@ func DealYesterdayData(exchange, startDate string) (err error) {
 		if err != nil {
 			return
 		}
+
+		//T-1日重新生成净多单和净空单的榜单后,需要更新T日净多单和净空单榜单里的变化量
+		err = updateAnalysisCleanTopChangeVal(exchange, startDate, yesterdayStr)
+		if err != nil {
+			return
+		}
 	}
 
 	return
@@ -647,3 +653,69 @@ func getPrevTradeDataDate(date string, dates []string) string {
 	}
 	return dates[pre]
 }
+
+// updateAnalysisCleanTopChangeVal T-1日重新生成净多单和净空单的榜单后,需要更新T日净多单和净空单榜单里的变化量
+func updateAnalysisCleanTopChangeVal(exchange, startDate, yesterday string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("updateAnalysisCleanTopChangeVal err: " + err.Error())
+		}
+	}()
+
+	//查询T日的净多单和净空单榜单列表
+	//查询T-1日的净多单和净空单列表
+	//组装数据,计算T日与T-1日的变更值
+	//更新变更值
+	topList := make([]*data_manage.TradePositionTop, 0)      //T日和T+1日列表
+	todayTopList := make([]*data_manage.TradePositionTop, 0) //T日列表
+
+	yesterdayTopListMap := make(map[string]int) //净多单净空单持仓量map
+
+	// 查询T日和T-1日的净多单和净空单列表
+	topList, err = data_manage.GetTradePositionTopCleanByExchangeDataTime(exchange, yesterday, startDate)
+	if err != nil {
+		return
+	}
+	if len(topList) == 0 {
+		return
+	}
+	for _, v := range topList {
+		if v.DataTime == startDate {
+			todayTopList = append(todayTopList, v)
+		} else if v.DataTime == yesterday {
+			nameStr := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DataTime + "_" + v.DealShortName + "_" + strconv.Itoa(v.DealType)
+			yesterdayTopListMap[nameStr] = v.DealValue
+		}
+	}
+
+	if len(todayTopList) == 0 {
+		return
+	}
+	// 根据净多单/净空单数据, 比对上一个交易日的日期计算成交变化量, 并写入
+	now := time.Now()
+	updateList := make([]data_manage.UpdateChangeVal, 0)
+	for _, v := range todayTopList {
+		//T日值-T-1日值
+		yesterdayStr := v.ClassifyName + "_" + v.ClassifyType + "_" + yesterday + "_" + v.DealShortName + "_" + strconv.Itoa(v.DealType)
+		dealChange := 0
+		if c, ok := yesterdayTopListMap[yesterdayStr]; ok {
+			dealChange = v.DealValue - c
+		}
+		if dealChange != v.DealChange {
+			tmp := data_manage.UpdateChangeVal{
+				Id:         v.Id,
+				ModifyTime: now,
+				DealChange: dealChange,
+			}
+			updateList = append(updateList, tmp)
+		}
+	}
+
+	if len(updateList) > 0 {
+		err = data_manage.MultiUpdatePositionTopChangeVal(exchange, updateList)
+		if err != nil {
+			return
+		}
+	}
+	return
+}