This commit is contained in:
2026-02-25 11:04:03 +08:00
parent 24fe2a97cf
commit 13cb1ed479
8 changed files with 118 additions and 92 deletions

View File

@@ -22,6 +22,14 @@ type StockArgConf struct {
BestByWinRate string `json:"best_by_win_rate"`
}
type RsiResult struct {
Score int
Oversold int
Prve float64
Last float64
Desc string
}
func GetArgConfig(code string) (*models.StockArgs, *StockArgConf, error) {
var args models.StockArgs
err := impl.DBService.Where("ts_code = ?", code).First(&args).Error
@@ -38,32 +46,24 @@ func GetArgConfig(code string) (*models.StockArgs, *StockArgConf, error) {
return &args, &conf, nil
}
func (r *IndicatorFactory) RunRsi() {
args, conf, err := GetArgConfig(r.Model.Code)
func RunRsi(code string) *RsiResult {
args, conf, err := GetArgConfig(code)
if err != nil {
r.Model.ScoreRsi = -1
r.Model.AddDesc("RSI参数错误")
return
return &RsiResult{Score: -1, Desc: "RSI参数错误"}
}
if args.RsiOversold == 0 {
r.Model.ScoreRsi = -1
r.Model.AddDesc("RSI RsiOversold=0,参数错误!")
return
return &RsiResult{Score: -1, Desc: "RSI Oversold=0,参数错误!"}
}
if conf.BestByProfit != "rsi" {
r.Model.ScoreRsi = -1
r.Model.AddDesc("BestByProfit不是RSI")
return
return &RsiResult{Score: -1, Desc: "BestByProfit不是RSI"}
}
var close []float64
impl.DBService.Model(models.StockDaily{}).Where("ts_code = ?", r.Model.Code).Order("trade_date desc").Limit(args.RsiPeriod*4).Pluck("close", &close)
impl.DBService.Model(models.StockDaily{}).Where("ts_code = ?", code).Order("trade_date desc").Limit(args.RsiPeriod*4).Pluck("close", &close)
if len(close) < args.RsiPeriod {
r.Model.ScoreRsi = -1
r.Model.AddDesc("数据不足")
return
return &RsiResult{Score: -1, Desc: "数据不足"}
}
newCloses := ReverseSlice(close)
@@ -72,46 +72,46 @@ func (r *IndicatorFactory) RunRsi() {
rsiResult := talib.Rsi(newCloses, args.RsiPeriod)
prveRsi := utils.FloatRound(rsiResult[len(rsiResult)-2], 2)
lastRsi := utils.FloatRound(rsiResult[len(rsiResult)-1], 2)
r.Model.ValRsiLast = lastRsi
r.Model.ValRsiPrve = prveRsi
r.Model.ValRsiOversold = args.RsiOversold
r := &RsiResult{Oversold: args.RsiOversold, Prve: prveRsi, Last: lastRsi}
prveRsiInt := int(prveRsi)
lastRsiInt := int(lastRsi)
if lastRsiInt == 0 {
r.Model.ScoreRsi = -1
r.Model.AddDesc("RSI lastRsiInt=0,计算错误!")
return
r.Score = -1
r.Desc = "RSI lastRsiInt=0,计算错误!"
return r
}
// 跌破RSI下轨
if lastRsiInt > args.RsiOversold {
if CheckLowest(close, lastRsiInt, 14) {
r.Model.ScoreRsi = 1
r.Model.AddDesc(fmt.Sprintf("RSI=%d 跌破下轨,14日最低", lastRsiInt))
return
r.Score = 1
r.Desc = fmt.Sprintf("RSI=%d 跌破下轨,14日最低", lastRsiInt)
return r
}
if CheckLowest(close, lastRsiInt, 20) {
r.Model.ScoreRsi = 1
r.Model.AddDesc(fmt.Sprintf("RSI=%d 跌破下轨,20日最低", lastRsiInt))
return
r.Score = 1
r.Desc = fmt.Sprintf("RSI=%d 跌破下轨,20日最低", lastRsiInt)
return r
}
r.Model.ScoreRsi = -1
r.Model.AddDesc(fmt.Sprintf("RSI=%d 高于Oversold%d", lastRsiInt, args.RsiOversold))
return
r.Score = -1
r.Desc = fmt.Sprintf("RSI=%d 高于Oversold%d", lastRsiInt, args.RsiOversold)
return r
}
// RSI跌破下轨后呈上涨趋势
if lastRsiInt < prveRsiInt {
r.Model.ScoreRsi = -1
r.Model.AddDesc(fmt.Sprintf("Rsi=%d prveRsi=%d,突破下轨,持续下跌", lastRsiInt, prveRsiInt))
return
r.Score = -1
r.Desc = fmt.Sprintf("Rsi=%d prveRsi=%d,突破下轨,持续下跌", lastRsiInt, prveRsiInt)
return r
} else if lastRsiInt == prveRsiInt {
r.Model.ScoreRsi = 1
r.Model.AddDesc(fmt.Sprintf("Rsi=%d prveRsi=%d,突破下轨,与前一交易日无太大波动", lastRsiInt, prveRsiInt))
return
r.Score = 1
r.Desc = fmt.Sprintf("Rsi=%d prveRsi=%d,突破下轨,与前一交易日无太大波动", lastRsiInt, prveRsiInt)
return r
}
r.Model.ScoreRsi = 2
r.Model.AddDesc(fmt.Sprintf("Rsi=%d prveRsi=%d,突破下轨后呈上涨趋势", lastRsiInt, prveRsiInt))
return
r.Score = 1
r.Desc = fmt.Sprintf("Rsi=%d prveRsi=%d,突破下轨后呈上涨趋势", lastRsiInt, prveRsiInt)
return r
}