This commit is contained in:
yanweidong
2026-01-28 23:09:16 +08:00
parent 59528e88b7
commit 303acaccb2
6 changed files with 98 additions and 13 deletions

View File

@@ -31,6 +31,17 @@ func GetIndustry() (industry []string) {
return
}
func GetArgs(code string) *models.StockArgs {
var args models.StockArgs
err := impl.DBService.Where("ts_code = ?", code).First(&args).Error
if err != nil {
return nil
}
return &args
}
func GetBasic(code string) *models.StockBasic {
var data StockData
impl.DBService.Where("ts_code = ?", code).First(&data.Basic)

View File

@@ -9,7 +9,7 @@ import (
)
var (
MinRoe = 0
MinRoe float64 = 0
)
type Roe struct {
@@ -26,20 +26,15 @@ func NewRoe() *Roe {
func (r *Roe) Run(code string) *types.RuleResult {
var data []models.StockDaily
impl.DBService.Where("ts_code = ?", code).Order("trade_date desc").Limit(LastDay).Find(&data)
check := true
for _, row := range data {
if row.Close < MinPrice {
check = false
break
}
var data models.StockFinaIndicator
err := impl.DBService.Where("ts_code = ?", code).Order("period desc").Limit(1).First(&data).Error
if err != nil {
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: -1, Desc: "最近无财报无ROE值"}
}
if !check {
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: -1, Desc: fmt.Sprintf("最近%d天, 有价格低于%.2f", LastDay, MinPrice)}
if data.Roe < MinRoe {
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: -1, Desc: fmt.Sprintf("ROE=%.2f 低于%.2f", data.Roe, MinRoe)}
}
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: 1, Desc: fmt.Sprintf("最近%d天, 价格均高于%.2f", LastDay, MinPrice)}
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: 1, Desc: fmt.Sprintf("ROE=%.2f 高于%.2f", data.Roe, MinRoe)}
}

View File

@@ -1 +1,69 @@
package rule
import (
"encoding/json"
"fmt"
"git.apinb.com/quant/gostock/internal/impl"
"git.apinb.com/quant/gostock/internal/logic/types"
"git.apinb.com/quant/gostock/internal/models"
talib "github.com/markcheno/go-talib"
)
type Rsi struct {
Key string
Name string
Conf *StockArgConf
Args *models.StockArgs
}
type StockArgConf struct {
BestByDrawdown string `json:"best_by_drawdown"`
BestByProfit string `json:"best_by_profit"`
BestByReturn string `json:"best_by_return"`
BestBySharpe string `json:"best_by_sharpe"`
BestByWinRate string `json:"best_by_win_rate"`
}
func NewRsi(args *models.StockArgs) *Rsi {
var conf StockArgConf
err := json.Unmarshal([]byte(args.Config), &conf)
if err != nil {
return &Rsi{
Key: "Rsi",
Name: "RSI指标",
Conf: nil,
Args: args,
}
}
return &Rsi{
Key: "Rsi",
Name: "RSI指标",
Conf: &conf,
Args: args,
}
}
func (r *Rsi) Run(code string) *types.RuleResult {
if r.Conf == nil {
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: -1, Desc: "参数错误!"}
}
if r.Conf.BestByProfit != "rsi" {
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: -1, Desc: "BestByProfit!=RSI,BestByProfit=" + r.Conf.BestByProfit}
}
var close []float64
impl.DBService.Model(models.StockDaily{}).Where("ts_code = ?", code).Order("trade_date desc").Limit(r.Args.RsiPeriod*4).Pluck("close", &close)
if len(close) < r.Args.RsiPeriod {
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: -1, Desc: "数据不足"}
}
rsiResult := talib.Rsi(close, r.Args.RsiPeriod)
lastRsi := rsiResult[len(rsiResult)-1]
if lastRsi > float64(r.Args.RsiOversold) {
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: -1, Desc: fmt.Sprintf("RSI=%.2f 高于%d", lastRsi, r.Args.RsiOversold)}
}
return &types.RuleResult{Key: r.Key, Name: r.Name, Score: 1, Desc: fmt.Sprintf("RSI=%.2f 低于%d", lastRsi, r.Args.RsiOversold)}
}