Explorar o código

指标期数位移-bug修改

gmy hai 5 meses
pai
achega
4838b5d81f

+ 4 - 3
models/edb_data_calculate_phase_shift.go

@@ -318,7 +318,7 @@ func refreshAllCalculatePhaseShift(to orm.TxOrmer, edbInfoId, source, subSource,
 
 				var newDate time.Time
 				if moveFrequency == "年" {
-					newDate = currentDate.AddDate(formulaInt, 0, 0)
+					newDate = currentDate.AddDate(moveNum, 0, 0)
 				} else {
 					newDate = currentDate.AddDate(0, 0, shiftDay)
 				}
@@ -333,14 +333,15 @@ func refreshAllCalculatePhaseShift(to orm.TxOrmer, edbInfoId, source, subSource,
 				newIndex := dataList[dataLen-periods]
 				resultMap[newIndex.DataTime] = currentIndex.Value
 			} else {
+				moveNum = formulaInt + 1 - (dataLen - i)
 				// 新数据须根据频度补充key
 				currentDate, _ := time.ParseInLocation(utils.FormatDate, dataList[dataLen-1].DataTime, time.Local)
 
-				shiftDay := CalculateIntervalDays(moveFrequency, formulaInt, currentDate, resultMap, moveType)
+				shiftDay := CalculateIntervalDays(moveFrequency, moveNum, currentDate, resultMap, moveType)
 
 				var newDate time.Time
 				if moveFrequency == "年" {
-					newDate = currentDate.AddDate(formulaInt, 0, 0)
+					newDate = currentDate.AddDate(-moveNum, 0, 0)
 				} else {
 					newDate = currentDate.AddDate(0, 0, -shiftDay)
 				}

+ 22 - 10
models/predict_edb_data_calculate_phase_shift.go

@@ -218,8 +218,6 @@ func refreshAllPredictCalculatePhaseShift(to orm.TxOrmer, edbInfoId, source, sub
 		return
 	}
 
-	latestDate, _ := time.ParseInLocation(utils.FormatDate, fromEdbInfo.LatestDate, time.Local)
-
 	var dateArr []string
 	dataMap := make(map[string]*EdbInfoSearchData)
 	for _, v := range dataList {
@@ -232,6 +230,7 @@ func refreshAllPredictCalculatePhaseShift(to orm.TxOrmer, edbInfoId, source, sub
 
 	resultMap := make(map[string]float64)
 	dataLen := len(dataList)
+	var moveNum int
 	for i := 0; i < dataLen; i++ {
 		// step_1 如果 领先/滞后 之后时间key存在,将该key为目标key,填充
 		currentIndex := dataList[i]
@@ -243,13 +242,20 @@ func refreshAllPredictCalculatePhaseShift(to orm.TxOrmer, edbInfoId, source, sub
 				newIndex := dataList[dataLen-periods-1]
 				resultMap[newIndex.DataTime] = currentIndex.Value
 			} else {
+				moveNum = formulaInt - i
+
 				// 新数据须根据频度补充key
-				currentDate, _ := time.ParseInLocation(utils.FormatDate, currentIndex.DataTime, time.Local)
+				currentDate, _ := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
+
+				shiftDay := CalculateIntervalDays(moveFrequency, moveNum, currentDate, resultMap, moveType)
 
-				shiftDay := CalculateIntervalDays(moveFrequency, formulaInt, currentDate, resultMap, moveType)
+				var newDate time.Time
+				if moveFrequency == "年" {
+					newDate = currentDate.AddDate(moveNum, 0, 0)
+				} else {
+					newDate = currentDate.AddDate(0, 0, shiftDay)
+				}
 
-				latestDateStr = latestDate.AddDate(0, 0, shiftDay).Format(utils.FormatDate)
-				newDate := currentDate.AddDate(0, 0, shiftDay)
 				format := newDate.Format(utils.FormatDate)
 				resultMap[format] = currentIndex.Value
 			}
@@ -260,13 +266,19 @@ func refreshAllPredictCalculatePhaseShift(to orm.TxOrmer, edbInfoId, source, sub
 				newIndex := dataList[dataLen-periods]
 				resultMap[newIndex.DataTime] = currentIndex.Value
 			} else {
+				moveNum = formulaInt + 1 - (dataLen - i)
 				// 新数据须根据频度补充key
-				currentDate, _ := time.ParseInLocation(utils.FormatDate, currentIndex.DataTime, time.Local)
+				currentDate, _ := time.ParseInLocation(utils.FormatDate, dataList[dataLen-1].DataTime, time.Local)
+
+				shiftDay := CalculateIntervalDays(moveFrequency, moveNum, currentDate, resultMap, moveType)
 
-				shiftDay := CalculateIntervalDays(moveFrequency, formulaInt, currentDate, resultMap, moveType)
+				var newDate time.Time
+				if moveFrequency == "年" {
+					newDate = currentDate.AddDate(-moveNum, 0, 0)
+				} else {
+					newDate = currentDate.AddDate(0, 0, -shiftDay)
+				}
 
-				latestDateStr = latestDate.AddDate(0, 0, -shiftDay).Format(utils.FormatDate)
-				newDate := currentDate.AddDate(0, 0, -shiftDay)
 				format := newDate.Format(utils.FormatDate)
 				resultMap[format] = currentIndex.Value
 			}

+ 13 - 13
utils/common.go

@@ -1502,24 +1502,24 @@ func CalculateTradingDays(baseDate time.Time, tradingDays int, resultMap map[str
 		moveDays = -tradingDays
 	}
 
-	baseDate = baseDate.AddDate(0, 0, moveDays)
-
-	/*format := baseDate.Format(FormatDate)
-
-	if _, isHoliday := resultMap[format]; isHoliday {
-		totalDays++
-		continue
-	}*/
+	daysMoved := 0 // 实际移动的工作日数
+	for daysMoved < tradingDays {
+		// 根据 moveType,决定是前进一天还是后退一天
+		if moveDays > 0 {
+			baseDate = baseDate.AddDate(0, 0, 1) // 向后移动一天
+		} else {
+			baseDate = baseDate.AddDate(0, 0, -1) // 向前移动一天
+		}
 
-	for {
+		// 如果当前日期不是周六或周日,则计入交易日
 		weekday := baseDate.Weekday()
 		if weekday != time.Saturday && weekday != time.Sunday {
-			break // 如果是工作日,退出循环
+			daysMoved++
 		}
-		baseDate = baseDate.AddDate(0, 0, 1) // 向前移动一天
 	}
-	subDays := baseDate.Sub(oldDate)
 
+	// 计算实际天数差(包含跳过周末后的移动天数)
+	subDays := baseDate.Sub(oldDate)
 	days := int(math.Abs(subDays.Hours() / 24))
 
 	return days
@@ -1537,7 +1537,7 @@ func CalculateEndOfMonth(baseDate time.Time, months, moveType int) int {
 	daysToAdd := 28 * (months + 2)
 	// 计算目标月的下个月月初
 	if moveType == 2 {
-		daysToAdd = -(daysToAdd - 28)
+		daysToAdd = -(daysToAdd - 56)
 	}
 	nextMonth := baseDate.AddDate(0, 0, daysToAdd)